Está en la página 1de 50

La inicializacin del sistema

Departamento de Informtica Universidad de Extremadura

Tema 4

Ingeniera Informtica. Diseo de Sistemas Operativos

Tema 4: La

inicializacin del sistema

1. La BIOS y la secuencia de arranque 2. Particiones y cargadores 3. El monitor de arranque 4. La inicializacin de MINIX 5. La creacin de los procesos del sistema 6. Init
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.1 La BIOS y la secuencia de arranque


La BIOS es un cdigo denominado por IBM "sistema de entrada-salida bsico". Es una coleccin de rutinas y datos que el fabricante del PC proporciona en memoria ROM. Ejecuta en modo real y contiene los manejadores de los dispositivos que componen el PC tal y como sale de fbrica, como el teclado, el disco duro, La historia de la BIOS comienza a finales de los aos setenta cuando Intel lanza los microprocesadores 8088 y 8086. IBM decide construir un computador basado en el 8088, probablemente basada en el xito de Apple. IBM contacta con una compaa joven y activa de Seattle, Microsoft. Ambas acuerdan construir un sistema operativo para el nuevo Computador Personal (PC) que consistira en dos partes. 1. 2. El sistema de entrada-salida bsico (BIOS) como memoria ROM El sistema operativo, que recibi el nombre de Disk Operating System (DOS), disponible en disquete. Eestara compuesto por una serie de programas que utilizaran los servicios de la BIOS en ROM.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.1 La BIOS y la secuencia de arranque


Est construida con tecnologa EPROM. Ocupa generalmente el ltimo segmento de 64Kb del primer Mbyte de la memoria. La tecnologa EPROM es un tipo de memoria en la que no se puede escribir. Actualmente, la BIOS se implementa sobre memoria EEPROM, tambin denominada flash-memory. La tecnologa EEPROM permite actualizar la BIOS. Adems del espacio en ROM, la BIOS toma un espacio de datos de 256 octetos de memora RAM baja previa a DOS que contiene informacin sobre estado de perifricos Desde el punto de vista del software, la BIOS se estructura en tres partes: 1. La utilidad setup. Sirve para introducir y modificar datos de configuracin del sistema tales como las caractersticas de los discos, el tiempo, estados de espera de las memorias, velocidad del teclado, cadena de discos de arranque, etc. 2. La BIOS del sistema. Contiene las llamadas Rutinas de Servicio de Interrupcin. Proporcionan a las aplicaciones o al sistema operativo servicios bsicos de gestin de dispositivos como leer un nmero de sectores de un disco, detectar el tipo de UCP o comprobar si se ha pulsado una tecla. 3. La secuencia de arranque. Comprueba los componentes del sistema, inicializa estructuras de datos y, finalmente, carga el sistema operativo.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.1 La BIOS y la secuencia de arranque


Cada placa base dispone de su propia BIOS, cada una con sus caractersticas propias. No obstante, a pesar de las diferencias, existe un patrn de arranque comn. A continuacin se muestra la secuencia de arranque paso por paso: 1. El procesador Intel, tras recibir la seal de reset, comienza a ejecutar en modo real la instruccin situada en la posicin de memoria ROM F000:FFF0 (absoluta 0xFFFF0), es decir, 16 octetos previos al Mbyte. Esta instruccin es un salto al comienzo del programa de arranque de la BIOS. 2. La BIOS realiza las pruebas del sistema "power-on self test (POST)". Si hay errores, el proceso de arranque se detiene y el altavoz emite sonidos de diagnstico. 3. La BIOS busca el adaptador de vdeo. Normalmente, el adaptador de vdeo dispone de su propia ROM BIOS, situada en la posicin 0xC000. El arranque salta a esta posicin para inicializar el vdeo y luego retorna. En ocasiones esta BIOS muestra informacin en el monitor. Esta es la razn por la que la informacin del vdeo se muestra con anterioridad a la pantalla de arranque de la BIOS. 4. La BIOS busca y ejecuta otras ROM BIOS en los adaptadores de dispositivo. Normalmente los discos duros IDE/ATA tienen su BIOS en la direccin 0xC800.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.1 La BIOS y la secuencia de arranque


5. La BIOS muestra su familiar pantalla de arranque y, tras ello, realiza ms comprobaciones en el sistema. Entre ellos el examen de la memoria RAM disponible. Los contenidos de la pantalla de arranque son los siguientes:
El fabricante de la BIOS y el nmero de versin La fecha de la BIOS, que ayuda para determinar sus capacidades. La tecla de inicio del programa de configuracin de la BIOS. El logo del fabricante de la BIOS y en algunas ocasiones del fabricante del PC o de la placa base. El logo "Energy Star" si la BIOS soporta el estndar Energy Star. El nmero de serie de la BIOS. Localizado en la parte inferior de la pantalla. Ya que la BIOS est fuertemente ligada a la placa base, este nmero de serie sirve para determinar las caractersticas de la placa base y la BIOS.

6. 7.

La BIOS realiza un inventario de los dispositivos existentes, entre ellos el teclado y los puertos serie y paralelo. Si la BIOS soporta el estndar "Plug and Play (PnP)", detecta y asigna recursos a los dispositivos PnP. Muestra un mensaje por cada uno que encuentra.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.1 La BIOS y la secuencia de arranque


8. 9. La BIOS muestra en forma de tabla un resumen de la configuracin del sistema. Esta tabla indica los problemas surgidos en el arranque, si los hubiese. La BIOS comieza a buscar un dispositivo desde el que arrancar el sistema. Normalmente comenzando por los disquetes, los discos duros y los CDs, dependiendo de cmo se ha parametrizado la cadena de arranque en el programa de configuracin de la BIOS (Setup). Entonces carga en memoria el primer sector del dispositivo en la direccin 0000:7C00H (31 Kb).

10. La BIOS comprueba que los ltimos dos octetos del sector son 0xAA55. Si no lo son, el primer sector del disquete o disco duro no es un sector de arranque. La BIOS emite un mensaje, como el familiar No boot disk or disk error, Replace and stroke a key, Si lo son, la BIOS salta a la posicin 0000:7C00H para ejecutar el cdigo contenido en el sector de arranque.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.2 Particiones y cargadores


1. A veces conviene dividir el disco en compartimentos lgicos pero estancos. Cada uno de estos compartimentos se denomina particin. 2. Una particin es un conjunto de cilindros contiguos. Es costumbre en los discos actuales hacer cuatro particiones. Cada particin acta como un disco separado, con un nombre de dispositivo distinto, por ejemplo /dev/hd1, /dev/hd2, etc. 3. Se hace necesaria, as, la denominada tabla de particin. La tabla de particin contiene tantas entradas como particiones tenga el disco duro. Cada entrada de esta tabla indica en qu sector comienza y acaba la particin.
struct part_entry { unsigned char bootind; unsigned char start_head; unsigned char start_sec; unsigned char start_cyl; unsigned char sysind; unsigned char last_head; unsigned char last_sec; unsigned char last_cyl; unsigned long lowsec; unsigned long size; }; /* /* /* /* /* /* /* /* /* /* boot indicator 0/ACTIVE_FLAG */ head value for first sector */ sector value + cyl bits for first sector */ track value for first sector */ system indicator */ head value for last sector */ sector value + cyl bits for last sector */ track value for last sector */ logical first sector */ size of partition in sectors */

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.2 Particiones y cargadores


Si una particin contiene un sistema operativo, el primer sector de la particin contiene un programa que carga el sistema operativo y le cede el control. A este programa se le denomina cargador y a este primer sector sector de arranque de la particin.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.2 Particiones y cargadores


El primer sector del disco duro se denomina sector de arranque maestro o "Master Boot Record (MBR)" El MBR contiene la tabla de particin y un ejecutable denominado cargador maestro

El cargador maestro es un cargador de cargadores. Su misin no es cargar ningn sistema operativo, sino examinar la tabla de particin y, de acuerdo a sus instrucciones, localizar y cargar uno de los sectores de arranque y dar control al cargador primario all residente.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

10

4.2 Particiones y cargadores


El procedimiento de arranque de MINIX

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

11

4.3 El monitor de arranque


El monitor de arranque es un intrprete de mandatos inspirado en el shell de Bourne Permite cargar MINIX con una variedad de opciones extraordinariamente rica. Cuando la mquina arranca, el monitor toma el control y su abanico de mandatos permite al operador decidir cul es la imagen que de MINIX que se carga, con qu nivel de servicio (con red o sin red, etc.), en modo real o en modo protegido, etc. La funcionalidad del intrprete viene dada por sus mandatos, documentados por la entrada monitor(8) del manual. En general, el intrprete permite definir variables de entorno, agrupar mandatos predefinidos como echo, boot y otros en nuevos mandatos ms potentes denominados funciones, desplegar un men para elegir funciones El mandato ms importante es "boot: hd3a > boot Carga la imagen identificada por la variable de entorno image y le da control. Cuando MINIX termina al invocar shutdown, el flujo de control vuelve al intrprete, que espera la emisin del mandato siguiente. As, podemos considerar a MINIX como un mandato del monitor de arranque!
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

12

4.3 El monitor de arranque


El monitor se extiende a lo largo de cuatro ficheros fuente del directorio src/boot: 1. boothead.s, (1011 lneas de ensamblador) 2. boot.c, (1514 lneas de C), es el fichero principal 3. bootimage.c, (659 lneas de C) 4. rawfs.c, (259 lneas de C), La potencia del monitor tiene el precio del tamao y de la complejidad. El monitor es realmente es un programa grande, fundamentalmente porque la falta de soporte contribuye a aumentarlo. Tengamos en cuenta que un mandato del sistema o una aplicacin ordinaria hacen uso de los servicios del sistema operativo para realizar la entrada-salida. El monitor no dispone de estos servicios. Slo la BIOS ayuda El mismo autor, reconoce esta impresin. En el comentario inicial de la funcin ms importante, bootminix, la rutina que finalmente otorga el control a MINIX, Kees Bot, en tono jocoso, dice as: -"Dado el tamao de este programa, es sorprendente que llegue aqu alguna vez".

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

13

4.3 El monitor de arranque


El inicio de monitor de entorno muestra las lneas de presentacin Minix boot monitor 2.12 Press ESC to enter the monitor Hit a key as follows: = Start Minix hd3a> set rootdev = hd3a ramimagedev = hd3a ramsize = 1024 processor = (586) bus = (at) video = (vga) chrome = (color) memory = (15F90:7BB30,100000:FEF0000) image = minix main() {menu} delay = swap hd3a>
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

14

4.3 El monitor de arranque

Excepto el cargador maestro y el cargador primario, en general, un programa en memoria procede de un fichero. A estos ficheros se les denomina ejecutables. La figura muestra un ejecutable MINIX

El encabezado determina cmo se dispone el ejecutable en la memoria. Cuando la llamada al sistema exec debe ejecutar un proceso, abre el fichero ejecutable correspondiente y extrae el encabezado. Entonces exec determina el tamao total del ejecutable en la memoria y establece el mapa de memoria para el mismo.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

15

4.3 El monitor de arranque


A_magic. Nmero mgico, 0x0301. Identifica al fichero como ejecutable. A_syms es el tamao de la tabla de smbolos. A_flags Campo de indicadores que define caractersticas del programa. Un ejecutable ocupa un slo segmento si sigue el modelo de instrucciones y datos conjuntos y dos segmentos si sigue el modelo de instrucciones y datos separados. El indicador A_SEP distingue entre ambos.

A_total Nmero total de octetos consumidos por el ejecutable en memoria despus de restarle a_text. En a_total se incluye el espacio de heap. A_total puede cambiarse a voluntad por el propietario del ejecutable mediante el mandato chmem.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

16

4.3 El monitor de arranque


Ubicacin de la imagen de MINIX en el dispositivo de arranque

Composicin de la imagen de MINIX

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

17

4.3 El monitor de arranque


Dada image, el monitor: 1. Carga, uno tras otro, todos los ejecutables que componen la imagen de MINIX 2. Construye la estadstica de la carga en el vector local process 3. Escribe los encabezados de todos los ejecutables encima del monitor 4. Invoca MINIX

struct process { char name[IM_NAME_MAX + 1]; u32_t entry; /* Entry point. */ u32_t cs; /* Code segment. */ u32_t ds; /* Data segment. */ u32_t data; /* To access the data segment. */ u32_t end; /* End, size = (end - cs). */ } process[PROCESS_MAX];
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

18

4.3 El monitor de arranque


Los pares [variable, valor] se almacenan en la lista de nodos env Cada nodo almacena el par [variable, valor] en un objeto environment:

Una funcin del monitor recorre env buscando nodos de tipo E_VAR y forma una cadena de caracteres en la que concatena los pares en el formato nombre=valor Devuelve la cadena en la variable params y su tamao en la variable paramsize. A continuacin cede el control a MINIX invocando la funcin minix reboot_code = minix(process[KERNEL].entry, process[KERNEL].cs, process[KERNEL].ds, params, paramsize, aout );
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

19

4.3 El monitor de arranque


Los octetos quinto y sexto del segmento de cdigo del ncleo, etiquetados como kernel_ds, no contienen una instruccin, sino unos indicadores de configuracin:
MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 ! this is the entry point for the MINIX kernel ! skip over the next few bytes ! for the monitor: memory granularity ! ! ! ! boot call load (has monitor flags: (later kernel DS) in 8086 mode, make bss, make stack, low, don`t patch, will return, own INT calls), memory vector

over_kernel_ds: ...

Los indicadores informan al monitor de arranque sobre algunos aspectos de la disposicin en memoria y el modo de ejecucin de la imagen Tras cargar MINIX, el monitor copia los indicadores en la variable global k_flags, que es inspeccionada por la rutina minix

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

20

4.3 El monitor de arranque


Si el indicador K_I386 est activado, indica que el ncleo ha sido compilado para operar en modo protegido y, si no, en modo real. K_I386 articula la rutina minix
_minix: push bp mov bp, sp ! Pointer to arguments ... test _k_flags, #K_I386 ! Switch to 386 mode? jnz minix386 ! Call Minix in real mode. minix86: ... retf ! Call Minix in 386 mode. minix386: ... retf
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

21

4.3 El monitor de arranque


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. minix86: test jz push push 0: push push test jz mov mov cmp jnz xor xor 0: push push noret86: mov mov call push push mov mov call mov mov retf _k_flags, #K_MEML 0f 22(bp) 20(bp) 18(bp) 16(bp) _k_flags, #K_RET noret86 dx, cs ax, #ret86 _mem+14, #0 0f dx, dx ax, ax dx ax ax, 8(bp) dx, 10(bp) abs2seg dx 4(bp) ax, 12(bp) dx, 14(bp) abs2seg ds, dx es, dx

MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 over_kernel_ds: ...

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

22

4.4 La inicializacin de MINIX


El salto retf es realmente una llamada a funcin por parte del monitor La funcin comienza en la etiqueta MINIX (y as podemos llamarla) Como toda funcin, MINIX construye su marco de pila, compuesto por dos parmetros (vector de encabezados y cadena de entorno) y por el retorno al monitor
MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 over_kernel_ds: ...

El trabajo de MINIX es salvar los parmetros antes de conmutar a la pila del ncleo. La direccin de los encabezados se salva en la variable del ncleo aout y la cadena con las variables de entorno en los registros bx y dx
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

23

4.4 La inicializacin de MINIX


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. MINIX: jmp .data2 kernel_ds: .data2 over_kernel_ds CLICK_SHIFT 0x00B4 ! this is the entry point for the MINIX kernel ! skip over the next few bytes ! for the monitor: memory granularity ! boot monitor flags: (later kernel DS) ! call in 8086 mode, make bss, make stack, ! load low, don`t patch, will return, ! (has own INT calls), memory vector

over_kernel_ds: ! Set up a C stack frame on the monitor stack. (The monitor sets cs and ds ! right. The ss register still references the monitor data segment.) push bp mov bp, sp push si push di cmp 4(bp), #0 ! monitor code segment is jz noret ! nonzero if return possible inc _mon_return noret: mov _mon_ss, ss ! save stack location for later return mov _mon_sp, sp ! Locate boot parameters, set up kernel segment registers and stack. mov bx, 6(bp) ! boot parameters offset mov dx, 8(bp) ! boot parameters length mov ax, 10(bp) ! address of a.out headers mov _aout+0, ax mov ax, 12(bp) mov _aout+2, ax mov ax, ds ! kernel data mov es, ax mov ss, ax mov sp, #k_stktop ! set sp to point to the top of kernel stack Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

24

4.4 La inicializacin de MINIX


34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. ! Real mode needs to get kernel DS from the code segment. Protected mode ! needs CS in the jump back to real mode. MINIX: cseg mov kernel_cs, cs jmp over_kernel_ds cseg mov kernel_ds, ds .data2 CLICK_SHIFT ! Call C startup code to set up a proper environment to run main(). kernel_ds: push dx .data2 0x00B4 push bx push _mon_ss over_kernel_ds: push ds ... push cs call _cstart ! cstart(cs, ds, mds, parmoff, parmlen) add sp, #5*2 cmp _protected_mode, #0 jz nosw ! ok to switch to protected mode? call klib_init_prot ! initialize klib functions for protected mode call real2prot ! switch to protected mode push #0 ! set flags to known good state popf ! especially, clear nested task and int enable nosw: jmp _main ! main()
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

25

4.4 La inicializacin de MINIX


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. PUBLIC void cstart(cs, ds, mds, parmoff, parmsize) U16_t cs, ds; /* Kernel code and data segment */ U16_t mds; /* Monitor data segment */ U16_t parmoff, parmsize; /* boot parameters offset and length */ { /* Perform system initializations prior to calling main(). */ register char *envp; unsigned mon_start; /* Record where the kernel and the monitor are. */ code_base = seg2phys(cs); data_base = seg2phys(ds); /* Initialize protected mode descriptors. */ prot_init(); /* Copy the boot parameters to kernel memory. */ if (parmsize > sizeof k_environ - 2) parmsize = sizeof k_environ - 2; phys_copy(seg2phys(mds)+parmoff, vir2phys(k_environ), (phys_bytes) parmsize); /* Convert important boot environment variables. */ boot_parameters.bp_rootdev = k_atoi(k_getenv("rootdev")); boot_parameters.bp_ramimagedev = k_atoi(k_getenv("ramimagedev")); boot_parameters.bp_ramsize = k_atoi(k_getenv("ramsize")); boot_parameters.bp_processor = k_atoi(k_getenv("processor")); ... /* Processor? */ processor = boot_parameters.bp_processor; /* 86, 186, 286, 386, ... */ ... /* Decide if mode is protected. */ #if _WORD_SIZE == 2 protected_mode = processor >= 286; if (!protected_mode) mon_return = 0; #endif }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

26

4.4 La inicializacin de MINIX


Main realiza cinco tareas bien definidas: 1. 2. 3. 4. 5. Inicializar los vectores de interrupcin Inicializar el mapa de memoria libre para los procesos de usuario Inicializar los descriptores de proceso de las tareas, los servidores e init Insertar estos descriptores en las colas de planificacin Invocar restart para que ejecute la primera tarea dispuesta

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

27

4.4 La inicializacin de MINIX


PUBLIC void main() { /* Start the ball rolling. */ register struct proc *rp; register int t; int hdrindex; phys_clicks text_base; vir_clicks text_clicks; vir_clicks data_clicks; phys_bytes phys_b; reg_t ktsb; /* kernel task stack base */ struct memory *memp; struct tasktab *ttp; struct exec e_hdr; /* Initialize the interrupt controller. */ intr_init(1); /* Interpret memory sizes. */ mem_init(); ... }

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

28

4.4 La inicializacin de MINIX


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. typedef _PROTOTYPE( void (*vecaddr_t), (void) ); PRIVATE vecaddr_t int_vec[] = { Rutinas de excepcin int00, int01, int02, int03, int04, int05, int06, int07, }; Rutinas de PRIVATE vecaddr_t irq_vec[] = { hwint00, hwint01, hwint02, hwint03, hwint04, hwint05, hwint06, hwint07, interrupcin hwint08, hwint09, hwint10, hwint11, hwint12, hwint13, hwint14, hwint15, }; PUBLIC void intr_init(mine) int mine; { /* Initialize the 8259s, finishing with all interrupts disabled. This is * only done in protected mode, in real mode we don't touch the 8259s, but * use the BIOS locations instead. */ int i; lock(); if (protected_mode) { ... } else { for (i = 0; i < 8; i++) set_vec(i, int_vec[i]); set_vec(SYS_VECTOR, s_call); } /* Initialize the table of interrupt handlers. */ for (i = 0; i < NR_IRQ_VECTORS; i++) irq_table[i] = spurious_irq; }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

29

4.5 La creacin de los procesos del sistema


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. }; PUBLIC struct tasktab tasktab[] = { { tty_task, #if ENABLE_DOSDSK { dosdsk_task, #endif #if ENABLE_WINI { winchester_task, #endif { syn_alrm_task, { idle_task, { printer_task, { floppy_task, { mem_task, { clock_task, { sys_task, { 0, { 0, { 0, { 0, SYN_ALRM_STACK, "SYN_AL" IDLE_STACK, PRINTER_STACK, FLOP_STACK, MEM_STACK, CLOCK_STACK, SYS_STACK, HARDWARE_STACK, 0, 0, 0, "IDLE" "FLOPPY" "MEMORY" "CLOCK" "SYS" "MM" "FS" "INIT" }, }, }, }, }, }, }, }, }, WINCH_STACK, "WINCH" }, DOSDSK_STACK, "DOSDSK" }, TTY_STACK, "TTY" },

"PRINTER" },

"HARDWAR" },

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

30

4.5 La creacin de los procesos del sistema


1. PUBLIC void main() 2. { 3. ... 4. /* Task stacks. */ 5. ktsb = (reg_t) t_stack; 6. for (t = -NR_TASKS; t <= LOW_USER; ++t) { 7. rp = proc_addr(t); 8. ttp = &tasktab[t + NR_TASKS]; 9. strcpy(rp->p_name, ttp->name); 10. if (t < 0) { 11. if (ttp->stksize > 0) { 12. rp->p_stguard = (reg_t *) ktsb; 13. *rp->p_stguard = STACK_GUARD; 14. } 15. ktsb += ttp->stksize; 16. rp->p_reg.sp = ktsb; 17. text_base = code_base >> CLICK_SHIFT; 18. /* tasks are all in the kernel */ 19. hdrindex = 0; /* and use the first a.out header */ 20. } else { 21. hdrindex = 1 + t; /* MM, FS, INIT follow the kernel */ 22. } 23. ... 24. } 25. ... 26. }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

31

4.5 La creacin de los procesos del sistema


El mapa de memoria de un proceso MINIX

Descriptor de proceso

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

32

4.5 La creacin de los procesos del sistema


De dnde extrae main el comienzo de los segmentos de cdigo y datos del ncleo, los servidores e init?
Descriptor

MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 over_kernel_ds: ...

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

33

4.5 La creacin de los procesos del sistema

PUBLIC void main() { ... for (t = -NR_TASKS; t <= LOW_USER; ++t) { ... phys_copy(aout + hdrindex * A_MINHDR, vir2phys(&e_hdr), (phys_bytes)A_MINHDR); text_base = e_hdr.a_syms >> CLICK_SHIFT; text_clicks = (e_hdr.a_text + CLICK_SIZE-1) >> CLICK_SHIFT; if (!(e_hdr.a_flags & A_SEP)) text_clicks = 0; /* Common I&D */ data_clicks = (e_hdr.a_total + CLICK_SIZE-1) >> CLICK_SHIFT; rp->p_map[T].mem_phys = text_base; rp->p_map[T].mem_len = text_clicks; rp->p_map[D].mem_phys = text_base + text_clicks; rp->p_map[D].mem_len = data_clicks; rp->p_map[S].mem_phys = text_base + text_clicks + data_clicks; rp->p_map[S].mem_vir = data_clicks; ... } ... }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

34

4.5 La creacin de los procesos del sistema

1. PUBLIC void main() 2. { 3. ... 4. for (t = -NR_TASKS; t <= LOW_USER; ++t) { 5. ... 6. /* Remove server memory from the free memory list. */ 7. for (memp = mem; memp < &mem[NR_MEMS]; memp++) { 8. if (memp->base == text_base) { 9. memp->base += text_clicks + data_clicks; 10. memp->size -= text_clicks + data_clicks; 11. } 12. } 13. ... 14. } 15. ... 16. }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

35

4.5 La creacin de los procesos del sistema

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

36

4.5 La creacin de los procesos del sistema


PUBLIC struct tasktab tasktab[] = { { tty_task, TTY_STACK, { dosdsk_task, DOSDSK_STACK, { winchester_task, WINCH_STACK, { syn_alrm_task, SYN_ALRM_STACK, { idle_task, IDLE_STACK, { printer_task, PRINTER_STACK, { floppy_task, FLOP_STACK, { mem_task, MEM_STACK, { clock_task, CLOCK_STACK, { sys_task, SYS_STACK, { 0, HARDWARE_STACK, { 0, 0, { 0, 0, { 0, 0, }; "TTY" }, "DOSDSK" "WINCH" "SYN_AL" "IDLE" "PRINTER" "FLOPPY" "MEMORY" "CLOCK" "SYS" }, "HARDWAR" "MM" "FS" "INIT" }, }, }, }, }, }, }, }, }, }, }, },

PUBLIC void main() { ... for (t = -NR_TASKS; t <= LOW_USER; ++t) { ... /* Set initial register values. */ rp->p_reg.pc = (reg_t) ttp->initial_pc; rp->p_reg.psw = istaskp(rp) ? INIT_TASK_PSW : INIT_PSW; ... } ... }

#define INIT_PSW 0x0200 #define INIT_TASK_PSW 0x1200


Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

37

4.5 La creacin de los procesos del sistema

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

PUBLIC void main() { ... for (t = -NR_TASKS; t <= LOW_USER; ++t) { ... if (t >= 0) { /* Initialize the server stack pointer. Take it down one word * to give crtso.s something to use as "argc". */ rp->p_reg.sp = (rp->p_map[S].mem_vir + rp->p_map[S].mem_len) << CLICK_SHIFT; rp->p_reg.sp -= sizeof(reg_t); } if (!isidlehardware(t)) lock_ready(rp); /* IDLE, HARDWARE neveready */ rp->p_flags = 0; alloc_segments(rp); } ... }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

38

4.5 La creacin de los procesos del sistema

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

PUBLIC void main() { ... for (t = -NR_TASKS; t <= LOW_USER; ++t) { ... } proc[NR_TASKS+INIT_PROC_NR].p_pid = 1; /* INIT of course has pid 1 */ bill_ptr = proc_addr(IDLE); lock_pick_proc(); /* Now go to the assembly code to start running the current process. */ restart(); /* it has to point somewhere */

12. }

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

39

4.6 Init
Grupo de procesos y terminal de control

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

40

4.6 Init
Stty es un programa que muestra o cambia los parmetros del terminal que acta como entrada estndar Getty es un programa que muestra un mensaje de identificacin del sistema en su salida estndar, lee un nombre de usuario de su entrada estndar y ejecuta login con ese nombre como argumento. Los parmetros de getty forman el mensaje de identificacin.

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

41

4.6 Init

# Device console ttyc1 ttyc2 ttyc3 tty00 tty01

Type minix minix minix minix vt100 dialup

Program Init getty /etc/ttytab getty getty getty getty "stty 9600" getty "stty 38400"

El fichero /etc/ttytab (tabla de terminales) contiene la lista de los dispositivos terminales del sistema que permiten a un usuario iniciar una sesin va login. Cada terminal se convierte en el terminal de control del grupo Cada lnea describe el nombre y el tipo de terminal, el programa que hay que ejecutar para que muestre login (generalmente getty) y el programa (generalmente stty) que inicializa el terminal con los parmetros de velocidad, caracteres de control, etc Estos campos pueden omitirse para indicar que un terminal est deshabilitado o que no es necesaria la inicializacin.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

42

4.6 Init

# Device console ttyc1 ttyc2 ttyc3 tty00 tty01

Type minix minix minix minix vt100 dialup

Program Init getty /etc/ttytab getty getty getty getty "stty 9600" getty "stty 38400"

El programador dispone de una interfaz para recorrer y leer /etc/ttytab Getttyent sirve para recorrer la tabla. Cada invocacin lee la siguiente entrada y devuelve una estructura ttyent. Cuando no quedan entradas devuelve NULL. Setttyent abre o rebobina la tabla y Endttyent la cierra. Getttyname devuelve la entrada dada por su parmetro.
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

43

4.6 Init

# Device console ttyc1 ttyc2 ttyc3 tty00 tty01

Type minix minix minix minix vt100 dialup

Program Init getty /etc/ttytab getty getty getty getty "stty 9600" getty "stty 38400"

La funcin de init es explorar la tabla de terminales y arrancar un proceso login en cada terminal descrito

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

44

4.6 Init
Init no es creado por una llamada al sistema exec, de modo que no hereda ficheros abiertos de ningn proceso padre La entrada, salida y error estndar no estn abiertos cuando init comienza. Normalmente la accin fstat sobre la entrada estndar falla e init establece como entrada estndar /dev/null y como salida y error estndar /dev/log.
int main(void) 2. { 3. ... 4. struct stat stb; 5. if (fstat(0, &stb) < 0) { 6. /* Open standard input, output & error. 7. (void) open("/dev/null", O_RDONLY); 8. (void) open("/dev/log", O_WRONLY); 9. dup(1); 10. } 11. ... 12. }
1.

*/

/dev/log es un dispositivo especial siempre accesible concebido para enviar mensajes de depuracin al operador.
45

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

4.6 Init
Init establece los manejadores de las seales SIGUP, SIGTERM y SIGABRT. El administrador del sistema enva SIGUP a init tras insertar una nueva terminal en /etc/ttytab. Tambin cuando la borra para dar de baja un terminal.
void onhup(int sig) void onterm(int sig) { { gothup = 1; spawn = 0; spawn = 1; } } void onabrt(int sig) { static int count; if (++count == 2) reboot(RBT_HALT); gotabrt = 1; }

int main(void) { ... struct sigaction sa; ... sigemptyset(&sa.sa_mask); sa.sa_flags = 0; /* Hangup: Reexamine /etc/ttytab for newly enabled terminal lines. */ sa.sa_handler = onhup; sigaction(SIGHUP, &sa, NULL); /* Terminate: Stop spawning login processes, shutdown is near. */ sa.sa_handler = onterm; sigaction(SIGTERM, &sa, NULL); /* Abort: Sent by the kernel on CTRL-ALT-DEL; shut the system down. */ sa.sa_handler = onabrt; sigaction(SIGABRT, &sa, NULL); ... }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

46

4.6 Init
Tras la inicializacin de las seales, init crea un hijo y espera por l suspendido en wait. El hijo adquiere el teclado int main(void) como entrada estndar e { pid_t pid; invoca execute para mutar a ... un shell que ejecuta el script /* Execute the /etc/rc file. */ /etc/rc, que realiza funciones if ((pid = fork()) != 0) { bsicas de inicializacin y /* Parent just waits. */ while (wait(NULL) != pid) { administracin. if (gotabrt) reboot(RBT_HALT); } } else { static char *rc_command[] = { "sh", "/etc/rc", NULL, NULL };
close(0); (void) open("/dev/console", O_RDONLY); execute(rc_command); report(2, "sh /etc/rc"); exit(1); /* impossible, we hope */ } ... }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

47

4.6 Init

int main(void) { pid_t pid; int fd; int linenr; int check; struct slotent *slotp; struct ttyent *ttyp; ... check = 1; while (1) { while ((pid = waitpid(-1, NULL, check ? WNOHANG : 0)) > 0) { /* Search to see which line terminated. */ for (linenr = 0; linenr < PIDSLOTS; linenr++) { slotp = &slots[linenr]; if (slotp->pid == pid) { /* Record process exiting. */ wtmp(DEAD_PROCESS, linenr, NULL, pid); slotp->pid = NO_PID; check = 1; } } } ... if (spawn && check) { /* See which lines need a login process started up. */ for (linenr = 0; linenr < PIDSLOTS; linenr++) { slotp = &slots[linenr]; if ((ttyp = getttyent()) == NULL) break; if (ttyp->ty_getty != NULL && ttyp->ty_getty[0] != NULL && slotp->pid == NO_PID && slotp->errct < ERRCT_DISABLE) { startup(linenr, ttyp); } } endttyent(); } check = 0; } }

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

48

4.6 Init
void startup(int linenr, struct ttyent *ttyp) { /* Fork off a process for the indicated line. */ struct slotent *slotp; /* pointer to ttyslot */ pid_t pid; /* new pid */ ... char line[32]; /* tty device name */ int status; slotp = &slots[linenr]; ... if ((pid = fork()) == -1 ) { ... } if (pid == 0) { ... } /* Parent */ if (ttyp != &TT_REBOOT) slotp->pid = pid; ... if (ttyp != &TT_REBOOT) wtmp(LOGIN_PROCESS, linenr, ttyp->ty_name, pid); slotp->errct = 0; }

Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

49

4.6 Init
void startup (int linenr, struct ttyent *ttyp) { ... if (pid == 0) {/* Child */ ... setsid(); strcpy(line, "/dev/"); strncat(line, ttyp->ty_name, sizeof(line) - 6); close(0); close(1); if (open(line, O_RDWR) < 0 || dup(0) < 0) { ... } if (ttyp->ty_init != NULL && ttyp->ty_init[0] != NULL) { /* Execute a command to initialize the terminal line. */ if ((pid = fork()) == -1) { ... } if (pid == 0) { alarm(10); execute(ttyp->ty_init); ... } while (waitpid(pid, &status, 0) != pid) {} ... } /* Redirect standard error too. */ dup2(0, 2); /* Execute the getty process. */ execute(ttyp->ty_getty); ... } }
Ingeniera Informtica. Diseo de Sistemas Operativos. Tema 4: La inicializacin del sistema

50