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);
00021
00022
00023 task_struct_t *tareas_inicio=NULL;
00024
00025
00026 task_struct_t *actual=NULL;
00027
00028
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
00037
00038
00039
00040
00041 inicializarTss(&tss, 0, 0, 0, 0, 0 );
00042
00043
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
00053 init_task->padre = init_task;
00054
00055
00056
00057
00058
00059
00060
00061 despertar_task(init_task);
00062
00063
00064 actual = tareas_inicio;
00065
00066 }
00067
00068
00069 int execve (char *, char **, char **);
00070 void tarea_init()
00071 {
00072
00073
00074 extern dev_fat_t dev_fat[1];
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);
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
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 }
00114
00115
00116
00117 extern void leer_buff_teclado (void);
00118
00119
00120
00121 void scheduler()
00122 {
00123 task_struct_t *tmp;
00124
00125 leer_buff_teclado();
00126
00127 if ( tareas_activas ) {
00128
00129
00130 if ( (actual==NULL) || ((tmp = actual->proxima ) == NULL) ) { tmp = tareas_inicio; }
00131
00132
00133 while ( tmp->estado != TASK_RUNNING ) {
00134 if ( (tmp = tmp->proxima) == NULL ) { tmp = tareas_inicio; }
00135 }
00136 actual = tmp;
00137
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