domingo, 17 de octubre de 2010

2.6 Implementación de procesos en MINIX

Los términos de “procedimiento”, “funcion”, y “rutina” se usaran constantemente. Las llamadas al sistema estarán en escritas, como READ.

Organización del código fuente MINIX

La ruta absoluta hacia los fuentes en C para una plataforma basada en Intel es /usr/src/. En el texto nos referiremos como src/ a ese directorio. Otro directorio importante es/usr/src/include, al cual nos referiremos como include/.

El directorio include/ contiene una cierta cantidad de archivos de cabecera PSOIX estándar, y además tiene los tres directorios:

  • sys/ cabeceras IOSIX adicionales
  • minix/ cabeceras usadas por el SO MINIX
  • ibm/ cabeceras con definicines específicas para los sistemas IBM-PC

A los fines de permitir extensiones a MINIX y programas que corren en el entorno de MINIX, hay otros archivos y subdirectorios en include/. Por ejemplo include/arpa/,include/net/ y su subdirectorio include/net/gen/ permiten extensiones de red.

El directorio src/ contiene otros tres importantes subdirectorios con código fuente del SO:

  • kernel/ capa 1 y 2 (procesos ,mensajes, controladores)
    • servers/mm/ código de administrador de memoria
    • servers/fs/ código del sistema de archivos

Hay otros tres directorios de código fuente que no están impresos ni discutidos en el libro, pero esenciales para producir un sistema en operación:

  • src/lib código fuente para los procedimientos de biblioteca (ej: open, read, etc.)
  • src/tools/ el Makefile y los scripts para iniciar el sistema MINIX
  • src/boot/ el ćodigo para arrancar e instalar un sistema MINIX.

Como MINIX es un sistema operativo experimental, concebido para ser modificado, hay un directorio src/test/ con programas diseñados para verificar completamente el nuevo sistema MINIX recién compilado.

El SO sirve para darle soporte a los mandatos (commands) que van a correr sobre él. En consecuencia hay un enorme directorio src/commands/ con los fuentes de los programas utilitarios: cat, cp, date, ls, pwd y otros 200 más).

MINIX consta de varios programas independientes que se comunican sólo mediante el pasaje de mensajes. Si hay un procedimiento con el mismo nombre en dos de esos programas, no hay ningún conflicto porque se enlazan en ejecutables diferentes. Algunas rutinas de src/lib/ son comunes a las tres partes del SO.

Además, como los drivers son programas independientes del núcleo, agregar un driver Ethernet y el server init se puede hacer después de cargar la imagen. Estos procesos se arrancan desde /etc/rcy se cargan en las regiones de memoria disponible para programas de usuario.

Los archivos de cabecera común

El directorio include/ y sus subdirectorios contienen una colección de archivos que definen constantes, macros y tipos. El estándar IOSIX requiere muchas de esas definiciones, y especifica en cuales archivo debe estar dentro del directorio principal include/ y su subdirectorio include/sys/. Los archivos dentro de esos directorio se llaman de cabecera o encabezado (header files) y tienen extensión .h; se los incluye mediante la sentencia #include en los fuentes C.

Los encabezados que hacen falta para compilar programas de usuario se encuentran principalmente en include/; para compilar programas y utilidades del sistema se usan encabezados que están en include/sys/. La distinción no es tan importante y en la compilación de un programa de usuario se pueden usan archivos pertenecientes a ambos.

Consideraremos cabeceras que son verdaderamente de propósito general, tanto es así que no son referenciados directamente por ningún archivo fuente del sistema MINIX. Los archivos son incluidos en otros archivos de encabezado.

Vamos a estudiar el primer archivo: include/ansi.h

El objetivo de ansi.h es verificar si el compilador que se está usando es conforme al estándar de C, como lo define la ISO, Estándar C se lo conoce como ANSI C. Si usamos un compilador ANSI C, habrá ciertas macros predefinidas como por ejemplo: __STDC__ que debe tener a 1 como valor. Este efecto es el mismo que se obtiene cuando el preprocesador lee la línea:

#define__STDC__1

La macro más importante en include/ansi.h es _PROTOTYPE. Esta macro nos permite escribir los prototipos de la funciones de la forma:

_PROTOTYPE (tipo_devuelto,nombre_func,(tipo_argumento argumento,…))

El segundo archivo en include/ que se incluye en la mayoría de los fuentes MINIX es limits.h. En este archivo se define algunos tamaños básicos, como la cantidad de bits en un entero para el lenguaje C, o límites del sistema operativo como la longitud de un nombre de archivo.

El siguiente grupo de archivos no se incluye en todos los encabezados maestros, pero se usan en muchos archivos en diferentes partes del sistema MINIX. El más importante esunistd.h. Este encabezado define muchas constantes, la mayoría requeridas por IOSIX. Además incluye prototipos de muchas funciones C, incluidas aquellas que se utilizan para acceder a las llamadas al sistema MINIX.

Los temporizadores vigías (watchdog timers) se describen en timers.h, al cual lo incluye el encabezado principal del kernel. Define la struct timer y los prototipos de funciones que se usan para operar sobre listas de timers. Se define el typedef tmr _func_t que es un puntero a función. Dentro de la estructura timer, ese puntero determina la función que se debe invocar cuando expira el tiempo del temporizador.

Los encabezados maestros de las partes principales de las llamadas al sistema de MINIX hacen que se lea inmediatamente espués de leer ansi.h. sys/types.h define muchos tipos de datos que usa MINIX. Todos los nombres de los tipos deben tener un sufijo _t, por un requerimiento IOSIX. Este es unsufijo reservado y no debe usarse como sufijo de nada que no sea un tipo.

Los archivos de cabecera MINIX

Los archivos en include/minix/ se usan para implemetar MINIX en cualquier plataforma. Los de inlcude/ibm/ tienen estructuras y macros específicas para implementar MINIX en máquinas de tipo IBM.

No hay comentarios:

Publicar un comentario