Università Degli Studi di Napoli Federico II Facoltà di MM.FF.NN. Corso in Informatica SEMINARIO DI SISTEMI OPERATIVI IL BOOTSTRAP Docente: M. Guarracino Studenti: A. Fiore G. De Nicola Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED mat: 566/1174 mat: 566/1175 AUTORI: Fiore Armando De Nicola Giuseppe ARGOMENTI TRATTATI 1/15 Il BOOTSTRAP: COSA ACCADE PRIMA DI CARICARE IL KERNEL CARICAMENTO DEL KERNEL LA start_kernel() I SOTTOSISTEMI DEL KERNEL L’INIZIALIZZAZIONE DEI SOTTOSISTEMI IL FORMATO ELF Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’AVVIO DEL SISTEMA 2/15 Ci chiediamo qual è l’insieme delle operazioni che rendono un groviglio di metallo e silicio in una potente macchina da calcolo? I passi essenziali sono 4: Segnale di reset; Caricamento del BIOS; Caricamento ed esecuzione del boot-loader; Caricamento ed esecuzione del kernel; Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’AVVIO DEL SISTEMA 3/15 Cosa accade quando viene premuto il tasto power di un PC? Viene generato un impulso elettrico, la CPU in risposta inizia ad eseguire istruzioni in modo predeterminato. I processori X86 (famiglia intel) si trasformano in un processore a 16 bit che può indirizzare al massimo 1 Mb di memoria. Ed iniziano ad eseguire l’istruzione dall’indirizzo 0xffff0 cioè appena sotto il limite di 1Mb, allo scopo di caricare il BIOS. Il BIOS (Basic Input-Output System) è un insieme di istruzioni residenti in una memoria nvram (non volatile ram) generalmente una PROM, chiamata in gergo CMOS. Essa permette di stabilire qual’è il dispositivo di avvio dal quale caricare il boot-loader. Inoltre, il BIOS si preoccupa di inizializzare anche le periferiche PCI o ISA nel caso in cui il kernel debba essere caricato da remoto. Il BOOT-LOADER quale LILO oppure GRUB è un programma che si preoccupa di caricare il kernel linux in memoria, e predispone alcuni parametri hardware necessari al suo funzionamento. La sua dimensione può variare a seconda che faccia parte del kernel oppure no. Il nucleo (KERNEL) del sistema linux o di un qualsiasi sistema operativo è un programma privilegiato che interagisce direttamente con l’architettura del calcolatore e gestisce tutte le risorse del sistema. Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’AVVIO DI UN SISTEMA 4/15 Area di memoria non visibile Boot-loader setup BIOS Kernel compattato Kernel scompattato Boot sector 0x100000 I/O space Area di memoria visibile Spazio di I/O Locazione in esecuzione 0xA0000 Va in esecuzione boot-loader, effettua All’istante TTT 7T Tilgia 8codice ,partendo inizia avvia cosi dall’indirizzo l’esecuzione lache CPU ad All’istante Il primo Come abbiamo passo 60 , 4e 52,il ,il sarà infine areset quello partire detto di non disetup quando dall’indirizzo descrivere resta (setup.S viene che il una scansione della tabella delle per eseguire 0x7c00, del kernel viene istruzioni vero caricato esulle proprio sotto un la tramite settore ildel di codice 512 Mb caricare diagramma; generato 0x90200 video.S), in ilvengono segnale memoria una caricati volta dibassa reset, ascisse isfoglia (da prelevate file ilpartizioni 0x10000 processore setup.S verrà leae identificare quale di essa è mentre quella attiva, allo byte contenuto scopo che rappresentano di file head.S, in memoria tramite byte ilililBIOS. quale boot0x90000) rappresentato si video.S. informazioni trasforma Ililnel loro kernel inportare dal una ruolo ilBIOS, compresso. CPU tempo, èper quello attiva a 448 16 bit di la capace prelevare modalità sulle di caricando in memoria il contenuto del suo boot Esso loader viene viene richiamato e della per caricato imassimo restanti anche il64 parte decompressore byte, iniziale la tabella della del ordinate indirizzare dal protetta BIOS le informazioni alcelle CPU, dinella uscendo memoria. 1sul Mb sistema, diI memoria. quindi rispettivi come dalla sector all’indirizzo 0x90000. Daeazzera questo memoria delle kernel. partizioni. L’esecuzione fino alfatto indirizzo Tale settore tale codice risiede durante nella il colori Ciò la compatibilità mappa deriva rappresenteranno dal di8086 memoria, edi che abilitando ila0x7c00 vari procedura, per programmi la gestione renderle che indirizzo fino amemoria 0x90200 carica il contenuto la parte contenuto sua iniziale esecuzione di del dispositivo si BSS stabilisce di (segmento avvio che quale nel di che andremo disponibili di tutta saranno la a memoria descrivere, al caricati kernel disponibile. secondo in è stata memoria. ideata un Libera formato Il per loro la del boot sector (nel caso particolare di Linux dispositivo caso memoria dell’hard atto deve adisk contenere nelessere MBR(Master le variabili preso Boot non in significato prima prestabilito. memoria volta dalper eBIOS riportato con nel processore all’inizio riquadro viene caricato il macchine filee posiziona, bootsect.S contenete considerazione Record). inizializzate Infatti didiper un processo), caricare disco rigido le predispone informazioni possiede le superiore. 386 della con memoria, 1Mb ilogni memoria. kernel compresso. Si conservata informazioni importanti per il èsistema) che successive un strutture MBRdati e(loader per la ogni epaginazione kernel). sua partizione Tale e abilità scelta può lae anche perdiprocessori motivi permette identificaresuperiori il codiceper necessario influenzabile possedere MMU perunpoi boot mandare dall’utente sector dove in esecuzione può tramite risiedere la alla decompressione del kernel nonché il di compatibilità. 0x90000 0x10000 0x7c000 0x1000 0x0 T0 configurazione un funzione boot-loader start_kernel, secondario. del BIOS. definita kernel stesso. L’esecuzione passainainit/main.c bootsect.S. T1 T2 T3 T4 T5 T6 T7 T8 Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe LA start_kernel 5/15 La funzione start_kernel: Prima funzione eseguita in codice C, madre di tutte le funzioni; Richiama setup_arch che chiama a sua volta la funzione parse_option per l’acquisizione dei parametri del kernel tramite linea di comando; Attiva le funzionalità base del sistema: caricamento della tabella degli interrupts; l’attivazione del timer degli interrupts; l’inizializzazione della console; l’inizializzazione del gestore della memoria. Inizializza i sottosistemi del kernel; Genera il processo init con PID 1 il padre di tutti i processi. Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe I SOTTOSISTEMI DEL KERNEL 6/15 Un kernel è un oggetto molto complesso. La sua complessità deriva dal fato che deve funzionare su numerosi tipi di macchine. Processori diversi, protocolli di rete diversificati, bus di comunicazione di vario tipo, sono solo alcuni esempi di cosa contribuisce ad incrementare la complessità di un kernel, man mano che passa il tempo e si scoprono nuove tecnologie. UTENTE 1 UTENTE 2 SO kernel sottosistemi Architettura hd 1 Architettura hd 2 Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe I SOTTOSISTEMI DEL KERNEL 7/15 Il codice di un kernel Linux, è diviso ordinatamente in sottosistemi; Ogni sottosistema offre funzionalità ad alto livello alle istanze che invece sono destinate a comunicare con le periferiche a basso livello; Sottosistemi del kernel sono, ad esempio, SCSI, IDE, PCI, USB. Sottosistema USB funzionalità IS1 IS2 ISn comunicazione P1 P2 Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED Pn AUTORI: Fiore Armando De Nicola Giuseppe I SOTTOSISTEMI DEL KERNEL 8/15 Un sottosistema USB ad esempio, implementa: Protocollo di comunicazione del bus; Inserimento e rimozione a caldo delle periferiche; La gestione delle situazioni di errore. Allo stesso tempo prevede due interfaccie: Una verso il basso nella direzione dei driver per permettere loro di integrarsi nell’architettura software; L’altra a basso livello verso i controllori per permettere al sottosistema di poggiare su diverse architetture. Sottosistema USB interfaccia interfaccia controllore driver hardware periferiche Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 9/15 Nell’avvio di un sistema sorge il problema dell’inizializzazione dei sottosistemi; l’aggiunta di un modulo non crea problemi a sistema già avviato poiché tutte le componenti dell’ambiente operativo sono già avviate; l’avvio del kernel può avvenire solo se i suoi sottosistemi sono avviati nell’ordine corretto. User Space User Space Kernel Proper Kernel Proper USB SCSI CONTROLLER PROTOCOLLO CONTROLLER UHCI mouse AHA1 EHCI disk AIC7 INPUT PROTOCOLLO ST SD Sistema ideale Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED USB CONTROLLER UHCI PCI PROTOCOLLO mouse CONTROLLER disk Ch ipset SCSI SLOT CONTROLLER AIC7 PROTOCOLLO SD Sistema reale AUTORI: Fiore Armando De Nicola Giuseppe L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 1. 10/15 Soluzione adottata da Linux inizialmente. Chiamata sequenziale delle funzioni di inizializzazione dei moduli, nell’ordine in cui comparivano nel codice. approccio piuttosto semplicistico; adatto a sistemi con pochi componenti; poco manutenibile con la crescita delle periferiche supportate; chiamate protette da una serie di #ifdef. 2. Seconda soluzione adottata. Introduzione di <linux/init.h>. Ogni modulo può dichiarare le proprie funzioni di inizializzazione; Automatizzazione dell’esecuzione delle funzioni di inizializzazione; Il corretto avvio del sistema dipendeva ancora dall’ordine in cui i file apparivano nel Makefile. Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 3. 11/15 Soluzione attuale. Introdotta in Linux-2.4 in uso in Linux-2.6. Meccanismo delle initcalls: la funzione di inizializzazione di ogni modulo viene dichiarata come initcall in modo che un suo puntatore e il suo codice oggetto vengano inserite nelle relative sezioni ELF; Uno dei vantaggi di questa tecnica è quello di evitare che il kernel venga compilato ogni volta che viene aggiunto un nuovo dispositivo; Si evita la lunga lista di chiamate alle funzioni di inizializzazione (lista di #ifdef); Il kernel diventa indipendente dall’implementazione delle funzioni dei moduli. Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 14/15 La funzione start_kernel chiama la funzione do_initcalls allo scopo di scorrere la lista dei puntatori per invocare le funzioni di inizializzazione; La versione 2-6 del kernel stabilisce un ordinamento tra le varie funzioni di inizializzazione; Sono definite 7 classi di initcalls. L’ordinamento relativo alle varie chiamate è garantito dal linker script usato per creare vmlinux (immagine del kernel), all’interno della quale sono definite le 7 classi di initcalls. Core; Postcore; Arch; Subsys; Fs; Device; Late. Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe IL FORMATO ELF 12/15 ELF acronimo di Execution and Linking Format. Formato di memorizzazione di moduli oggetto o moduli eseguibili; Prevede suddivisione in sezioni per moduli oggetto; Prevede suddivisione in segmenti per moduli eseguibili; libelf, libreria di gestione dei moduli memorizzati in formato ELF; Entrambi i formati presentano una parte fissa che contiene informazioni importanti per l’accesso alle altre parti del file: ELF header; Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe IL FORMATO ELF ELF header ELF header Program header table descrive il tipo di file oggetto (relocatable, executable, shared, core); Il tipo di architettura; La versione di ELF in uso; (optional) Section 1 … Section n … … 13/15 Program Header Table È una tabella che descrive i segmenti o le informazioni relative a come creare l’immagine di un processo eseguibile; Section header table Link view ELF header Program header table Segment 1 Section Esistono vari tipi di sezioni (1…n) descritte nella section header table; Contengono codice eseguibile, informazioni sui link dinamici, dati, dati per il debugg…; Usate per creare l’immagine eseguibile di un processo. … Segment n … … Section header table (optional) Execute view Segment Consente di raggruppare varie sezioni correlate Vari tipi di segmenti: segmento contenente dati, codice eseguibile, ecc… Section Header Table Tabella utilizzata per trovare le sezioni nel file oggetto; Memorizza informazioni sulle sezioni (nome, dimensione, tipo ecc…). Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe RIFERIMENTI 15/15 Linux magazine marzo 2004 www.linuxdidattica.org/docs/linuxmagazine/rubini_39.html Linux magazine maggio 2004 www.linuxdidattica.org/docs/linuxmagazine/rubini_41.html Linux device drivers www.oreilly.com/catalog/linuxdrive2/chapter/book www.linuxdidattica.org/docs/linuxmagazine/rubini_38.html www.cs.ucdavis.edu/~haungs/paper/node11.html Sistemi Operativi Mod.B: BOOTSTRAP DI UN SISTEMA OPERATIVO LINUX BASED AUTORI: Fiore Armando De Nicola Giuseppe