Warum benötigen User Space-Apps Kernel-Header?

10

Ich baue Busy-Box und Iptables für ein eingebettetes Gerät und eine der Abhängigkeiten für sie sind die Kernel-Header.

Ich habe das gesamte Dateisystem nach * .ko-Dateien durchsucht und keine gefunden. Also kam ich zu dem Schluss, dass die Apps keine ladbaren Treiber (Kernelmodule) erstellen.

In welchen anderen Fällen benötigt eine User Space-Anwendung Kernel-Header?

TheMeaningfulEngineer
quelle
Ein einfaches Beispiel ist, wenn etwas im Benutzerbereich einen Systemaufruf ausgibt.
Sami Laine
@SamiLaine Ich würde vermuten, dass die c-Bibliothek die Schnittstelle für Systemaufrufe bietet. Wenn das, was Sie sagen, der Fall wäre, müssten Sie beispielsweise nicht Kernel-Header importieren, um einen Socket zu öffnen?
TheMeaningfulEngineer
Socket (2) ist ein Systemaufruf, keine Bibliotheksfunktion, also ja.
Sami Laine
@SamiLaine Können Sie ein Beispiel geben, bei dem Sie include <linux/*.h>eine Steckdose öffnen müssen? (Ich wollte sys / socket.h)
TheMeaningfulEngineer

Antworten:

8

Da diese Programme so erstellt wurden, dass sie die in den Kernel-Headern definierten Elemente verwenden:

busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
....

Für jedes spezifische Tool müssen Sie die Quelle des Tools und den entsprechenden Kernel-Header lesen, um genau herauszufinden, was.

Sie können sehen, dass einige Dinge kommentiert werden, um es einfach zu machen.

Zum Beispiel mkfs_vfatenthält linux/fd.h, um zu erhalten FDGETPRM:

$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
util-linux/mkfs_vfat.c:351:         int not_floppy = ioctl(dev, FDGETPRM, &param);

Sie könnten wahrscheinlich die relevanten entfernen #includeund auf Compilerfehler achten, um dies zu vereinfachen. Sie erhalten Warnungen, dass einige Dinge nicht definiert sind. Diese Dinge stammen wahrscheinlich aus den Kernel-Headern.

suprjami
quelle
2
1. Busybox wurde für eingebettete und andere leichte Systeme entwickelt, bei denen Sie so wenig Bibliotheken wie möglich in den Speicher laden möchten. Ich habe die Quelle nicht gelesen, aber wahrscheinlich umgeht BB im Grunde genommen die Bibliotheken und verlinkt direkt mit dem Kernel. 2. Nein. Es koppelt Ihre Userspace-Binärdatei mit einer abwärtskompatiblen Version der Kernel-API : Eine heute kompilierte Binärdatei funktioniert möglicherweise nicht auf einem älteren Kernel (abhängig von den enthaltenen Symbolen ... lesen Sie den Quellcode), wird es aber tun arbeite mit zukünftigen Kerneln.
Ignis
1
@suprjami Der ABI folgt dem Standard-SysV-ABI, von dem vernünftigerweise angenommen werden kann, dass er sich nicht ändert. Unter anderem ist SysV ABI der Grund, warum Sie mit dem Compiler (und der Version) Ihrer Wahl eine Verknüpfung zum Kernel herstellen können, nicht unbedingt mit dem gleichen, der die Kernel-Binärdatei ausgegeben hat.
Ignis
1
... es macht es auch möglich, / LXC in eine Distribution zu chroot, die mit einem anderen Kernel geliefert wird. usw.
Ignis
1
(Zur Verdeutlichung: Beachten Sie, dass der Kernel über einen externen ABI verfügt , über den wir hier sprechen, und über einen internen ABI zwischen den Kernelmodulen, der häufig und möglicherweise inkompatibel geändert wird. Er wird jedoch vom Benutzerbereich nicht gesehen und ist beim Kompilieren des Benutzerbereichs irrelevant Code.)
Ignis
1
(Beachten Sie auch, dass ABI = / = API. Die (externe) API des Kernels enthält die Symbole, auf die im Quellcode verwiesen wird, und die Kernelentwickler haben sich verpflichtet, die Kompatibilität aufrechtzuerhalten. Wenn die Symbole in der realen Software nur sehr selten verwendet werden, ist dies der Fall Ein unvernünftiger Schritt für sie, inkompatible Änderungen vorzunehmen, obwohl kein Standard eines Drittanbieters die gesamte Linux-API vorschreibt und daher technisch nichts behindert.)
Ignis