sched.c

Go to the documentation of this file.
00001 
00006 #include <routix/system.h>
00007 #include <routix/segm.h>
00008 #include <routix/paging.h>
00009 #include <routix/kalloc.h>
00010 #include <routix/task.h>
00011 #include <routix/debug.h>
00012 #include <routix/kstdio.h>
00013 #include <error.h>
00014 #include <routix/syscalls.h>
00015 #include <sys/list.h>
00016 #include <string.h>
00017 #include <routix/signal.h>
00018 
00019 void idle_task(void);
00020 void tarea_init(void);      //Tarea INIT
00021 
00022 // Puntero a la lista enlazada de tareas
00023 task_struct_t *tareas_inicio=NULL;
00024 
00025 // Puntero a la tarea actual
00026 task_struct_t *actual=NULL;
00027 
00028 // Cantidad de tareas activas
00029 extern volatile int tareas_activas;
00030 
00031 
00032 task_struct_t *init_task, *pre_init_task;
00033 
00034 void start_scheduler(void)
00035 {
00036         /* Por ahora usamos la memoria fisica directamente, total esta mapeada
00037          * hasta que reubiquemos el codigo y datos de las tareas a una dirección
00038          * virtual particular */
00039         
00040         // Inicializo el tss con valores nulos
00041         inicializarTss(&tss, 0, 0, 0, 0, 0 );   
00042         
00043         // Tarea fundamental del sistema ! INIT_TASK corre cuando no hay nada para correr
00044         addr_t INIT_stack = kmalloc_page();
00045         
00046         
00047         init_task=init_new_task(DESC_CODE, DESC_DATA, (dword) &tarea_init, INIT_stack + 4096, 0x202, "init", 50);
00048         pre_init_task = init_task;
00049 
00050 
00051         init_task->pid = 1;
00052         // Init es padre e hijo (santisima trinidad)... para evitar problemas al hacer init->padre
00053         init_task->padre = init_task;
00054 //      LIST_INIT(init_task->zombie_header);
00055  
00056         // Aloco la estructura de señales de init y la incializo (cuidado !!! esto NO ANDA !!!!!!!)
00057 //      TASK_SIGNALS_ALLOC (init_task);
00058 //      TASK_SIGNALS_INIT (init_task);
00059  
00060         // Despertamos la nueva tarea, ya que recordemos init_new_task crea la nueva tarea en estado STOPPED
00061         despertar_task(init_task);
00062         
00063         // La tarea en ejecución será init_task
00064         actual = tareas_inicio;
00065  
00066 }
00067 
00068 
00069 int execve (char *, char **, char **);
00070 void tarea_init()
00071 {
00072         
00073   // Inicializamos la fat
00074         extern dev_fat_t dev_fat[1];            //Estructura para dispositivos con fs FAT
00075 
00076         dev_fat[0].boot_leido = FALSE;          
00077         dev_fat[0].fat_levantada = FALSE;
00078 
00079         
00080         if (execve("init.bin", NULL, NULL)==-1)
00081                 kpanic("No se pudo cargar init.bin");
00082 
00083         init_task = encontrar_proceso_por_pid(2);               // Init.bin
00084         tareas_inicio = init_task;
00085         sys_renice(2,1);
00086         
00087         _reschedule();
00088         while (1) {
00089                 kprintf("Esto no debe imprimirse ya que esta tarea no se schedulea");
00090         }
00091 /*      
00092         TASK_SIGNALS_ALLOC (init_task);
00093         TASK_SIGNALS_INIT (init_task);
00094         LIST_INIT (init_task->childs);
00095 
00096         pid_t pid;
00097         int value;
00098     kprintf("ejecutando INIT.....\n");
00099     if ( exec("shell.bin")!=OK )
00100                 perror("exec shell");
00101 
00102         for (value = 0; value<0xffff;value++);
00103 
00104     while(1) {
00105         do {
00106                 pid = sys_waitpid( -1 , &value, WNOHANG);
00107                         if (pid>0) 
00108                                 kprintf("INIT: la condicion de salida de %d es: %d\n", pid, value);
00109         }while(pid!=-1);        
00110                 _reschedule();
00111         }
00112 */
00113 }       
00114 
00115 
00116 /* Pasa los scan codes del buffer en crudo, a los ASCII con combinaciones de ALT, SHIFT y CTRL */
00117 extern void leer_buff_teclado (void);
00118 
00119 
00120 // Busca la próxima tarea activa
00121 void scheduler()
00122 {
00123         task_struct_t *tmp;
00124         
00125         leer_buff_teclado();
00126         
00127         if ( tareas_activas ) {
00128         
00129                 // Volvemos al principio
00130                 if (  (actual==NULL) || ((tmp = actual->proxima ) == NULL)  ) { tmp = tareas_inicio; }
00131         
00132                 // Buscamos una tarea para correr
00133                 while ( tmp->estado != TASK_RUNNING ) {
00134                         if ( (tmp = tmp->proxima) == NULL ) { tmp = tareas_inicio; }
00135                 }
00136                 actual = tmp;
00137                 // Buscar señales pendientes, y ejecutar handler
00138                 check_sigpending(actual, 1); 
00139         }
00140         
00141         else {
00142                 actual=NULL;
00143                 _sti();
00144                 while ( ! tareas_activas ) ;
00145                 _cli();
00146                 scheduler();
00147         }
00148 
00149 }
00150 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6