Wie kann sich der Linux-Kernel selbst kompilieren?

88

Ich verstehe den Kompilierungsprozess des Linux-Kernels nicht ganz, wenn ich ein Linux-System auf meinem Computer installiere.

Hier sind einige Dinge, die mich verwirrt haben:

  1. Der Kernel ist in C geschrieben. Wie wurde der Kernel jedoch ohne installierten Compiler kompiliert?
  2. Wenn der C-Compiler vor dem Kompilieren des Kernels auf meinem Computer installiert ist, wie kann der Compiler selbst kompiliert werden, ohne dass ein Compiler installiert ist?

Ich war ein paar Tage so verwirrt, danke für die Antwort.

MainID
quelle
Soweit bekannt, wurde der C-Compiler von verrückten und cleveren Leuten in den AT & T-Labors in einer Art Assambler geschrieben, um UNIX für einen bestimmten Computer zu kompilieren (beachten Sie, dass die Geschichte mit UNIX beginnt, nicht mit Linux, also fürchte ich Sie verpasse ein Kapitel ... oder mehrere davon!). Die Kurzgeschichte ist, dass es nicht notwendig war, den Unix-Kernel für verschiedene Computer neu zu schreiben, solange diese Computer über einen geeigneten Compiler für die C-Sprache verfügen. Diese Compiler wurden in den spezifischen Assambler der Zielcomputer geschrieben. Roughty sagt: "Zuerst Compiler in Assambler des gegebenen Computers geschrieben, dann UNIX in C geschrieben"
Victor

Antworten:

208

Die erste Runde der Binärdateien für Ihre Linux-Box wurde (wahrscheinlich) auf einer anderen Linux-Box erstellt.

Die Binärdateien für das erste Linux-System wurden auf einer anderen Plattform erstellt.

Die Binärdateien für diesen Computer können ihren Stamm auf ein ursprüngliches System zurückführen, das auf einer weiteren Plattform erstellt wurde.

...

Wenn Sie so weit gehen, finden Sie Compiler, die mit primitiveren Tools erstellt wurden, die wiederum auf anderen Computern als ihrem Host erstellt wurden.

...

Drücken Sie weiter und Sie finden Computer, die so gebaut sind, dass ihre Anweisungen durch Einstellen von Schaltern an der Vorderseite des Geräts eingegeben werden können .

Sehr cooles Zeug.

Die Regel lautet "Erstellen Sie die Tools, um die Tools zu erstellen, um die Tools zu erstellen ...". Sehr ähnlich den Tools, mit denen unsere physische Umgebung betrieben wird. Auch bekannt als "Ziehen Sie sich an den Bootstraps hoch".

dmckee --- Ex-Moderator Kätzchen
quelle
3
Nicht unbedingt unrein. Einfach nicht optimiert. Der erste Compiler wird für die Arbeit mit 386 optimiert, die neu kompilierte Version jedoch für jede Architektur.
Breton
1
Sie können eine dritte Stufe hinzufügen. Wenn alles in Ordnung ist, sollte der Ausgang der zweiten Stufe dem Ausgang der dritten Stufe entsprechen.
Ismael
27
Es ist nicht nur Software, es ist Hardware zu. Ohne Computer kann so etwas wie ein P4 (oder sogar ein 486) nicht gebaut werden.
BCS
1
@BCS: Oh ja. Wir haben den Punkt erreicht, an dem Software- und Hardwaretools eng miteinander verbunden und voneinander abhängig sind.
dmckee --- Ex-Moderator Kätzchen
4
"Ein komplexes System, das funktioniert, hat sich aus einem einfachen System entwickelt, das funktioniert hat." en.wikipedia.org/wiki/Gall's_law
Ajuc
33

Ich denke, Sie sollten unterscheiden zwischen:

compile , v: Verwenden eines Compilers zum Verarbeiten des Quellcodes und zum Erstellen von ausführbarem Code [1] .

und

install , v: Um eine Verbindung herzustellen, einzurichten oder vorzubereiten [2] .

Die Kompilierung erzeugt binäre ausführbare Dateien aus dem Quellcode. Durch die Installation werden diese ausführbaren Binärdateien lediglich an der richtigen Stelle platziert, um sie später auszuführen. Installation und Verwendung erfordern daher keine Kompilierung, wenn die Binärdateien verfügbar sind. Denken Sie an "Kompilieren" und "Installieren" wie an "Kochen" und "Servieren" entsprechend.

Nun Ihre Fragen:

  1. Der Kernel ist in C geschrieben. Wie wurde der Kernel jedoch ohne installierten Compiler kompiliert?

Der Kernel kann nicht ohne Compiler kompiliert werden, aber er kann aus einer kompilierten Binärdatei installiert werden .

Wenn Sie ein Betriebssystem installieren, installieren Sie normalerweise einen vorkompilierten Kernel (binäre ausführbare Datei). Es wurde von jemand anderem zusammengestellt. Und nur wenn Sie den Kernel selbst kompilieren möchten, benötigen Sie die Quelle, den Compiler und alle anderen Tools.

Selbst in "quellenbasierten" Distributionen wie gentoo wird zunächst eine kompilierte Binärdatei ausgeführt.

Sie können also Ihr ganzes Leben lang leben, ohne Kernel zu kompilieren, weil Sie sie von jemand anderem kompilieren lassen.

  1. Wenn der C-Compiler vor dem Kompilieren des Kernels auf meinem Computer installiert ist, wie kann der Compiler selbst kompiliert werden, ohne dass ein Compiler installiert ist?

Der Compiler kann nicht ausgeführt werden, wenn kein Kernel (OS) vorhanden ist. Man muss also einen kompilierten Kernel installieren , um den Compiler auszuführen, muss den Kernel aber nicht selbst kompilieren .

Wiederum besteht die gängigste Praxis darin, kompilierte Binärdateien des Compilers zu installieren und sie zum Kompilieren aller anderen Elemente (einschließlich des Compilers selbst und des Kernels) zu verwenden.

Nun, Henne-Ei-Problem. Die erste Binärdatei wird von jemand anderem kompiliert ... Siehe eine ausgezeichnete Antwort von dmckee.

Sastanin
quelle
14

Der Begriff, der dieses Phänomen beschreibt, ist Bootstrapping . Es ist ein interessantes Konzept, über das man sich informieren kann. Wenn Sie an die Embedded-Entwicklung denken, wird deutlich, dass viele Geräte, z. B. Wecker, Mikrowellen und Fernbedienungen, für die Software erforderlich ist, nicht leistungsfähig genug sind, um ihre eigene Software zu kompilieren. Tatsächlich verfügen diese Arten von Geräten normalerweise nicht über genügend Ressourcen, um etwas so Kompliziertes wie einen Compiler auszuführen.

Ihre Software wird auf einem Desktop-Computer entwickelt und nach dem Kompilieren kopiert.

Wenn Sie so etwas interessiert, ist ein Artikel, der mir auf den ersten Blick einfällt: Reflections on Trusting Trust ( pdf ), ein Klassiker und eine unterhaltsame Lektüre.

a2800276
quelle
1
Sie verwechseln Cross-Compiling mit Bootstrapping. Der erste betrifft einen Compiler, der nur auf einem PC vorhanden ist und Opcodes für die Zielarchitektur erstellt. Natürlich kann man das nicht ohne einen anderen Computer machen, also gibt es ein Henne-Ei-Dilemma. Die Antwort auf das Dilemma ist Bootstrapping, bei dem ein handgeschriebener oder bereits vorhandener einfacher Compiler verwendet wird, um einen komplexeren Compiler zu generieren.
Kevin Vermeer
12

Der Kernel kompiliert sich nicht selbst - er wird von einem C-Compiler im Userspace kompiliert. In den meisten CPU-Architekturen verfügt die CPU über eine Reihe von Bits in speziellen Registern, die angeben, über welche Berechtigungen der aktuell ausgeführte Code verfügt. In x86 sind dies die aktuellen CPL-Werte ( Privilege Level Bits) im CS-Register ( Code Segment ). Wenn die CPL-Bits 00 sind, wird der Code im Sicherheitsring 0 ausgeführt , der auch als Kernel-Modus bezeichnet wird . Wenn die CPL-Bits 11 sind, wird der Code im Sicherheitsring 3 ausgeführt , der auch als Benutzermodus bezeichnet wird . Die beiden anderen Kombinationen 01 und 10 (Sicherheitsringe 1 bzw. 2) werden selten verwendet.

Die Regeln darüber, was Code im Benutzermodus im Vergleich zum Kernelmodus tun kann und was nicht, sind ziemlich kompliziert, aber es reicht zu sagen, dass der Benutzermodus die Berechtigungen stark eingeschränkt hat.

Wenn Leute über den Kernel eines Betriebssystems sprechen, beziehen sie sich auf die Teile des Betriebssystemcodes, die im Kernelmodus mit erhöhten Berechtigungen ausgeführt werden können. Im Allgemeinen versuchen die Kernelautoren, den Kernel aus Sicherheitsgründen so klein wie möglich zu halten, damit Code, der keine zusätzlichen Berechtigungen benötigt, diese nicht hat.

Der C-Compiler ist ein Beispiel für ein solches Programm. Er benötigt keine zusätzlichen Berechtigungen, die der Kernelmodus bietet, und wird daher wie die meisten anderen Programme im Benutzermodus ausgeführt.

Unter Linux besteht der Kernel aus zwei Teilen: dem Quellcode des Kernels und der kompilierten ausführbaren Datei des Kernels. Jeder Computer mit einem C-Compiler kann den Kernel aus dem Quellcode in das Binärbild kompilieren. Die Frage ist also, was mit diesem Binärbild zu tun ist.

Wenn Sie Linux auf einem neuen System installieren, installieren Sie ein vorkompiliertes Binär-Image, normalerweise entweder von einem physischen Medium (z. B. einer CD-DVD) oder vom Netzwerk. Das BIOS lädt den (binären Abbild des) Kernel-Bootloaders vom Medium oder Netzwerk, und dann installiert der Bootloader den (binären Abbild des) Kernels auf Ihrer Festplatte. Wenn Sie dann neu starten, lädt das BIOS den Bootloader des Kernels von Ihrer Festplatte, und der Bootloader lädt den Kernel in den Speicher, und Sie können loslegen.

Wenn Sie Ihren eigenen Kernel neu kompilieren möchten , ist das etwas schwieriger, aber es kann getan werden.

Adam Rosenfield
quelle
5

Welches war zuerst da? das Huhn oder das Ei?

Eier gibt es seit der Zeit der Dinosaurier.

..einige verwirren alles, indem sie sagen, dass Hühner tatsächlich Nachkommen der großen Bestien sind .. lange Rede, kurzer Sinn: Die Technologie (Ei) existierte vor dem aktuellen Produkt (Huhn)

Sie benötigen einen Kernel, um einen Kernel zu erstellen, dh Sie erstellen einen mit dem anderen.

Der erste Kernel kann alles sein, was Sie wollen (vorzugsweise etwas Sinnvolles, das Ihr gewünschtes Endprodukt erzeugen kann ^ __ ^)

In diesem Tutorial aus Brans Kernel-Entwicklung lernen Sie, einen kleinen Kernel zu entwickeln und zu erstellen, den Sie dann mit einer virtuellen Maschine Ihrer Wahl testen können.

Das heißt: Sie schreiben und kompilieren einen Kernel irgendwo und lesen ihn auf einer leeren virtuellen Maschine (ohne Betriebssystem).

Was mit diesen Linux-Installationen passiert, folgt der gleichen Idee mit zusätzlicher Komplexität.

Ric Tokyo
quelle
5

Es sind keine Schildkröten ganz unten. Wie Sie bereits sagten, können Sie ein Betriebssystem, das noch nie zuvor kompiliert wurde, nicht auf einem System kompilieren, auf dem dieses Betriebssystem ausgeführt wird. Ebenso muss mindestens der allererste Build eines Compilers auf einem anderen Compiler ausgeführt werden (und normalerweise auch einige nachfolgende Builds, wenn sich herausstellt, dass dieser erste Build noch keinen eigenen Quellcode kompilieren kann).

Ich denke, die allerersten Linux-Kernel wurden auf einer Minix-Box kompiliert, obwohl ich mir nicht sicher bin. GCC war zu diesem Zeitpunkt verfügbar. Eines der ersten Ziele vieler Betriebssysteme ist es, einen Compiler gut genug auszuführen, um seinen eigenen Quellcode zu kompilieren. Der erste Compiler wurde mit ziemlicher Sicherheit in Assemblersprache geschrieben. Die ersten Assembler wurden von den armen Leuten geschrieben, die in rohen Maschinencode schreiben mussten.

Möglicherweise möchten Sie das Linux From Scratch- Projekt überprüfen . Sie erstellen tatsächlich zwei Systeme in diesem Buch: ein "temporäres System", das auf einem System basiert, das Sie nicht selbst erstellt haben, und dann das "LFS-System", das auf Ihrem temporären System erstellt wurde. So wie das Buch derzeit geschrieben ist, erstellen Sie das temporäre System tatsächlich auf einer anderen Linux-Box, aber theoretisch können Sie es anpassen, um das temporäre System auf einem völlig anderen Betriebssystem zu erstellen.

Der Löffel
quelle
1

Wenn ich Ihre Frage richtig verstehe. Der Kernel "kompiliert" sich heutzutage nicht mehr. Die meisten Linux-Distributionen bieten heute die Systeminstallation über eine Linux-Live-CD an. Der Kernel wird von der CD in den Speicher geladen und funktioniert wie gewohnt, als wäre er auf der Festplatte installiert. In einer Linux-Umgebung, die auf Ihrem System ausgeführt wird, ist es einfach, die erforderlichen Dateien auf Ihre Festplatte zu übertragen.

Wenn Sie über das Bootstrapping-Problem gesprochen haben; dmckee fasste es ziemlich nett zusammen.

Nur eine andere Möglichkeit anbieten ...

in70x
quelle