Come può compilarsi il kernel di Linux?


88

Non capisco bene il processo di compilazione del kernel Linux quando installo un sistema Linux sulla mia macchina.

Ecco alcune cose che mi hanno confuso:

  1. Il kernel è scritto in C, tuttavia come è stato compilato il kernel senza un compilatore installato?
  2. Se il compilatore C è installato sulla mia macchina prima che il kernel venga compilato, come può essere compilato il compilatore stesso senza un compilatore installato?

Sono stato così confuso per un paio di giorni, grazie per la risposta.


per quanto ne so il compilatore C è stato scritto in una sorta di assambler da alcune persone pazze e intelligenti dei laboratori AT&T per compilare UNIX per un dato computer (si noti che la storia inizia con UNIX, non con Linux, quindi temo che tu perdere un capitolo ... o più di loro!). Il racconto è che non c'era bisogno di riscrivere il kernel unix per computer diversi fintanto che quei computer hanno un compilatore appropriato per il linguaggio C. Quei compilatori sono stati scritti nell'assambler specifico dei computer di destinazione. Roughty dicendo "Primo compilatore scritto in assambler del computer dato, poi UNIX ha scritto in C"
Victor

Risposte:


208

Il primo giro di binari per la tua macchina Linux è stato costruito su qualche altra macchina Linux (probabilmente).

I binari per il primo sistema Linux sono stati costruiti su un'altra piattaforma.

I binari per quel computer possono risalire alla loro radice in un sistema originale che è stato costruito su un'altra piattaforma ancora .

...

Spingiti fino a questo punto e troverai compilatori costruiti con strumenti più primitivi, che a loro volta erano costruiti su macchine diverse dal loro host.

...

Continua a spingere e troverai computer costruiti in modo che le loro istruzioni possano essere inserite impostando gli interruttori sul pannello anteriore della macchina .

Roba molto interessante.

La regola è "costruire gli strumenti per costruire gli strumenti per costruire gli strumenti ...". Molto simile agli strumenti che gestiscono il nostro ambiente fisico. Conosciuto anche come "tirarsi su dai bootstraps".


3
Non necessariamente impuro. Solo non ottimizzato. il primo compilatore sarà ottimizzato per funzionare su 386, ma la versione ricompilata sarà ottimizzata per qualsiasi architettura tu abbia.
Breton

1
È possibile aggiungere un terzo stadio, se tutto va bene, l'uscita del secondo stadio dovrebbe essere uguale all'uscita del terzo stadio.
Ismael

27
Non è solo software, è hardware. Non c'è modo che un P4 (o anche un 486) possa essere costruito senza un computer.
BCS

1
@BCS: Oh, sì. Siamo arrivati ​​al punto in cui gli strumenti software e hardware sono profondamente interconnessi e interdipendenti.
dmckee --- gattino ex moderatore,

4
"Si scopre invariabilmente che un sistema complesso che funziona si è evoluto da un sistema semplice che funzionava". en.wikipedia.org/wiki/Gall's_law
ajuc

33

Penso che dovresti distinguere tra:

compile , v: per utilizzare un compilatore per elaborare il codice sorgente e produrre codice eseguibile [1] .

e

install , v: per connettersi, configurare o preparare qualcosa per l'uso [2] .

La compilazione produce eseguibili binari dal codice sorgente. L'installazione mette semplicemente quegli eseguibili binari nel posto giusto per eseguirli in seguito. Quindi, l'installazione e l'uso non richiedono la compilazione se i binari sono disponibili. Pensa a "compila" e "installa" come a "cucina" e "servi", di conseguenza.

Ora, le tue domande:

  1. Il kernel è scritto in C, tuttavia come è stato compilato il kernel senza un compilatore installato?

Il kernel non può essere compilato senza un compilatore, ma può essere installato da un binario compilato.

Di solito, quando installi un sistema operativo, installi un kernel precompilato (eseguibile binario). È stato compilato da qualcun altro. E solo se vuoi compilare il kernel da solo, hai bisogno del sorgente, del compilatore e di tutti gli altri strumenti.

Anche nelle distribuzioni "basate sui sorgenti" come gentoo si inizia eseguendo un binario compilato.

Quindi, puoi vivere tutta la tua vita senza compilare i kernel, perché li hai compilati da qualcun altro.

  1. Se il compilatore C è installato sulla mia macchina prima che il kernel venga compilato, come può essere compilato il compilatore stesso senza un compilatore installato?

Il compilatore non può essere eseguito se non è presente il kernel (OS). Quindi è necessario installare un file compilato kernel per eseguire il compilatore, ma non è necessario compilare il kernel stesso.

Ancora una volta, la pratica più comune è installare i binari compilati del compilatore e usarli per compilare qualsiasi altra cosa (incluso il compilatore stesso e il kernel).

Ora, problema di uova e pollo. Il primo binario è stato compilato da qualcun altro ... Vedi un'ottima risposta di dmckee.


14

Il termine che descrive questo fenomeno è bootstrap , è un concetto interessante su cui leggere. Se pensi allo sviluppo integrato, diventa chiaro che molti dispositivi, ad esempio sveglie, microonde, telecomandi, che richiedono un software non sono abbastanza potenti per compilare il proprio software. In effetti, questi tipi di dispositivi in ​​genere non dispongono di risorse sufficienti per eseguire in remoto qualcosa di complicato come un compilatore.

Il loro software viene sviluppato su una macchina desktop e quindi copiato una volta compilato.

Se questo genere di cose ti interessa, un articolo che mi viene in mente dalla cima della mia testa è: Reflections on Trusting Trust ( pdf ), è un classico e una lettura divertente.


1
Stai confondendo la cross-compilazione con il bootstrap. Il primo riguarda un compilatore che esiste solo su un PC e che crea codici operativi per l'architettura di destinazione. Ovviamente, non puoi farlo senza un altro computer, quindi c'è un dilemma pollo e uovo. La risposta al dilemma è il bootstrap, in cui un compilatore semplice scritto a mano o preesistente viene utilizzato per generare un compilatore più complesso.
Kevin Vermeer

12

Il kernel non si compila da solo: è compilato da un compilatore C nello spazio utente. Nella maggior parte delle architetture CPU, la CPU ha un numero di bit in registri speciali che rappresentano i privilegi di cui dispone il codice attualmente in esecuzione. In x86, questi sono i bit del livello di privilegio (CPL) correnti nel registro del segmento di codice (CS). Se i bit CPL sono 00, si dice che il codice sia in esecuzione nell'anello di sicurezza 0 , noto anche come modalità kernel . Se i bit CPL sono 11, si dice che il codice sia in esecuzione nell'anello di sicurezza 3 , noto anche come modalità utente . Le altre due combinazioni, 01 e 10 (anelli di sicurezza 1 e 2 rispettivamente) sono usate raramente.

Le regole su ciò che il codice può e non può fare in modalità utente rispetto alla modalità kernel sono piuttosto complicate, ma è sufficiente dire che la modalità utente ha privilegi notevolmente ridotti.

Ora, quando le persone parlano del kernel di un sistema operativo, si riferiscono alle parti del codice del sistema operativo che possono essere eseguite in modalità kernel con privilegi elevati. Generalmente, gli autori del kernel cercano di mantenere il kernel il più piccolo possibile per motivi di sicurezza, in modo che il codice che non necessita di privilegi aggiuntivi non li abbia.

Il compilatore C è un esempio di tale programma: non necessita dei privilegi aggiuntivi offerti dalla modalità kernel, quindi funziona in modalità utente, come la maggior parte degli altri programmi.

Nel caso di Linux, il kernel è costituito da due parti: il codice sorgente del kernel e l'eseguibile compilato del kernel. Qualsiasi macchina con un compilatore C può compilare il kernel dal codice sorgente nell'immagine binaria. La domanda, quindi, è cosa fare con quell'immagine binaria.

Quando installi Linux su un nuovo sistema, stai installando un'immagine binaria precompilata, di solito da un supporto fisico (come un CD DVD) o dalla rete. Il BIOS caricherà l '(immagine binaria del) bootloader del kernel dal supporto o dalla rete, quindi il bootloader installerà l' (immagine binaria del) kernel sul disco rigido. Quindi, quando riavvii, il BIOS carica il bootloader del kernel dal tuo disco rigido e il bootloader carica il kernel in memoria, e sei spento e in esecuzione.

Se vuoi ricompilare il tuo kernel, è un po 'più complicato, ma può essere fatto.


5

Quale c'era prima? la gallina o l'uovo?

Le uova esistono dai tempi dei dinosauri ..

..alcuni confondono tutto dicendo che i polli sono in realtà discendenti delle grandi bestie .. per farla breve: la tecnologia (uovo) esisteva prima del prodotto attuale (pollo)

Hai bisogno di un kernel per compilare un kernel, cioè ne costruisci uno con l'altro.

Il primo kernel può essere qualsiasi cosa tu voglia (preferibilmente qualcosa di sensato che possa creare il prodotto finale desiderato ^ __ ^)

Questo tutorial di Bran's Kernel Development ti insegna a sviluppare e costruire un piccolo kernel che puoi poi testare con una macchina virtuale di tua scelta.

Significato: scrivi e compili un kernel da qualche parte e lo leggi su una macchina virtuale vuota (senza sistema operativo).

Quello che succede con quelle installazioni Linux segue la stessa idea con maggiore complessità.


5

Non sono le tartarughe fino in fondo. Proprio come dici tu, non puoi compilare un sistema operativo che non è mai stato compilato prima su un sistema che esegue quel sistema operativo. Allo stesso modo, almeno la primissima build di un compilatore deve essere eseguita su un altro compilatore (e di solito anche alcune build successive, se quella prima build risulta non essere ancora in grado di compilare il proprio codice sorgente).

Penso che i primissimi kernel Linux siano stati compilati su una scatola Minix, anche se non ne sono certo. GCC era disponibile all'epoca. Uno dei primi obiettivi di molti sistemi operativi è quello di eseguire un compilatore abbastanza bene da compilare il proprio codice sorgente. Andando oltre, il primo compilatore era quasi certamente scritto in linguaggio assembly. I primi assemblatori furono scritti da quella povera gente che doveva scrivere in codice macchina grezzo.

Potresti voler controllare il progetto Linux From Scratch . In realtà crei due sistemi nel libro: un "sistema temporaneo" che è costruito su un sistema che non hai costruito tu stesso, e poi il "sistema LFS" che è costruito sul tuo sistema temporaneo. Il modo in cui il libro è attualmente scritto, in realtà costruisci il sistema temporaneo su un'altra macchina Linux, ma in teoria potresti adattarlo per costruire il sistema temporaneo su un sistema operativo completamente diverso.


1

Se capisco correttamente la tua domanda. Il kernel non "si compila da solo" in questi giorni. La maggior parte delle distribuzioni Linux oggi fornisce l'installazione del sistema tramite un live cd linux. Il kernel viene caricato dal CD in memoria e funziona normalmente come se fosse installato su disco. Con un ambiente Linux attivo e funzionante sul sistema è facile eseguire il commit dei file necessari sul disco.

Se stavi parlando del problema del bootstrap; dmckee lo ha riassunto abbastanza bene.

Sto solo offrendo un'altra possibilità ...

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.