1 / 16

SEMINARIO DI SISTEMI OPERATIVI

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 mat: 566/1174 G. De Nicola mat: 566/1175. ARGOMENTI TRATTATI. 1/15. Il BOOTSTRAP:

mairi
Download Presentation

SEMINARIO DI SISTEMI OPERATIVI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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 mat: 566/1174 G. De Nicola mat: 566/1175

  2. 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

  3. 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;

  4. 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.

  5. Boot-loader Area di memoria non visibile Area di memoria visibile setup Spazio di I/O BIOS Kernel compattato Kernel scompattato Boot sector Locazione in esecuzione L’AVVIO DI UN SISTEMA 4/15 0x100000 I/O space 0xA0000 All’istante T5, infine non resta che caricare in memoria bassa (da 0x10000 a 0x90000) il kernel compresso. All’istante T2, partendo dall’indirizzo 0x7c00, viene caricato un settore di 512 byte che rappresentano per 448 byte il boot-loader e per i restanti 64 byte, la tabella delle partizioni. Tale settore risiede nella parte iniziale del dispositivo di avvio che nel caso dell’hard disk nel MBR(Master Boot Record). Infatti ogni disco rigido possiede un MBR e per ogni sua partizione può possedere un boot sector dove può risiedere un boot-loader secondario. Il primo passo sarà quello di descrivere il diagramma; sulle ascisse verrà rappresentato il tempo, mentre sulle ordinate le celle di memoria. I rispettivi colori rappresenteranno i vari programmi che saranno caricati in memoria. Il loro significato e riportato nel riquadro superiore. Come abbiamo gia detto quando viene generato il segnale di reset, il processore si trasforma in una CPU a 16 bit capace di indirizzare al massimo 1 Mb di memoria. Ciò deriva dal fatto che la procedura, che andremo a descrivere, è stata ideata per la prima volta per macchine con processore 386 con 1Mb di memoria. Si è conservata anche per processori superiori per motivi di compatibilità. All’istante T0 il reset avvia la CPU ad eseguire istruzioni sotto la sfoglia del Mb allo scopo di portare in memoria il BIOS. Esso viene caricato nella parte iniziale della memoria fino al indirizzo 0x7c00 e durante la sua esecuzione si stabilisce quale dispositivo deve essere preso in considerazione per caricare le informazioni successive (loader e kernel). Tale scelta e influenzabile dall’utente tramite la configurazione del BIOS. All’istante T4 , a partire dall’indirizzo 0x90200 vengono caricati i file setup.S e video.S. Il loro ruolo è quello di prelevare dal BIOS informazioni sul sistema, come la mappa di memoria, per renderle disponibili al kernel secondo un formato prestabilito. All’istante T6, il codice di setup (setup.S video.S), una volta prelevate le informazioni dal BIOS, attiva la modalità protetta della CPU, uscendo quindi dalla compatibilità 8086 e abilitando la gestione di tutta la memoria disponibile. Libera la memoria dal BIOS e posiziona, all’inizio della memoria, il kernel compresso. All’istante T7 e T8, inizia cosi l’esecuzione del kernel vero e proprio tramite il codice contenuto nel file head.S, tramite il quale viene richiamato anche il decompressore del kernel. L’esecuzione di tale codice azzera il contenuto di memoria BSS (segmento di memoria atto a contenere le variabili non inizializzate di un processo), predispone le strutture dati per la paginazione e abilità la MMU per poi mandare in esecuzione la funzione start_kernel, definita in init/main.c Va in esecuzione il boot-loader, che effettua una scansione della tabella delle partizioni per identificare quale di essa è quella attiva, caricando in memoria il contenuto del suo boot sector all’indirizzo 0x90000. Da questo indirizzo fino a 0x90200 carica il contenuto del boot sector (nel caso particolare di Linux viene caricato il file bootsect.S contenete informazioni importanti per il sistema) che permette di identificare il codice necessario alla decompressione del kernel nonché il kernel stesso. L’esecuzione passa a bootsect.S. 0x90000 0x10000 0x7c000 0x1000 0x0 T5 T6 T4 T0 T2 T3 T7 T8 T1

  6. 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.

  7. UTENTE 1 UTENTE 2 SO kernel sottosistemi Architettura hd 1 Architettura hd 2 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.

  8. Sottosistema USB funzionalità IS1 IS2 ISn comunicazione P1 P2 Pn 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.

  9. Sottosistema USB interfaccia interfaccia driver controllore hardware periferiche 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.

  10. User Space User Space Kernel Proper Kernel Proper USB SCSI INPUT USB SCSI CONTROLLER PROTOCOLLO CONTROLLER PROTOCOLLO CONTROLLER PROTOCOLLO CONTROLLER PROTOCOLLO PCI UHCI AHA1 EHCI AIC7 ST mouse SD disk UHCI mouse disk Ch ipset AIC7 SD CONTROLLER SLOT Sistema ideale Sistema reale 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.

  11. L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 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. • 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.

  12. L’INIZIALIZZAZIONE DEI SOTTOSISTEMI 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.

  13. 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.

  14. 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: ELFheader;

  15. ELF header Program header table (optional) Link view Section 1 ELF header … Program header table Section n Segment 1 … … Segment n … … … Section header table Section header table (optional) Execute view IL FORMATO ELF 13/15 • ELF header • descrive il tipo di file oggetto (relocatable, executable, shared, core); • Il tipo di architettura; • La versione di ELF in uso; • Program Header Table • È una tabella che descrive i segmenti o le informazioni relative a come creare l’immagine di un processo eseguibile; • 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 • 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…).

  16. 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

More Related