PDF de programación - Inicialización del kernel del MINIX 2.0: main.c, start.c y table.c

Imágen de pdf Inicialización del kernel del MINIX 2.0: main.c, start.c y table.c

Inicialización del kernel del MINIX 2.0: main.c, start.c y table.cgráfica de visualizaciones

Publicado el 13 de Abril del 2021
347 visualizaciones desde el 13 de Abril del 2021
58,2 KB
13 paginas
Creado hace 23a (18/04/2001)
Inicialización del

kernel del MINIX 2.0:

main.c, start.c y table.c

Enrique González Cabrera
David J. Hernández Cerpa



Introducción


En la fase de inicialización del sistema, existen múltiples transferencias de control entre rutinas
en lenguaje ensamblador y código en C. Las rutinas en ensamblador están localizadas en el fichero
mpx386.s (para máquinas de 32 bits) o el mpx88.s (para las de 16 bits). El código en C se encuentra
principalmente en los ficheros start.c y main.c, los cuales hacen uso de rutinas y funciones implementadas
en otros archivos. También utiliza estructuras de datos de otros ficheros como el table.c


En esta versión del MINIX (2.0) se ha empleado una considerable cantidad de esfuerzo en
reorganizar el código, de modo que pueda ser estudiado más fácilmente y sobre todo para que el código
sea independiente de la máquina, de forma que pueda ser más fácilmente transportable a otras
plataformas.


Start.c


Este archivo contiene una función principal (cstart) y un par de funciones que son llamadas por
la misma (k_atoi y k_getenv). Dentro de estas funciones se encuentra el código de inicialización para
Minix en procesadores Intel siguiendo el criterio de separar las funciones dependientes del hardware a
favor de una mejor transportabilidad.


El código en ensamblador de la rutina mpx386.s, encargada de la inicialización, llama después
de una serie de pasos a la función cstart. Esta última se encarga de algunos procesos de inicialización y de
llamar a otras funciones que inicializan la tabla de descriptores global, la estructura central de datos usada
por los procesadores Intel de 32 bits para controlar la protección de memoria, y la tabla descriptores de
interrupción, utilizada para seleccionar el código que se va a ejecutar para cada posible tipo de
interrupción.


Lo primero que hace cstart es llamando a la función prot_init. Esta función inicializa la tabla de
descriptores globales la cuál es utilizada por el procesador para comprobar la seguridad en los accesos a
memoria. Además inicializa la tabla de descriptores de interrupciones que se utiliza cuando se producen
éstas.


A continuación realiza tareas como copiar los parámetros de arranque a la parte de memoria
asignada para el kernel, realizando una conversión a valores numéricos mediante la función k_atoi.
Además, determina el tipo de tarjeta de vídeo, el tamaño de la memoria, el tipo de procesador, el modo de
operación (real o protegido) –estas últimas operaciones se hacen mediante llamadas a función k_getenv-.


Por último comprueba si se puede retornar al monitor y actualiza la dirección de retorno en

consecuencia (estos valores serán utilizados por el mpx386.s).


Las otras dos funciones del fichero son funciones auxiliares utilizadas en start():



k_getenv: Función a la que se le pasa una variable de entorno “name” y devuelve un
puntero a la cadena con el valor de la variable.





k_atoi: Función que convierte ristra a entero.



2

Main.c


Éste fichero contiene la siguiente función que es llamada por mpx386.s después de cstart, y se

encarga de completar la inicialización y de comenzar la ejecución normal del sistema.


Las funciones que se implementan en éste fichero son los siguientes :



• main(): Establece el vector de interrupciones, la tabla de procesos para tareas y servidores,
interpreta los tamaños de memoria y planifica la ejecución de las tareas para que se ejecuten por
sí mismas.




panic(s,n): Procedimiento invocado por el sistema cuando se produce una situación que le hace
imposible continuar.


main()


Comienza con una llamada a intr_init, que configura el hardware de control de interrupciones.
Este proceso ha sido separado debido a que es dependiente del hardware, y se le pasa un parámetro de
configuración para indicar si se han de inicializar las interrupciones para Minix o reinicializarlas a su
estado original. Esta función además se asegura de que ninguna interrupción que tenga lugar durante el
proceso de inicialización tenga efecto. Esto se consigue en dos pasos: primero, se envía un byte a cada
controlador de interrupciones que inhibe la respuesta a entradas del exterior; segundo, todas las entradas
de la tabla de interrupciones utilizadas para acceder manejadores específicos de dispositivos se rellenan
con la dirección de una rutina que imprimirá un mensaje si se recibe alguna interrupción espúrea. Estos
vectores se volverán a rellenar con sus valores originales uno a uno, a medida que las tareas de
entrada/salida ejecutan sus propias rutinas de inicialización.


A continuación se llama a mem_init, función que inicializa un array que define la localización y
tamaño de cada porción de memoria restante en el sistema. Al igual que para la función anterior, esta
función es dependiente del hardware, y por ello ha sido aislada en un archivo separado para mantener al
main libre de código no transportable.


La siguiente tarea que realiza el main consiste en inicializar la tabla de procesos, marcandolos
como libres y asignándoles un número identificativo. Acto seguido pasa a inicializar sus entradas para
tareas del sistema y servidores, con la información necesaria para que cuando las primeras tareas y
procesos sean tratados, su mapeo de memoria y registros sean asignados correctamente.


para que los procesos puedan ser ejecutados. Sus campos están descritos más adelante.


En esta etapa, se inicializa la tabla de procesos con la información necesaria para ejecutar las
tareas, servicios y el init. Se inicializan los punteros de los segmentos de código, datos y pila para cada
una de las tareas del sistema, junto con el MM (memory manager), FS (File system) y el INIT. Estas
tareas deben de estar presentes en el arranque del sistema y ninguna de ellas terminará durante la correcta
operación del mismo.


Todas las tareas están compiladas dentro del mismo fichero que el kernel, y la información
acerca de sus requerimientos de pila está en un array llamado tassktab, definido en table.c . Dado que
todas las tareas están compiladas dentro del núcleo y pueden utilizar código y acceder a datos localizados
en cualquier lugar del kernel, el tamaño de una tarea individual no es relevante, y el campo de la
estructura del proceso designado para indicar su tamaño no es significativo, pues se utilizará toda la
porción de código del kernel.



A continuación se le asigna a cada servidor su localización en memoria. Para ello el sistema
cuenta con un vector denominado sizes. En este se encuentra la información del tamaño del código y
datos de los procesos. Este tiene al menos ocho elementos, de manera que los dos primeros dicen el
tamaño del código y datos del KERNEL (que será utilizado para cada una de las tareas), los dos
siguientes los tamaños respectivos al MM, y de la misma manera con el FS y el INIT. Si se tiene
activado el servicio de red, existirán dos posiciones más.


La tabla de procesos es un vector en el cual en cada posición se almacena información necesaria

sizes(0) = tamaño del código del Kernel.
sizes(1) = tamaño de los datos del Kernel.
sizes(2) = tamaño del código del manejador de memoria (MM).
sizes(3) = tamaño de los datos del manejador de memoria (MM).
sizes(4) = tamaño del código del File System (FS).
sizes(5) = tamaño de los datos del File System (FS).
sizes(6) = tamaño del código de INIT.
sizes(7) = tamaño de los datos de INIT.
Estructura del vector “sizes” (tamaño en clicks, 1 click=256 bytes).

Para cada proceso se mapea memoria para código,datos y pila de la siguiente forma:



La utilización de este vector posibilita la modificación del los procesos del sistema
(kernel,MM,FS,INIT), sin que esto suponga problema alguno en la recompilación del núcleo, de modo
que no es necesaria la modificación del main en tales casos.



Como ya hemos comentado las tareas poseen todas la misma posición base y tamaño, y que es la
del kernel. El segmento de datos es situado a continuación del segmento de código y la posición de la pila
está a continuación de ésta ocupando la misma zona de memoria



Text_base

Text_base + Text_clik



Codigo

Datos/Pila

Text_click
Data_clicks

Text_base + Text_clik+ +Data_clicks



Si estamos compilando para la versión de Minix de 32 bit, los servicios y el init del sistema serán
situados por encima del rango de 1MB de memoria. Esto permitirá que el sistema de ficheros utilice un
amplio bloque de caché de disco dentro de la memoria convencional.


Los procesos IDLE y HARDWARE requieren un tratamiento especial. El proceso IDLE es un
bucle que no hace nada y que se ejecuta cuando no hay ningún otro proceso en ejecución, y el proceso
HARDWARE existe para propósitos
internos (bookkeeping, relacionado con el manejo de
interrupciones). Todos los demás procesos se colocan en las colas apropiadas mediante la función
lock_ready(rp), que se encarga de colocar el proceso indicado en la cola correspondiente al mismo.


El último paso en la tarea de inicialización de cada elemento de la tabla de procesos es llamar a
la función alloc_segments, la cual es otra función dependiente de la máquina que asigna a sus campos
correspondientes la localización, tamaño y nivel de permiso para los segmentos de memoria usados por
cada proceso. Para versiones antiguas del procesador Intel que no soportan el modo protegido (como el
i8088 y i8086), sólo determina los segmentos de memoria (obviando la asignación de permisos).

A continuación se indica (en la variable bill_ptr) qué proceso va a se
  • Links de descarga
http://lwp-l.com/pdf19091

Comentarios de: Inicialización del kernel del MINIX 2.0: main.c, start.c y table.c (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad