Was enthält ein Kernel-Source-Tree? Bezieht sich das auf Linux-Kernel-Header?

25

In Büchern las ich normalerweise Verweise auf den Linux - Source - Tree auf /usr/src/linuxden üblichen Satz von Unterverzeichnissen ( arch, block, crypto, ...).

Ich hatte erwartet, dass dieser Baum die Binärdateien enthält, aus denen der Kernel besteht. In meinem System (Ubuntu 10.04) ...

  1. Für die verschiedenen Kernel, die ich habe (mit automatisierten Software-Downloads, nicht manuell installiert), finde ich an dieser Stelle stattdessen zwei Unterverzeichnisse für jeden Kernel wie folgt:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. In den Unterverzeichnissen habe ich unter anderem Binärdateien erwartet. Ich habe jedoch eine ganze Menge des Baums überprüft, und das letzte Unterverzeichnis von hier scheint immer eine zu haben Makefile(beim Lesen klingt es normalerweise eher nach einer Konfigurationsdatei als nach einer Installationsdatei), und gelegentlich ein paar isolierte andere Dateien (meistens Kconfig).

Meine Frage mag naiv sein, aber ich bin ein bisschen verwirrt. Ist (2) das, was ich im Kernel Source Tree erwarten sollte; und warum habe ich den expliziten Verweis auf "Header"? Ich musste vor linux-generic-headerseiniger Zeit eine andere Software installieren und bin mir nicht sicher, ob dies damit zusammenhängt. Mir ist klar, dass es einen guten Grund für die Makefiles gibt (z. B. Module im Unterverzeichnis / driver zu installieren), aber (so ziemlich) nur Makefiles?

Gnometorule
quelle

Antworten:

30

Distributionspakete kernel-headerenthalten, wie der Name schon sagt, nur Kernel-Header-Dateien (plus die erforderlichen Installationsdateien), die zum Erstellen von Software wie Kernel-Modulen erforderlich sind.

Sie sollten nicht damit rechnen, Binärdateien in einem Kernel- Quellverzeichnis zu finden , mit Ausnahme der Build-Ausgabe. (Wenn Sie einen Kernel selbst konfigurieren und erstellen, enthält das Kernel-Quellverzeichnis auch die kompilierten Objekte, Module, den erstellten Kernel selbst und einige andere Binärkomponenten, mit denen er funktioniert.) Bei den
KConfigDateien handelt es sich um eine Beschreibung der Kernelkonfigurationsoptionen (und ihre Abhängigkeiten), die für ein bestimmtes Verzeichnis / Modul verfügbar sind.
Abgesehen davon ist alles (meistens) C-Quellcode, Header-Dateien und Makefiles. Es gibt hier und da ein paar Hilfsskripte und auch eine Assembly-Quelle.

Header-Pakete (was Sie installiert haben) enthalten nur den Header- Teil der oben genannten (und nicht alles - nur die "exportierten" Header) und einen Teil der Build-Infrastruktur. Was Sie also sehen, wird erwartet. Header-Pakete enthalten keinen C-Quellcode (mit Ausnahme einiger Stubs und Build-Infrastrukturcode). Der Sinn eines solchen Pakets besteht darin, Speicherplatz (und Bandbreite) zu sparen - der gesamte Linux-Kernel-Quellbaum ist ziemlich groß und völlig unnötig, wenn Sie nicht vorhaben, den Kernel selbst zu kompilieren. Die Header-Pakete werden von Distributionen erstellt und ausgeliefert, um genau die richtigen Dinge zum Erstellen von Modulen bereitzustellen, aber nicht mehr. (Sie enthalten auf keinen Fall den kompilierten Kernel.)

Kommentar adressieren: Header-Pakete ziehen nirgendwo hin. Sie sind für bestimmte Versionen des Kernels erstellt, in einem bestimmten Verzeichnis gepackt, und das war's. Es ist nur eine Reihe von Dateien. (Beachten Sie, dass die Header-Pakete nicht unbedingt die gleiche Version wie die aktuellen Binärpakete des stabilen Kernels haben - die Header-Pakete sind generisch und können hinter dem eigentlichen Kernel zurückbleiben, den Sie ausführen. Sie sollten jedoch nicht von einem Kernel stammen Version, die aktueller ist als der aktuell installierte (oder Ziel-) Kernel.)

Installierte Kernel-Binärdateien werden normalerweise /bootzusammen mit Bootloader-Binärdateien und Konfigurationsdateien im Verzeichnis installiert . (Dies ist manchmal ein unabhängiges Dateisystem, das nicht standardmäßig gemountet wird.) Der genaue Name der Dateien hängt vom Kernel und der Distribution ab. (So ​​auch der Bootloader.)

Installierte Kernelmodule befinden sich in Unterverzeichnissen von:

/lib/modules/`uname -r`/

Zum Beispiel auf meinem System befinden sie sich derzeit in

/lib/modules/3.1.4-gentoo/

Vollständiger Kernel-Quellcode : Wenn Sie unter Ubuntu möchten, dass die vollständigen Kernel-Quellen selbst einen Kernel erstellen, sollten Sie die folgenden Anweisungen befolgen .

Sie können einen Quell-Tarball auch von herunterladen kernel.orgund irgendwo entpacken ( Überschreiben Sie keine von Ubuntu installierten Dateien, wenn Sie diesen Tarball verwenden, und bewahren Sie Ihre persönlichen und die von RPM verwalteten Dateien getrennt auf).

/usr/src/linuxDies ist ein traditioneller Ort, an dem Kernelquellen abgelegt werden, aber nichts hindert Sie daran, Kernelquellen an anderer Stelle abzulegen. Dieser Pfad ist auch oft nur eine symbolische Verknüpfung zu einem Verzeichnis. zB ich habe dies auf meinem Rechner:

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

Der Symlink vereinfacht das Erstellen von Anwendungen, die von der Kernelquelle abhängen. Sie verknüpfen diesen Pfad mit Ihrem laufenden (oder Ziel-) Kernel, damit Sie keine genauen Versions- oder Pfadinformationen angeben müssen, wenn Sie ein Modul außerhalb des Baums erstellen. Hilft ein paar für Source-basierte Distributionen.

Matte
quelle
Vielen Dank für diese ausführliche und recht vollständige Antwort. Das hatte mich eine Weile nervt. Wenn ich meine Begrüßung nicht überbeanspruche und Sie die Zeit finden, kann ich Folgendes hinzufügen: (a) Ich habe in meinem Fall (nicht selbstinstallierter Kernel) einige (eine) der Sub-Versionen gelesen Verzeichnisse sollten (könnten) den Kernel-C- und Assembler-Quellcode enthalten. Wo wäre das - keine vollständige Liste, nur bei meinem Durchsuchen von vielleicht 20 - 30 Unterverzeichnissen bin ich nie auf eines gestoßen? Ich habe Kernel-Quelldateien von kernel.org heruntergeladen. Ich will nur mein System besser verstehen. (b) ...
gnometorule
... also wo (im Allgemeinen) befinden sich die Kernel-Binärdateien, wenn Sie den Kernel nicht selbst installieren, wie in meinem Fall? (c) Sie beziehen sich auf die "Header-Pakete", die ich als "Linux-Generic-Header" bezeichnet habe. Ist der Baum, den ich aus diesen Paketen sehe? Wenn ja, werden sie an den Ort verschoben, an dem sich der Quelltextbaum vor der Installation befand? Vielen Dank nochmal.
Gnometorule
(Wenn du antwortest, benutze "antworte" und nicht "Kommentar", damit ich dich wenigstens noch einmal für deine Hilfe
positiv
Ein bisschen erweitert. Header-Pakete sind für Header. Vollständige Quellpakete bieten vollständigen Quellcode. Binärpakete stellen nur Binärdateien bereit.
Mat
5
linux-sourceEnthält die Upstream-Quelle, apt-get source linux-image-$(uname -r)ruft die Quelle für den Kernel mit Ubuntu-Patches ab.
Lekensteyn