1 /*! \addtogroup Scheduler
3 Contiene la base del scheduler y la tarea Init
6 #include <routix/system.h>
7 #include <routix/segm.h>
8 #include <routix/paging.h>
9 #include <routix/kalloc.h>
10 #include <routix/task.h>
11 #include <routix/debug.h>
12 #include <routix/kstdio.h>
14 #include <routix/syscalls.h>
17 #include <routix/signal.h>
20 void tarea_init(void); //Tarea INIT
22 int TASK_STACK_SIZE
= 1;
24 // Puntero a la lista enlazada de tareas
25 task_struct_t
*tareas_inicio
=NULL
;
27 // Puntero a la tarea actual
28 task_struct_t
*actual
=NULL
;
30 // Cantidad de tareas activas
31 extern volatile int tareas_activas
;
34 task_struct_t
*init_task
, *pre_init_task
;
36 void start_scheduler(void)
38 /* Por ahora usamos la memoria fisica directamente, total esta mapeada
39 * hasta que reubiquemos el codigo y datos de las tareas a una dirección
40 * virtual particular */
42 // Inicializo el tss con valores nulos
43 inicializarTss(&tss
, 0, 0, 0, 0, 0 );
45 // Tarea fundamental del sistema ! INIT_TASK corre cuando no hay nada para correr
46 addr_t INIT_stack
= kmalloc_page();
49 init_task
=init_new_task(DESC_CODE
, DESC_DATA
, (dword
) &tarea_init
, INIT_stack
+ 4096, 0x202, "init", 50);
50 pre_init_task
= init_task
;
54 // Init es padre e hijo (santisima trinidad)... para evitar problemas al hacer init->padre
55 init_task
->padre
= init_task
;
56 // LIST_INIT(init_task->zombie_header);
58 // Aloco la estructura de señales de init y la incializo (cuidado !!! esto NO ANDA !!!!!!!)
59 // TASK_SIGNALS_ALLOC (init_task);
60 // TASK_SIGNALS_INIT (init_task);
62 // Despertamos la nueva tarea, ya que recordemos init_new_task crea la nueva tarea en estado STOPPED
63 despertar_task(init_task
);
65 // La tarea en ejecución será init_task
66 actual
= tareas_inicio
;
71 int execve (char *, char **, char **);
75 // Inicializamos la fat
76 extern dev_fat_t dev_fat
[1]; //Estructura para dispositivos con fs FAT
78 dev_fat
[0].boot_leido
= FALSE
;
79 dev_fat
[0].fat_levantada
= FALSE
;
82 if (execve("init.bin", NULL
, NULL
)==-1)
83 kpanic("No se pudo cargar init.bin");
86 init_task
= encontrar_proceso_por_pid(2); // Init.bin
87 tareas_inicio
= init_task
;
89 TASK_PID(init_task
) = 1;
93 kprintf("Esto no debe imprimirse ya que esta tarea no se schedulea");
99 /* Pasa los scan codes del buffer en crudo, a los ASCII con combinaciones de ALT, SHIFT y CTRL */
100 extern void leer_buff_teclado (void);
103 // Busca la próxima tarea activa
110 if ( tareas_activas
) {
112 // Volvemos al principio
113 if ( (actual
==NULL
) || ((tmp
= actual
->proxima
) == NULL
) ) { tmp
= tareas_inicio
; }
115 // Buscamos una tarea para correr
116 while ( tmp
->estado
!= TASK_RUNNING
) {
117 if ( (tmp
= tmp
->proxima
) == NULL
) { tmp
= tareas_inicio
; }
121 // Si esta seteada la variable de entorno signals en 1 no verificar señales
122 if (getvar("signals")!=1) {
123 // Buscar señales pendientes, y ejecutar handler
124 check_sigpending(actual
, 1);
131 while ( ! tareas_activas
) ;