Cosa contiene un albero dei sorgenti del kernel? Questo è legato alle intestazioni del kernel Linux?


25

Nei libri, io di solito leggo i riferimenti al l'albero dei sorgenti Linux /usr/src/linuxcon la solita serie di sottodirectory ( arch, block, crypto, ...).

Mi aspettavo che questo albero contenesse i file binari che compongono il kernel. Nel mio sistema (Ubuntu 10.04) ...

  1. per i diversi kernel che ho (usando download di software automatizzati, non installati manualmente), trovo in questa posizione invece due sottodirectory per ciascun kernel come segue:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. Nelle sottodirectory mi aspettavo file binari, tra gli altri. Tuttavia, ho controllato una buona parte dell'albero, e l'ultima sottodirectory da qui sembra avere sempre un Makefile(durante la lettura, in genere suona più come un file di configurazione che un file di installazione), oltre a occasionalmente alcuni altri file isolati (principalmente Kconfig).

La mia domanda potrebbe essere ingenua, ma sono un po 'confuso. È (2) quello che dovrei aspettarmi di vedere nell'albero dei sorgenti del kernel; e perché ho il riferimento esplicito alle "intestazioni"? Avevo bisogno di installare linux-generic-headersqualche tempo fa per qualche altro software e non sono sicuro se questo potrebbe essere correlato. Mi rendo conto che c'è una buona ragione per i makefile (ad esempio, per installare i moduli nella sottodirectory / driver), ma (praticamente) solo i makefile?

Risposte:


30

I kernel-headerpacchetti di distribuzione contengono, come suggerisce il nome, solo file di intestazione del kernel (oltre all'impianto idraulico necessario) necessari per compilare software come i moduli del kernel.

Non dovresti aspettarti di trovare file binari in una directory sorgente del kernel , ad eccezione dell'output di compilazione. (Se configuri e costruisci un kernel da solo, la directory sorgente del kernel conterrà anche gli oggetti compilati, i moduli, il kernel stesso e alcuni altri bit e pezzi binari che lo fanno funzionare.) I
KConfigfile sono una descrizione delle opzioni di configurazione del kernel (e le relative dipendenze) disponibili per una determinata directory / modulo.
A parte questo, è tutto (principalmente) codice sorgente C, file header e Makefiles. Ci sono alcuni script di supporto qua e là e anche la fonte dell'assembly.

I pacchetti di intestazioni (quello che hai installato) contengono solo la parte di intestazione di cui sopra (e non tutto ciò - solo le intestazioni "esportate") e alcune delle infrastrutture di compilazione. Quindi è previsto ciò che stai vedendo. I pacchetti di intestazioni non contengono codice sorgente C (ad eccezione di alcuni stub e codice infrastruttura build). Il punto centrale di avere questo tipo di pacchetto è risparmiare spazio (e larghezza di banda) - l'intero albero dei sorgenti del kernel Linux è piuttosto grande e completamente inutile se non si intende compilare il kernel da soli. I pacchetti di intestazione sono costruiti e spediti dalle distribuzioni per fornire le cose giuste necessarie per costruire i moduli, ma non di più. (Certamente non contengono il kernel compilato.)

Rispondere al tuo commento: i pacchetti di intestazione non si spostano da nessuna parte. Sono creati per versioni specifiche del kernel, impacchettati in una directory specifica e basta. È solo un insieme di file. (Si noti che i pacchetti di intestazione non hanno necessariamente la stessa versione dei pacchetti binari correnti del kernel stabile - i pacchetti di intestazione sono generici e possono rimanere indietro rispetto al kernel reale in esecuzione. Tuttavia, non dovrebbero provenire da un kernel versione più recente dell'attuale kernel installato (o di destinazione).)

I binari del kernel installati sono generalmente installati nella /bootdirectory, insieme ai file binari del bootloader e ai file di configurazione. (Questo a volte è un filesystem indipendente, non montato per impostazione predefinita.) Il nome esatto dei file dipende dal kernel e dalla distribuzione. (Anche il bootloader.)

I moduli del kernel installati risiedono in sottodirectory di:

/lib/modules/`uname -r`/

Quindi, per esempio sul mio sistema, sono attualmente in

/lib/modules/3.1.4-gentoo/

Codice sorgente completo del kernel : su Ubuntu, se vuoi che le fonti complete del kernel costruiscano tu stesso un kernel, dovresti installarlo seguendo le istruzioni qui .

Puoi anche scaricare un tarball sorgente da kernel.orge decomprimerlo da qualche parte ( non sovrascrivere i file installati su Ubuntu se usi questo tarball, mantieni separati i tuoi oggetti personali e quelli gestiti da RPM).

/usr/src/linuxè un posto tradizionale dove mettere i sorgenti del kernel, ma nulla ti impedisce di collocare fonti del kernel altrove. Questo percorso è spesso anche solo un collegamento simbolico a una directory. ad esempio, ho questo sul mio computer:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

Il link simbolico è lì per semplificare la creazione di applicazioni che dipendono dal sorgente del kernel. Colleghi quel percorso al tuo kernel in esecuzione (o destinazione) in modo da non dover specificare la versione esatta o le informazioni sul percorso quando compili un modulo fuori dall'albero. Aiuta almeno un sacco per le distribuzioni basate sulla fonte.


Grazie mille per questa risposta dettagliata e piuttosto completa. Questo mi aveva infastidito per un po '. Se non sto estendendo troppo il mio benvenuto, e se trovi il tempo, potrei gentilmente aggiungere, seguendo: (a) Ho letto quanto sopra che nel mio caso (kernel non autoinstallato), alcuni (uno) del sub le directory dovrebbero (potrebbero) contenere il codice sorgente del kernel C e Assembler. Dove sarebbe - non un elenco completo, solo come nella mia navigazione di forse 20-30 delle sottodirectory, non ne ho mai trovato uno? Ho scaricato i file sorgente del kernel da kernel.org; Intendo solo capire meglio il mio sistema. (b) ...
gnometorule,

... quindi dove (genericamente) si trovano i binari del kernel quando non si installa il kernel da soli, come nel mio caso? (c) Ti riferisci ai "pacchetti header" che ho preso come "linux-generic-headers". L'albero che vedo da quei pacchetti? Se sì, si trasferiscono ovunque si trovasse l'albero dei sorgenti prima di installarli? Mille grazie ancora.
gnometorule,

(se rispondi, usa 'rispondi' non commentare, così posso almeno votarti di nuovo per il tuo aiuto)
gnometorule,

Espanso un po '. I pacchetti di intestazioni sono per intestazioni. I pacchetti full source forniscono il codice sorgente completo. I pacchetti binari forniscono solo file binari.
Mat

5
linux-sourcecontiene il sorgente upstream, apt-get source linux-image-$(uname -r)ottiene il sorgente per il kernel con le patch di Ubuntu.
Lekensteyn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.