1 /*! \addtogroup BootStrap
3 Núcleo de la inicialización del sistema. Una vez que termina de ejecutarse, el control del sistema lo toma la tarea init
6 #include "routix/system.h"
7 #include "routix/paging.h"
8 #include "routix/segm.h"
9 #include "routix/debug.h"
10 #include "routix/8259.h"
11 #include "routix/8254.h"
13 #include "routix/task.h"
14 #include "drivers/fat.h"
15 #include <routix/kalloc.h>
16 #include "routix/syscalls.h"
17 #include <routix/kstdio.h>
18 #include <fs/blockcache.h>
20 // Puntero a pagina de wrappers de usuario
22 void init_MM_base(void);
24 void init_all_memory (dword memoria
);
25 dword
contar_memoria (void);
27 void inicializarInterrupciones (void);
28 void start_scheduler (void);
29 void floppy_cache_init (void);
30 void entrada_de_inicio (void);
31 void init_time (void);
38 /* Deshabilitamos todas las interrupciones */
39 mascarasPics(0xff,0xff);
43 /* Seguimos la ejecución en la dirección virtual */
44 __asm__("aca: jmp aca+5+0xc0000000");
46 /* Acomodamos el stack pointer a su valor virtual
47 * 0x200000 es el TOP FISICO del STACK
48 * 0xd8000000 es el TOP VIRTUAL del STACK */
49 __asm__
__volatile__ ("movl $0x200000, %%eax\n\t" \
50 "subl %%esp, %%eax\n\t" \
51 "movl %%eax, %%esp\n\t" \
52 "movl $0xd8000000,%%eax\n\t" \
53 "subl %%esp, %%eax\n\t"
54 "movl %%eax, %%esp" : : : "eax" );
58 puts("Inicializando kernel....\n");
60 puts("Inicializando Controladores Programables de Interrupciones...\n");
61 inicializarPics(0x20,0x28);
63 puts("Kmalloc Inicializando...\n");
64 kprintf("Memoria fisica %d Megabytes\n",memoria
);
66 inicializacion_kmalloc(memoria
, KERNEL_END
);
67 puts("Kmalloc Inicializacion completa\n");
69 /* Mapea linealmente el resto de la memoria fisica (a partir de los 4Mb en adelante) */
70 init_all_memory(memoria
);
73 puts("Inicializando interrupciones\n");
74 inicializarInterrupciones();
76 puts("Inicializando 8254\n");
79 puts("Inicializando Rejoj\n");
82 // Inicializamos el wrapper de memoria
85 // Inicialización del cache de bloques
86 start_block_cache(memoria
);
88 // Ubicar un directorio de páginas para las tareas en modo kernel
89 USER_PDT
= kmalloc_page();
90 copy_page ((void *)USER_PDT
, (void *)KERNEL_PDT
);
91 unsigned long *puntero
= (unsigned long *)USER_PDT
;
93 // A los 2 primeros GB de memoria los pongo como Supervisor Only
94 for (i
=0 ; i
<PAGINA_SIZE
; i
++)
95 puntero
[i
] = puntero
[i
] & 0xfffffffb;
98 // Inicialización del scheduler
99 puts("Inicializando el scheduler\n");
103 extern dev_fat_t dev_fat[1]; //Estructura para dispositivos con fs FAT
104 dev_fat[0].boot_leido = FALSE;
105 dev_fat[0].fat_levantada = FALSE;
109 kprintf("Task Struct Size: %d\n", sizeof(task_struct_t
));
111 // Habilitamos solo teclado, timertick y floppy
116 // Inicializar variables USER-KERNEL (moemntaneas) definidas en sysmisc.c