seminario di sistemi operativi il bootstrap

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