Introducción al Minikernel Diseño de Sistemas Operativos
Entorno de prácticas LINUX minikernel Libros Cuenta de laboratorio http://arcos.inf.uc3m.es/~dssoo/index.html Libros Jesús Carretero, Félix García y Fernando Pérez. Prácticas de Sistemas Operativos: de la base al diseño
Llamadas al sistema (llamsis.h) Esquema global Procesos de usuario Llamadas al sistema (llamsis.h) Minikernel Llamadas HAL (HAL.h) HAL S.O Linux Hardware
Minikernel boot Kernel init Proc usr Proc usr Proc usr int main(){ /* se llega con las interrupciones prohibidas */ iniciar_tabla_proc(); instal_man_int(EXC_ARITM, exc_arit); instal_man_int(EXC_MEM, exc_mem); instal_man_int(INT_RELOJ, int_reloj); instal_man_int(INT_TERMINAL, int_terminal); instal_man_int(LLAM_SIS, tratar_llamsis); instal_man_int(INT_SW, int_sw); iniciar_cont_int(); /* inicia cont. interr. */ iniciar_cont_reloj(TICK); /* fija frecuencia del reloj */ iniciar_cont_teclado(); /* inici cont. teclado */ /* crea proceso inicial */ if (crear_tarea((void *)"init")<0) panico("no encontrado el proceso inicial"); p_proc_actual=planificador(); /* activa proceso inicial */ cambio_contexto(NULL, &(p_proc_actual->contexto_regs)); return 0; } boot Kernel init Proc usr Proc usr Proc usr
init.c int main(){ printf("init: comienza\n"); boot if (crear_proceso("simplon")<0) printf("Error creando simplon\n"); if (crear_proceso("excep_arit")<0) printf("Error creando excep_arit\n"); if (crear_proceso("excep_mem")<0) printf("Error creando excep_mem\n"); } boot Kernel init Proc usr Proc usr Proc usr
Excep_arit.c boot Kernel init #define ITER_EXCEP 22 /* iteración en la que causa excepción */ int tot=0; int main(){ int i; for (i=0; i<200; i++){ printf("excep_arit: i %d \n", i); /* Forzando una excepción */ if ((i+1)%ITER_EXCEP==0) i/=tot; } /* No debería llegar ya que ha generado una excepción */ printf("excep_arit: termina\n"); return 0; boot Kernel init Proc usr Proc usr Proc usr
Rutina de interrupción exc_arit static void exc_arit(){ if (!viene_de_modo_usuario()) panico("excepcion aritmetica cuando estaba dentro del kernel"); printk("-> EXCEPCION ARITMETICA EN PROC %d\n", p_proc_actual->id); liberar_proceso(); return; /* no debería llegar aqui */ } static void liberar_proceso(){ BCP * p_proc_anterior; liberar_imagen(p_proc_actual->info_mem); /* liberar mapa */ p_proc_actual->estado=TERMINADO; eliminar_primero(&lista_listos); /* proc. fuera de listos */ /* Realizar cambio de contexto */ p_proc_anterior=p_proc_actual; p_proc_actual=planificador(); liberar_pila(p_proc_anterior->pila); cambio_contexto(NULL, &(p_proc_actual->contexto_regs)); boot Kernel init Proc usr Proc usr Proc usr exc_arit
Estructura de datos: procesos typedef struct BCP_t *BCPptr; typedef struct BCP_t { int id; /* ident. del proceso */ int estado; /* TERMINADO|LISTO|EJECUCION|BLOQUEADO*/ contexto_t contexto_regs; /* copia de regs. de UCP */ void * pila; /* dir. inicial de la pila */ BCPptr siguiente; /* puntero a otro BCP */ void *info_mem; /* descriptor del mapa de memoria */ } BCP; finalizar Ejecución Terminado Cambio de contexto dormir despertar Listo Bloqueado
Estructura de datos: procesos /* Definicion del tipo que corresponde con la cabecera de una lista * de BCPs. Este tipo se puede usar para diversas listas (procesos * listos, procesos bloqueados, etc.). */ typedef struct{ BCP *primero; BCP *ultimo; } lista_BCPs; /* Variable global que identifica el proceso actual */ BCP * p_proc_actual=NULL; /* Variable global que representa la tabla de procesos */ BCP tabla_procs[MAX_PROC]; /* Variable global que representa la cola de procesos listos */ lista_BCPs lista_listos= {NULL, NULL};
Llamadas al sistema Minikernel /* Definición del tipo que corresponde con una entrada en la tabla de llamadas al sistema. */ typedef struct{ int (*fservicio)(); } servicio; /* Prototipos de las rutinas que realizan cada llamada al sistema */ int sis_crear_proceso(); int sis_terminar_proceso(); int sis_escribir(); /* Variable global que contiene las rutinas que realizan cada llamada */ servicio tabla_servicios[NSERVICIOS]={ {sis_crear_proceso}, {sis_terminar_proceso}, {sis_escribir}};
Planificador (caso I) Política FIFO Ejecución 4 3 9 2 6 8 1 5 7 Prioridad alta Prioridad media Prioridad baja Ejecución
Planificador (caso II) Política Round Robin 9 6 8 5 7 Prioridad alta Prioridad media Prioridad baja Ejecución
Planificador (caso II) Política Round Robin 9 6 8 5 7 Prioridad alta Prioridad media Prioridad baja Ejecución
Planificador (caso III) Creamos un proceso de prioridad alta 10 9 8 7 Prioridad alta Prioridad media Prioridad baja Ejecución 5
Planificador (caso III) Cambio de contexto 9 8 10 7 Prioridad alta Prioridad media Prioridad baja Ejecución 5
Mutex