Perché le app dello spazio utente hanno bisogno delle intestazioni del kernel?


10

Sto costruendo busy-box e iptables per un dispositivo incorporato e una delle dipendenze per loro sono le intestazioni del kernel.

Ho cercato i file * .ko nell'intero file system e non ne ho trovato nessuno. Quindi ho concluso che le app non stanno creando alcun driver caricabile (moduli del kernel).

Quali sono gli altri casi in cui un'applicazione per lo spazio utente richiede le intestazioni del kernel?


Un semplice esempio da trovare è quando qualcosa nello spazio utente emette una chiamata di sistema.
Sami Laine,

@SamiLaine Immagino che la libreria c fornirebbe l'interfaccia alle chiamate di sistema. Se quello che stai dicendo fosse il caso, non dovresti, ad esempio, importare le intestazioni del kernel solo per aprire un socket?
TheMeaningfulEngineer,

Socket (2), è una chiamata di sistema, non una funzione di libreria, quindi sì.
Sami Laine,

@SamiLaine Puoi fare un esempio in cui devi include <linux/*.h>aprire un socket? (Stavo mirando a sys / socket.h)
TheMeaningfulEngineer

Risposte:


8

Perché quei programmi sono costruiti per usare cose definite nelle intestazioni del kernel:

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 */
....

Per ogni strumento specifico, dovresti leggere la fonte dello strumento e la relativa intestazione del kernel per capire esattamente cosa.

Puoi vedere alcune cose commentate per renderlo semplice.

Ad esempio, mkfs_vfatinclude linux/fd.hper ottenere 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);

Probabilmente potresti rimuovere il relativo #includee controllare gli errori del compilatore per renderlo più semplice, riceverai avvisi che alcune cose non sono definite. Queste cose probabilmente provengono dalle intestazioni del kernel.


2
1. Busybox è progettato per sistemi embedded e altri sistemi leggeri, in cui si desidera caricare il minor numero possibile di librerie in memoria. Non ho letto la fonte, ma probabilmente BB sta sostanzialmente evitando le librerie e si collega direttamente al kernel. 2. No. Associa il binario del tuo spazio utente a una versione dell'API del kernel , che è retrocompatibile: un binario compilato oggi potrebbe non funzionare su un kernel più vecchio (a seconda dei simboli inclusi ... leggi il codice sorgente) ma lavorare con kernel futuri.
ignis,

1
@suprjami L'ABI obbedisce all'ABI SysV standard, che si può ragionevolmente supporre che non cambi; tra le altre cose, SysV ABI è il motivo per cui puoi collegarti al kernel con il tuo compilatore (e versione) preferito, non necessariamente lo stesso che ha emesso il file binario del kernel.
ignis,

1
... rende anche possibile chroot / LXC in una distro fornita con un kernel diverso. ecc.
ignis,

1
(Per chiarezza: si noti che il kernel ha un ABI esterno , di cui stiamo discutendo qui, e un ABI interno tra i moduli del kernel, che subisce modifiche frequenti e forse incompatibili, ma non è visto dallo spazio utente ed è irrilevante durante la compilazione dello spazio utente codice.)
ignis,

1
(Si noti inoltre che l'API ABI = / =. L'API (esterna) del kernel include i simboli a cui si fa riferimento nel codice sorgente e gli sviluppatori del kernel si sono impegnati a mantenere la compatibilità; a meno che i simboli non vengano usati molto raramente nel software del mondo reale, sarebbe una mossa irragionevole per loro di apportare modifiche incompatibili, anche se nessuno standard di terze parti impone l'intera API Linux e quindi nulla la impedisce tecnicamente.)
ignis
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.