B.4. Alcuni Compiti di cui si occupa il Kernel
B.4.1. Guidare l'Hardware
Il kernel ha, prima di tutto, il compito di controllare i componenti hardware, individuarli, avviarli quando il computer è acceso, e così via. Fornisce loro anche software di livello superiore con un'interfaccia di programmazione semplificata, cosicchè le applicazioni possono utilizzare i dispositivi senza doversi preoccupare di dettagli come ad esempio a quale slot di espansione è collegata la scheda aggiuntiva. L'interfaccia di programmazione prevede anche un livello di astrazione; questo permette al software di video-conferenza, ad esempio, di usare una webcam indipendentemente dalla sua marca e modello. Il software è in grado appena di utilizzare l'interfaccia Video for Linux (V4L), ed il kernel traduce le chiamate di funzione di questa interfaccia nei comandi hardware effettivi necessari alla specifica webcam in uso.
Il kernel esporta molti dettagli sull'hardware rilevato attraverso i filesystem virtuali
/proc/
and
/sys/
. Diversi strumenti riassumono questi dettagli. Tra questi,
lspci
(nel pacchetto
pciutils) elenca i dispositivi PCI,
lsusb
(nel pacchetto
usbutils) elenca i dispositivi USB, e
lspcmcia
(nel pacchetto
pcmciautils) elenca i dispositivi PCMCIA. Questi strumenti sono molto utili per identificare il modello esatto di un dispositivo. Questa identificazione permette anche di effettuare ricerche più precise sul web che, a loro volta, portano a documenti più pertinenti.
Esempio B.1. Esempio di informazioni fornite da lspci
e lsusb
$
lspci
[...]
00:02.1 Display controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03)
00:1c.0 PCI bridge: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 (rev 03)
00:1d.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 03)
[...]
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5751 Gigabit Ethernet PCI Express (rev 01)
02:03.0 Network controller: Intel Corporation PRO/Wireless 2200BG Network Connection (rev 05)
$
lsusb
Bus 005 Device 004: ID 413c:a005 Dell Computer Corp.
Bus 005 Device 008: ID 413c:9001 Dell Computer Corp.
Bus 005 Device 007: ID 045e:00dd Microsoft Corp.
Bus 005 Device 006: ID 046d:c03d Logitech, Inc.
[...]
Bus 002 Device 004: ID 413c:8103 Dell Computer Corp. Wireless 350 Bluetooth
Questi programmi hanno un'opzione -v
, che riporta informazioni molto più dettagliate (ma di solito non è necessario). Infine, il comando lsdev
(nel pacchetto procinfo) elenca le risorse di comunicazione utilizzate dai dispositivi.
Le applicazioni spesso accedono ai dispositivi per mezzo di file speciali creati all'interno della cartella
/dev/
(vedi riquadro
FONDAMENTALI Permessi di accesso ai dispositivi). Si tratta di file speciali che rappresentano le unità disco (per esempio,
/dev/hda
e
/dev/sdc
), le partizioni(
/dev/hda1
o
/dev/sdc3
), i mouse (
/dev/input/mouse0
), le tastiere (
/dev/input/event0
), le schede audio (
/dev/snd/*
), le porte seriali (
/dev/ttyS*
), e così via.
I filesystem sono uno degli aspetti più importanti del kernel. I sistemi unix uniscono tutti gli archivi in un'unica gerarchia, che permette agli utenti (ed alle applicazioni) di accedere ai dati semplicemente conoscendo la loro posizione all'interno di tale gerarchia.
Il punto di partenza di questo albero gerarchico è chiamato radice (root), /
. Questa directory può contenere sottodirectory. Ad esempio, la directory home
sottodirectory di /
è chiamata /home/
. Questa sottodirectory può, a sua volta, contiene altre sottodirectory, e così via. Ogni directory può contenere anche file, in cui verranno memorizzati i dati effettivi. Così, il nome /home/marco/Scrivania/ciao.txt
si riferisce ad un file chiamato ciao.txt
memorizzato in Scrivania
sottodirectory di marco
sottodirectory della directory home
presente nella radice. Il kernel fa la traduzione tra questo sistema di denominazione e la reale, fisica archiviazione su un disco.
A differenza di altri sistemi, c'è solo un tale gerarchia, e può integrare dati da più dischi. Uno di questi dischi è usato come radice, e gli altri sono "montati" sulle directory nella gerarchia (il comando Unix è chiamato mount
); questi altri dischi sono poi disponibili sotto questi "punti di montaggio". Questo permette di memorizzare le directory home degli utenti (di solito memorizzate all'interno di /home/
) su un secondo hard disk, che conterrà le directory marco
e grazia
. Una volta che il disco è montato in /home/
, queste directory diventano accessibili alle loro solite posizioni, e percorsi come /home/marco/Scrivania/ciao.txt
continueranno a funzionare.
Ci sono molti formati di filesystem, che corrispondono a molti modi per memorizzare fisicamente i dati sui dischi. I più conosciuti sono ext2, ext3 ed ext4, ma ne esistono altri. Ad esempio, vfat è il sistema che è stato storicamente utilizzato dai sistemi operativi DOS e Windows, e che consente di utilizzare i disci rigidi sotto Debian così come in Windows. In questo caso, il filesystem deve essere preparato sul disco prima che venga montato e questa operazione è nota come "formattazione". I comandi come mkfs.ext3
(dove mkfs
sta per MaKe FileSystem) gestiscono la formattazione. Questi comandi richiedono, come parametro, un file del dispositivo che rappresenta la partizione che deve essere formattata (per esempio, /dev/sda1
). Questa operazione è distruttiva e deve essere eseguita una sola volta, a meno che non si voglia deliberatamente ripulire un filesystem e ricominciare da capo.
Ci sono anche i file system di rete, come
NFS, in cui i dati non sono memorizzati su un disco locale. Invece, i dati vengono trasmessi attraverso la rete a un server che li memorizza e li recupera su richiesta. L'astrazione del filesystem protegge gli utenti dal dover fare attenzione: i file rimangono di solito accessibili in modo gerarchico.
B.4.3. Funzioni Condivise
Dal momento che un certo numero di stesse funzioni è utilizzato da tutti i software, ha senso che vengano centralizzate nel kernel. Ad esempio, la gestione del file system condiviso permette a qualsiasi applicazione semplicemente aprire un file per nome, senza la necessità di preoccuparsi del modo in cui il file è memorizzato fisicamente. Il file può essere memorizzato in parecchie parti diverse su un disco rigido, o diviso su più dischi rigidi, o anche memorizzato su un file server remoto. Le funzioni di comunicazione condivise vengono utilizzate dalle applicazioni per scambiare dati indipendentemente dal modo in cui i dati vengono trasportati. Per esempio, il trasporto potrebbe avvenire su qualsiasi combinazione di reti locali o wireless, o su un telefono fisso.
Un processo è un'istanza di un programma in esecuzione. Ciò richiede memoria per memorizzare sia il programma che i suoi dati in esecuzione. Il kermel si occupa della creazione e del loro monitoraggio. Quando un programma viene eseguito, il kernel prima mette da parte un pò di memoria, quindi carica il codice eseguibile dal filesystem in esso, e poi avvia l'esecuzione del codice. Mantiene le informazioni su questo processo, delle quali la più visibile è il numero identificativo conosciuto come pid (process identifier).
I kernel Unix-like (incluso Linux), come la maggior parte dei sistemi operativi moderni, sono “multi-tasking”. In altre parole, permettono l'esecuzione di molti processi "contemporaneamente". In realtà c'è solo un processo in esecuzione in un dato momento, ma il kernel fraziona il tempo in intervalli ed esegue ogni processo a turno. Poiché questi intervalli di tempo sono molto brevi (in millisecondi), creano l'illusione di processi in esecuzione in parallelo, anche se in realtà sono attivi solo durante alcuni intervalli di tempo e inattivi il resto del tempo. Il lavoro del kernel è quello di regolare il suo meccanismo di pianificazione per mantenere questa illusione, massimizzando le prestazioni globali del sistema. Se gli intervalli di tempo sono troppo lunghi, l'applicazione potrebbe non mostrarsi così reattiva come si desidera. Se sono troppo brevi, il sitema perde tempo a passare da un lavoro (task) ad un'altro così di frequente. queste decisioni possono essere modificate attraverso le priorità dei processi. I processi ad alta priorità verranno eseguiti per più tempo e con intervalli più frequenti rispetto ai processi a bassa priorità.
Naturalmente, il kernel permette di eseguire diverse istanze indipendenti dello stesso programma. Ma ciascuno può accedere solo ai propri intervalli di tempo e memoria. I loro dati rimangono quindi indipendenti.
B.4.5. Gestione dei Diritti
I sistemi Unix-like sono anche multi-utente. Essi forniscono un sistema di gestione dei diritti che supporta utenti e gruppi separati; permette anche il controllo sulle azioni basate sulle autorizzazioni. Il kernel gestisce i dati per ogni processo, permettendo di controllare i permessi. La maggior parte del tempo, il processo è identificato dall'utente che lo ha iniziato. Tale processo è consentito solo per rendere quelle azioni disponibili al suo proprietario. Ad esempio, il tentativo di aprire un file richiede che il kernel controlli l'identità del processo contro le autorizzazioni di accesso (per maggiori dettagli su questo particolare esempio, vedere
Sezione 9.3, «Gestione dei permessi»).