La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Introducción al Minikernel

Presentaciones similares


Presentación del tema: "Introducción al Minikernel"— Transcripción de la presentación:

1 Introducción al Minikernel
Diseño de Sistemas Operativos

2 Entorno de prácticas LINUX minikernel Libros Cuenta de laboratorio
Libros Jesús Carretero, Félix García y Fernando Pérez. Prácticas de Sistemas Operativos: de la base al diseño

3 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

4 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

5 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

6 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

7 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

8 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

9 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};

10 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}};

11 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

12 Planificador (caso II)
Política Round Robin 9 6 8 5 7 Prioridad alta Prioridad media Prioridad baja Ejecución

13 Planificador (caso II)
Política Round Robin 9 6 8 5 7 Prioridad alta Prioridad media Prioridad baja Ejecución

14 Planificador (caso III)
Creamos un proceso de prioridad alta 10 9 8 7 Prioridad alta Prioridad media Prioridad baja Ejecución 5

15 Planificador (caso III)
Cambio de contexto 9 8 10 7 Prioridad alta Prioridad media Prioridad baja Ejecución 5

16 Mutex


Descargar ppt "Introducción al Minikernel"

Presentaciones similares


Anuncios Google