sábado, febrero 07, 2009

Minix. De la 00000 hasta la 000068

Hoy vamos a empezar a analizar el código fuente de MINIX.
Para ello tendremos que recordar algunas nociones de C. El código se encuentra en /usr/src/.

Tanembaun ha numerado cada línea de código desde la 00000 hasta la 28864.
De la 00000 a la 00068 corresponden al fichero include/ansi.h

Recordemos que los ficheros .h son ficheros de cabecera. Una aplicación de cierto tamaño se diseña de forma modular. Cuando se hace un módulo en C (fichero .c), se suele preparar también la interfaz de ese módulo (fichero .h).

La interfaz sirve para hacer público al resto de módulos algunas funciones, variables, tipos de datos y constantes. Los módulos que vayan a utilizar ese módulo lo incluirán por medio de un #include="cabecera.h".

El directorio /usr/src/contiene ficheros de cabecera del estándar POSIX.
Incluye 3 subdirectorios:
-sys: ficheros de cabecera POSIX.
-minix: ficheros de cabecera utilizados por MINIX.
-ibm: ficheros de cabecera específicos de IBM PC.

Ansi.h

Hay una serie de ficheros de cabecera que son de propósito general y se procesan en todas las compilaciones de todos los módulos de MINIX.

Ansi.h es uno de ellos. Es el segundo que se procesa siempre. Sólo se procesa antes /include/minix/config.h

Propósito de Ansi.h:
Comprobar si el compilador sigue los requerimientos del C estándar (ANSI C).
El estándar define varias macros que pueden ser testeadas en tiempo de compilación.

Nota: Para entender Ansi.h hay que conocer las directivas del preprocesador.

Un compilador que siga el estándar establecerá __STDC__ = 1.

Lo primero que se hace en Ansi.h es comprobar el valor __STDC__. Si es 1, entonces _ANSI se define como 31459, que significa que sigue el estándar.

Luego hace una comprobación más (considera que si está definido __GNUC__ también es ANSI). Por lo tanto _ANSI se establece a 31459.

Ahora viene lo más importante. En C antes de utilizar una función hay que declararla por medio de un prototipo. En el prototipo se adelantan los tipos de datos que recibe y el que devuelve. En ANSI C es así:

int calcular(int numero1, int numero2)

Pero en otros C-s puede ser así:

int calcular()

Por medio de la macro _PROTOTYPE el preprocesador transformará nuestros prototipos a la forma adecuada.

Por último, en Ansi.h se define _POSIX_SOURCE como valor 1 en función de otras macros.

Saludos.

No hay comentarios: