Bios
Bios
Bios
Tema 4
Tema 4: La
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
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
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.
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.
10
11
12
13
14
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.
15
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
17
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
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
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
20
21
MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 over_kernel_ds: ...
22
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
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
25
26
27
28
29
"PRINTER" },
"HARDWAR" },
30
31
Descriptor de proceso
32
MINIX: jmp over_kernel_ds .data2 CLICK_SHIFT kernel_ds: .data2 0x00B4 over_kernel_ds: ...
33
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
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
36
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; ... } ... }
37
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
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. }
39
4.6 Init
Grupo de procesos y terminal de control
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.
41
4.6 Init
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
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
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
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
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; } }
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; }
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