Wie kann sich der Linux-Kernel selbst kompilieren?

Lesezeit: 9 Minuten

Benutzeravatar von MainID
HauptID

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

Hier sind einige Dinge, die mich verwirrt haben:

  1. Der Kernel ist in C geschrieben, aber wie wurde der Kernel kompiliert, ohne dass ein Compiler installiert war?
  2. Wenn der C-Compiler auf meiner Maschine installiert wird, bevor der Kernel kompiliert wird, 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.

  • Soweit bekannt, wurde der C-Compiler von einigen verrückten und cleveren Leuten in den AT&T-Labors in einer Art Assembler geschrieben, um UNIX für einen bestimmten Computer zu kompilieren (beachten Sie, dass die Geschichte mit UNIX begann, nicht mit Linux, also fürchte ich Sie ein Kapitel verpassen… oder gleich mehrere!). Die Kurzgeschichte ist, dass es nicht nötig war, den Unix-Kernel für verschiedene Computer neu zu schreiben, solange diese Computer über einen geeigneten Compiler für die Sprache C verfügen. Diese Compiler wurden in den spezifischen Assembler der Zielcomputer geschrieben. Grobes Sprichwort “Zuerst Compiler im Assembler des gegebenen Computers geschrieben, dann UNIX in C geschrieben”

    – Viktor

    27. März 2020 um 20:30 Uhr


dmckee --- Benutzeravatar des Ex-Moderators Kitten
dmckee — Ex-Moderator-Kätzchen

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 einigen erstellt Sonstiges Plattform.

Die Binärdateien für diesen Computer können ihre Wurzel auf ein ursprüngliches System zurückverfolgen, auf dem noch aufgebaut wurde Ein weiterer Plattform.

Wenn Sie dies weit genug treiben, finden Sie Compiler, die mit primitiveren Werkzeugen erstellt wurden, die wiederum auf anderen Maschinen als ihrem Host erstellt wurden.

Drücken Sie weiter und Sie finden Computer, die so gebaut sind, dass ihre Anweisungen eingegeben werden können Einstellschalter an der Frontplatte der Maschine.

Sehr cooles Zeug.

Die Regel lautet: “Baue die Werkzeuge, um die Werkzeuge zu bauen, um die Werkzeuge zu bauen…”. Ganz ähnlich wie die Tools, die unsere physische Umgebung steuern. Auch bekannt als „sich an den Bootstraps hochziehen“.

  • Nicht unbedingt unsauber. Einfach nicht optimiert. Der erste Compiler wird optimiert, um auf 386 zu arbeiten, aber die neu kompilierte Version ist für jede Architektur optimiert, die Sie haben.

    – Bretonisch

    30. Januar 2009 um 4:11 Uhr

  • Sie können eine dritte Stufe hinzufügen, wenn alles in Ordnung ist, sollte die Leistung der zweiten Stufe gleich der Leistung der dritten Stufe sein.

    – Ismael

    30. Januar 2009 um 4:44 Uhr

  • Es ist nicht nur Software, es ist Hardware. Es gibt keine Möglichkeit, so etwas wie einen P4 (oder sogar einen 486) ohne Computer zu bauen.

    – BKS

    30. Januar 2009 um 5:06 Uhr

  • @BCS: Ach ja. Wir haben den Punkt erreicht, an dem Software- und Hardware-Tools eng miteinander verbunden und voneinander abhängig sind.

    – dmckee — Ex-Moderator-Kätzchen

    30. Januar 2009 um 14:12 Uhr

  • “Ein komplexes System, das funktioniert, hat sich immer aus einem einfachen System entwickelt, das funktioniert hat.” en.wikipedia.org/wiki/Gall’s_law

    – ajuc

    17. September 2013 um 15:12 Uhr


Ich denke, man sollte unterscheiden zwischen:

kompilierenv: Einen Compiler verwenden, um Quellcode zu verarbeiten und ausführbaren Code zu erzeugen [1].

und

Installierenv: Etwas anschließen, einrichten oder für den Gebrauch vorbereiten [2].

Die Kompilierung erzeugt binäre ausführbare Dateien aus dem Quellcode. Die Installation platziert diese ausführbaren Binärdateien lediglich an der richtigen Stelle, um sie später auszuführen. Installation und Verwendung erfordern also keine Kompilierung, wenn die Binärdateien verfügbar sind. Denken Sie entsprechend an „kompilieren“ und „installieren“ wie an „kochen“ und „servieren“.

Nun, Ihre Fragen:

  1. Der Kernel ist in C geschrieben, aber wie wurde der Kernel kompiliert, ohne dass ein Compiler installiert war?

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

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 wollen, brauchen Sie den Quellcode und den Compiler und alle anderen Tools.

Sogar in „quelltextbasierten“ Distributionen wie gentoo starten Sie damit, eine kompilierte Binärdatei auszuführen.

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

  1. Wenn der C-Compiler auf meiner Maschine installiert wird, bevor der Kernel kompiliert wird, 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. Also muss man eine installieren zusammengestellt Kernel, um den Compiler auszuführen, muss aber nicht kompilieren der Kern selbst.

Auch hier besteht die häufigste Vorgehensweise darin, kompilierte Binärdateien des Compilers zu installieren und sie zum Kompilieren von allem anderen (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.

Der Begriff, der dieses Phänomen beschreibt, ist Bootstrapping, es ist ein interessantes Konzept zum Nachlesen. Wenn Sie an eingebettete Entwicklung denken, wird deutlich, dass viele Geräte, beispielsweise Wecker, Mikrowellen, Fernbedienungen, die Software benötigen, 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 aus der Ferne auszuführen.

Ihre Software wird auf einem Desktop-Rechner entwickelt und nach der Kompilierung kopiert.

Wenn Sie so etwas interessiert, fällt mir spontan ein Artikel ein: Überlegungen zum Vertrauen Vertrauen (pdf), es ist ein Klassiker und eine unterhaltsame Lektüre.

  • Sie verwechseln Cross-Compiling mit Bootstrapping. Bei der ersten handelt es sich um einen Compiler, der nur auf einem PC existiert und der Opcodes für die Zielarchitektur erstellt. Ohne einen anderen Computer geht das natürlich nicht, 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

    7. Januar 2011 um 20:16 Uhr

Der Kernel kompiliert sich nicht selbst – er wird von einem C-Compiler im Userspace kompiliert. In den meisten CPU-Architekturen hat die CPU eine Reihe von Bits in speziellen Registern, die darstellen, welche Privilegien der aktuell ausgeführte Code hat. In x86 sind dies die aktuelle Berechtigungsstufe Bits (CPL) in der Codesegment (CS) registrieren. Wenn die CPL-Bits 00 sind, wird gesagt, dass der Code einläuft Sicherungsring 0auch bekannt als Kernel-Modus. Wenn die CPL-Bits 11 sind, wird gesagt, dass der Code einläuft Sicherungsring 3auch bekannt als Benutzermodus. Die anderen beiden 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 genügt zu sagen, dass der Benutzermodus stark eingeschränkte Berechtigungen hat.

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

Der C-Compiler ist ein Beispiel für ein solches Programm – er benötigt nicht die zusätzlichen Berechtigungen, die der Kernelmodus bietet, daher läuft er wie die meisten anderen Programme im Benutzermodus.

Im Fall von Linux besteht der Kernel aus zwei Teilen: dem Quellcode des Kernels und der kompilierten ausführbaren Datei des Kernels. Jede Maschine mit einem C-Compiler kann den Kernel aus dem Quellcode in das Binär-Image kompilieren. Die Frage ist also, was mit diesem binären Bild zu tun ist.

Wenn Sie Linux auf einem neuen System installieren, installieren Sie ein vorkompiliertes Binärabbild, normalerweise entweder von einem physischen Medium (z. B. einer CD/DVD) oder aus dem Netzwerk. Das BIOS lädt den Bootloader des (binären Abbilds des) Kernels vom Medium oder Netzwerk, und dann installiert der Bootloader das (binäre 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 wollen neu kompilieren Ihren eigenen Kernel, das ist etwas kniffliger, aber es geht.

Welche war zuerst da? das Huhn oder das Ei?

Eier gibt es schon 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 brauchen einen Kernel, um einen Kernel zu bauen, dh Sie bauen einen mit dem anderen.

Der erste Kernel kann beliebig sein (am besten etwas vernünftiges, das dein gewünschtes Endprodukt erzeugen kann ^__^)

Dieses Tutorial von Bran’s Kernel Development lehrt Sie, einen kleineren Kernel zu entwickeln und zu bauen, den Sie dann mit einer virtuellen Maschine Ihrer Wahl testen können.

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

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

Der Benutzeravatar des Spooniest
Der Löffeligste

Es sind nicht ganz unten Schildkröten. Wie Sie sagen, können Sie kein Betriebssystem kompilieren, das noch nie zuvor auf einem System kompiliert wurde, auf dem dieses Betriebssystem ausgeführt wird. Ebenso muss zumindest der allererste Build eines Compilers auf einem anderen Compiler durchgeführt werden (und normalerweise auch einige nachfolgende Builds, wenn sich herausstellt, dass dieser erste Build noch nicht in der Lage ist, seinen eigenen Quellcode zu kompilieren).

Ich denke, die allerersten Linux-Kernel wurden auf einer Minix-Box kompiliert, obwohl ich mir da nicht sicher bin. GCC war damals verfügbar. Eines der sehr frühen Ziele vieler Betriebssysteme ist es, einen Compiler gut genug laufen zu lassen, um ihren eigenen Quellcode zu kompilieren. Darüber hinaus wurde der erste Compiler mit ziemlicher Sicherheit in Assemblersprache geschrieben. Die ersten Assembler wurden von den armen Leuten geschrieben, die in rohem Maschinencode schreiben mussten.

Vielleicht möchten Sie sich das ansehen Linux von Grund auf neu Projekt. Tatsächlich bauen Sie in dem Buch zwei Systeme: ein „temporäres System“, das auf einem System aufbaut, das Sie nicht selbst gebaut haben, und dann das „LFS-System“, das auf Ihrem temporären System aufbaut. So wie das Buch derzeit geschrieben ist, bauen Sie das temporäre System tatsächlich auf einer anderen Linux-Box auf, aber theoretisch könnten Sie es anpassen, um das temporäre System auf einem völlig anderen Betriebssystem zu erstellen.

Benutzeravatar von in70x
in70x

Wenn ich deine Frage richtig verstehe. Der Kernel „kompiliert“ sich heutzutage nicht mehr selbst. Die meisten Linux-Distributionen bieten heute die Systeminstallation über eine Linux-Live-CD. Der Kernel wird von der CD in den Speicher geladen und funktioniert so, als ob er auf der Festplatte installiert wäre. Mit einer Linux-Umgebung, die auf Ihrem System läuft, ist es einfach, die notwendigen Dateien einfach auf Ihre Festplatte zu übertragen.

Wenn Sie über das Bootstrapping-Problem gesprochen haben; dmckee hat es ziemlich gut zusammengefasst.

Biete einfach einen anderen an Wahrscheinlichkeit

1420030cookie-checkWie kann sich der Linux-Kernel selbst kompilieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy