minix3 introduccion minix3 introduccion cátedra: diseño e implementación de sistemas operativos...
TRANSCRIPT
MINIX3MINIX3INTRODUCCIONINTRODUCCION
Cátedra: Diseño e Implementación de
Sistemas Operativos UTN-FRSF
Tomado de: Operating Systems Design and Implementation, Third Edition
Estructura de MINIX3Estructura de MINIX3
Estructura de MINIX3Estructura de MINIX3
KERNELKERNEL
• Es la capa más baja encargada de gestionar procesos y las
transiciones entre los estados READY, RUNNING y
BLOCKED
• Implementa las primitivas básicas de IPC (send y receive)
verificando la legalidad de los destinatarios, de los espacios
de memoria de los buffers, verificación de Bloqueos y de
copiar los mensajes.
• Gestión de interrupciones de E/S utilizando instrucciones
privilegiadas (modo kernel)
Estructura de MINIX3Estructura de MINIX3
• CLOCK TASK:CLOCK TASK: Es un Device Driver de un dispositivo de
E/S denominado Timer que genera señales de interrupcione
periódicas. Solo interacciona con el Kernel.
• SYSTEM TASK:SYSTEM TASK: Responsable de servir las Kernel Calls,
utilizadas por los Device Drivers en modo Usuario para
llevar a cabo operaciones privilegiadas. Ejemplo de estas
operaciones son la escritura/lectura en puertos de E/S, la
copia de datos entre distintos espacios de direcciones, etc.
• CLOCK TASK & SYSTEM TASKCLOCK TASK & SYSTEM TASK: Ambas son compiladas
en conjunto y comparten el espacio de direcciones del
Kernel. Ambas son planificadas como procesos separados.
Estructura de MINIX3Estructura de MINIX3
• DEVICE DRIVERS (DD)
– Son responsables de la gestión de dispositivos de
E/S.
– Uno DD por cada tipo de Dispositivo
– Estan implementados como procesos
independientes.
– Deben solicitar operaciones privilegiadas a la
SYSTEM TASK a través de Kernel Calls.
Estructura de MINIX3Estructura de MINIX3
SERVIDORESPROCESS MANAGER (PM): El PM es responsable
de servir las System Calls relacionadas con la
creación y finalización de procesos tales como el
fork, exec y exit. Tambien aquellas relacionadas a
señales y gestión de memoria.
FILE SYSTEM (FS): El FS es responsible de servir
las System Calls relacionadas con las operaciones de
sistemas de archivos, directorios, archivos, tuberias,
etc.
Estructura de MINIX3Estructura de MINIX3
SERVIDORESINFORMATION SERVER (IS): Responsable de la
gestión de tareas tales como brindar información
sobre el estado de DD y Servers.
REINCARNATION SERVER (RS): Responsable de
arrancar o rearrancar DD que no fueron cargados
al mismo tiempo que el Kernel.
NETWORK SERVER (INET): Implementa los
protocolos de comunicaciones de redes. Es opcional.
Secuencia de BooteoSecuencia de Booteo• Al encender el equipo, la PC busca un disco con el número
mágico (0xAA55) en la posición 510 bytes de su primer sector
• La BIOS copia éste primer sector de la primer pista del disco de booteo en la memoria (posición LOADOFF) y comienza a ejecutar el codigo que allí se encuentra (masterboot.s)
• En un diskette es el programa bootstrap que luego carga el programa de booteo.
• En el Disco Rígido el primer sector contiene un pequeño programa (masterboot.s) y la Tabla de ParticionesTabla de Particiones. Esto forma el Master Boot RecordMaster Boot Record..
Secuencia de BooteoSecuencia de Booteo
Secuencia de BooteoSecuencia de Booteo• El MBR tiene indicada la partición activa.
• La partición activa contiene un programa de booteo propio al igual que un diskette (bootblock.s) el que es responsible de cargar el boot Monitor en BOOTSEG y ejecuta BOOTSEG:BOOTOFF
• Los archivos boothead.s, boot.c, bootimage.c, y rawfs.c constituyen el boot Monitor.
• Los CD-ROMs pueden cargar varios sectores en memoria para comenzar con el proceso de booteo.
• Tipicamente desde un CD-ROM se carga una copia exacta el diskette de booteo el cual es copiado en memoria y utiliza un disco RAM.
Secuencia de BooteoSecuencia de Booteo• El programa de booteo de MINIX 3 espera un archivo de
multiples partes y va cargando esas partes en la memoria. Esta es al imagen de booteo.
– El Kernel + Clock Task + System Task
– Process Manager
– File System
– Disk Driver
– Reincarnation Server
– RAM disk
– Init
Arbol de ProcesosArbol de Procesos
Secuencia de BooteoSecuencia de Booteo
http://www.swartzbaugh.net/
Secuencia de BooteoSecuencia de Booteo
• El primer proceso de “usuario” es init init (PID 1), pero no es el primer proceso “en espacio de usuario”.
• El primer proceso de espacio de usuario es el Process Manager (PID 0).
• Init Init es hijo del Reincarnation Server (RS)• InitInit ejecuta el script /etc/rc /etc/rc el cual carga los Device
Drivers y Servers que no fueron cargados durante el proceso de Booteo (generalmente desde /sbin).
• Uno de los primeros programas que se carga es serviceservice que es una interface en modo usuario del RS
Secuencia de BooteoSecuencia de Booteo• El RS toma programas ordinarios y los convierte en procesos del
sistema.
• Al final initinit lee el archivo /etc/ttytab/etc/ttytab, el cual dispone de la lista de todas las posibles terminales e init hace un fork por cada una de las terminales listadas.
• Normalmente, cada proceso es /usr/bin/getty/usr/bin/getty, que imprime un mensaje a la espera del ingreso del nombre de usuario
• Luego se llama a /usr/bin/login/usr/bin/login con el nombre como primer argumento y este verifica la contraseña según especifica /etc/passwd/etc/passwd
• Después del login, se ejecuta el proceso que se ha especificado
en el /etc/passwd/etc/passwd, usualmente una shell
Secuencia de BooteoSecuencia de Booteo
Secuencia de BooteoSecuencia de Booteo
IPCIPC
• Comunicación con Mensajes (Rendevous)
– send():send(): Cuando un proceso envia un mensaje a otro que no lo
está esperando el emisor se bloquea (RUNNING-
>BLOCKED)
– receive():receive(): Cuando un proceso intenta recibir un mensaje que
todavia no le fue enviado el receptor se bloquea
(RUNNING->BLOCKED)
– sendrec():sendrec(): Resume un send() y un receive() en una única
primitiva produciendo así un solo par de cambio de contexto
USER>KERNEL>USER
IPCIPC
• notify(dest):notify(dest):
– Permite notificar que algo importante ha sucedido. Es una primitiva NO
BLOQUEANTE y por lo tanto no requiere que el proceso destino esté
haciendo un receive().
– Con solo un simple bit se indica que hay una notificación pendiente.
Cada proceso tiene un bitmap de notificaciones pendientes el cual es
verificado la siguiente vez que el destinatario realiza una operación
receive(). Hay un bit por cada proceso del sistema.
– Cuando la notificación es generada para informar una interrupción, el
bitmap de todas las posibles fuentes de interrupción es incluido en el
mensaje.
Planificación de ProcesosPlanificación de Procesos• En cada interrupción o finalización de proceso, el kernel
invoca al planificador (preemptive)
• MINIX3 utiliza 16 colas de prioridades
Planificación de ProcesosPlanificación de Procesos• Clock TaskClock Task y System TaskSystem Task se ubican en las colas de máximas
prioridades.
• Device DriversDevice Drivers en colas se ubican en las colas de prioridades
debajo de máximas prioridades.
• Los ServersServers se ubican en las colas de prioridades por debajo de
los DD y por encima de las de Usuarios.
• Los procesos de Usuarioprocesos de Usuario se ubican en colas de prioridades
intermedias.
• En la cola de menor prioridad solo se ubica el proceso IDLEproceso IDLE que
solo ejecuta cuando no hay nada mas por hacer.
Planificación de ProcesosPlanificación de Procesos• Para los procesos de usuarios se puede fijar un quantumquantum
(timeslice).
• Los procesos que consumen su quantum son reinsertados al final
de la cola
• Los que se bloquean son reinsertados luego a la cabeza de la cola
de READY correspondiente a la prioridad con un quantum igual
al remanente que disponían antes de bloquearse.
• Tasks, DD y ServersTasks, DD y Servers ejecutarán hasta bloquearse aunque tienen
un quantum muy superior al requerido a los efectos de
implementar un mecanismo de watchdog por mal
funcionamiento.
Planificación de ProcesosPlanificación de Procesos• Cuando un proceso se bloquea (dequeue()) esperando
una E/S o un servicio, se puede ejecutar otro proceso.
• Cuando el requerimiento es satisfecho, el proceso bloquado se pone en estado LISTO (enqueue()).
• El reloj genera interrupciones periódicas en las cuales verifica si se ha vencido el quantum de un proceso de usuario en ejecución.
• El kernel oculta las interrupciones transformandolas en transferencias de mensajes hacia las Tareas.
Organización del CódigoOrganización del Código
• /usr/include/– /arpa: definiciones de tipos de datos IP– /ibm: definiciones específicas para IBM PC– /minix: headers del Sistema Operativo– /net: definiciones relacionadas a Ethernet/IP– /netinet: definiciones relacionadas direcciones IP
– /sys: POSIX headers
Organización del CódigoOrganización del Código• /usr/src/
– /boot: El código para bootear MINIX3.
– /drivers: layer 2 (device drivers discos, consola, etc.).
– /etc
– /include
– /kernel: layer 1 (planificación, IPC, clock y system tasks).
– /lib: código de procedimientos de bibliotecas(open, read, etc).
– /man
– /servers: layer 3 (process manager, file system, etc).
– /test
– /tools: scripts para compilar el kernel de MINIX3
– /commands
Organización del CódigoOrganización del Código
Makefile• Cada directorio del arbol de códigos fuentes
contiene un archivo Makefile• Los Makefiles son utilizados por la aplicación
make.• Make controla la compilación de archivos de uno
o mas directorios• Permite ahorrar tiempo compilando solo aquellos
fuentes modificados desde la última compilación.
Organización de MemoriaOrganización de Memoria
Compilación de MINIX 3Compilación de MINIX 3 • Si ejecutamos “make” dentro del directorio scr/tools aparecen
todas las opciones disponibles para compilar MINIX 3.
• “make install” es una opción habitual para compilar MINIX 3
Compilación de MINIX 3Compilación de MINIX 3
• Copia src/include en /usr/include.• Genera archivos objetos de src/kernel y algunos
subdirectorios de src/drivers y src/server.• Todos los archivos objetos de src/kernel se montan
juntos para generar un único ejecutable “kernel”.• Todos los archivos objetos de src/servers/pm se
montan juntos para generar “pm”.• Todos los archivos objetos de src/servers/fs se montan
juntos para generar “fs”.
Compilación de MINIX 3Compilación de MINIX 3 • Otros programas que pertenecen a la imagen de arranque
(“boot”) son compilados y montados en sus subdirectorios (rs, init, en src/servers, memory/, log/ tty/ en src/drivers).
• El componente designado “driver” en la imagen de arranque puede ser cualquiera de los manejadores de disco (habitualmente disco duro).
• Para instalar todo puede llamarse a installboot, en src/boot (supuestamente los hace make install), el cual concatena todo en un fichero ejecutable que puede ser copiado en el directorio /boot o en /boot/image. Posteriormente un programa cargador puede ubicarlo en memoria y darle control.
Ejecutando MINIX 3Ejecutando MINIX 3 • La siguiente vez que se arranque MINIX hay que
seleccionar:– Start Custom MINIX 3 (o no teclear nada ya que es la opción
por defecto)
Curiosidades del código MINIX 3Curiosidades del código MINIX 3
• include/ansi.h determina si el compilador utilizado cumple los requerimientos de C standard. Define la macro _PROTOTYPE para compiladores ANSI y K&R. Si el compilador es ANSI, los prototipos de funciones se especifican indicando el tipo de retorno y de los parámetros.
• En MINIX se definen muchos tipos de datos (ej. include/sys/types.h), pero el compilador funciona correctamente si sustituimos los mismos por los tipos subyacentes. El objetivo es únicamente hacer el código más legible.
Curiosidades del código MINIX 3Curiosidades del código MINIX 3 • Todos los tipos declarados acaban en _t y hay dos
versiones, una para el compilador ansi que empieza por minúscula (ej. dev_t)
• Es necesario destacar que en const.h (y en otros archivos) se utiliza la macro EXTERN, la cual es expandida como extern. Ello permite utilizar variables globales sin caer en múltiples redefiniciones de las mismas. En el fichero table.c de cada componente se provoca la redefinición de la macro EXTERN como string vacío (al definir _TABLE), de forma que exista una única definición para cada variable global, generalmente ubicada en el fichero glo.h.
Inicialización de MINIX 3Inicialización de MINIX 3 • El cargador ha introducido en la
pila datos necesarios y de interés para el núcleo.
• mpx386 prepara el marco de pila para poder llamar a cstart() (start.c).
• Inicializa GDT e IDT y copia los parámetros de la pila (pasados por el cargador) a memoria del núcleo.
• Hace efectivas GDT e IDT con lgdt y lidt.
• mpx386.s salta (jmp) a main.
Archivos de Encabezado Archivos de Encabezado
• include/minix/: contiene archivos especificos de MINIX3– com.h: Archivos de constantes comunes del kernel (ID de
procesos y mensajes especiales,etc)– config.h: Archivo de configuración principal de MINIX3– const.h: Constantes límites – devio.h: Constantes para E/S de dispositivos– dl_eth.h: Constantes para placa Ethernet– dmap.h: Constantes relacionadas con Dispositivos de Bloques– fslib.h: Constantes para soporte de Filesystem V1 y V2– ioctl.h: Constantes para soporte de System Calls IOCTL– ipc.h: Constantes y estructuras relativas a la transferencia de
mensajes
Archivos de Encabezado Archivos de Encabezado – ipc.h: Constantes y estructuras relativas a la transferencia de
mensajes– keymap.h: Constantes relacionadas con el mapeo de teclado– minlib.h: Constantes misceláneas– partition.h: Estructuras relacionadas con particiones de disco– paths.h: Path de archivos especificos– sound.h: Constantes y estructuras usadas por audio y mixer.– swap.h: Constantes y estructuras de las particiones de swap.– sys_config.h: Archivo con constantes de configuracion
(Número de procesos, prioridades, etc)– syslib.h: Prototipos de taskcalls y otras funciones del sistema.– sysutil.h: Utilidades para drivers y tasks.– type.h: Tipos y estructuras básicas de MINIX3– u64.h: Manipulación de estructuras de 64 bits de discos
Tipos de Mensajes en MINIX3Tipos de Mensajes en MINIX3
Codigo Fuente NavegableCodigo Fuente Navegable
http://www.raspberryginger.com/jbailey/minix/html/index.htmlhttp://www.raspberryginger.com/jbailey/minix/html/index.html