Pourquoi les applications de l'espace utilisateur ont-elles besoin d'en-têtes de noyau?

10

Je construis une boîte occupée et des iptables pour un périphérique intégré et l'une des dépendances pour eux sont les en-têtes du noyau.

J'ai recherché les fichiers * .ko dans tout le système de fichiers et n'en ai trouvé aucun. J'ai donc conclu que les applications ne créent aucun pilote chargeable (modules du noyau).

Quels sont les autres cas où une application d'espace utilisateur requiert des en-têtes de noyau?

TheMeaningfulEngineer
la source
Un exemple facile à trouver est lorsqu'un élément de l'espace utilisateur émet un appel système.
Sami Laine
@SamiLaine Je suppose que la bibliothèque c fournirait l'interface aux appels système. Si ce que vous dites était le cas, ne devriez-vous pas, par exemple, importer des en-têtes de noyau juste pour ouvrir un socket?
TheMeaningfulEngineer
Socket (2), est un appel système, pas une fonction de bibliothèque, donc oui.
Sami Laine du
@SamiLaine Pouvez-vous donner un exemple où vous devez include <linux/*.h>ouvrir une prise? (Je
visais

Réponses:

8

Parce que ces programmes sont construits pour utiliser des choses définies dans les en-têtes du noyau:

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

Pour chaque outil spécifique, vous devez lire la source de l'outil et l'en-tête du noyau correspondant pour savoir exactement quoi.

Vous pouvez voir quelques éléments commentés pour vous faciliter la tâche.

Par exemple, mkfs_vfatcomprend linux/fd.hpour obtenir 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);

Vous pouvez probablement supprimer les #includeerreurs pertinentes du compilateur et surveiller pour le rendre plus facile, vous obtiendrez des avertissements que certaines choses ne sont pas définies. Ces choses proviennent probablement des en-têtes du noyau.

suprjami
la source
2
1. Busybox est conçu pour les systèmes embarqués et autres systèmes légers, où vous souhaitez charger le moins de bibliothèques en mémoire possible. Je n'ai pas lu la source, mais BB contourne probablement les bibliothèques et établit un lien directement avec le noyau. 2. Non. Il couple votre binaire d'espace utilisateur avec une version de l' API du noyau , qui est rétrocompatible: un binaire compilé aujourd'hui peut ne pas fonctionner sur un noyau plus ancien (selon les symboles inclus ... lire le code source) mais le fera travailler avec les futurs noyaux.
ignis
1
@suprjami L'ABI obéit à l'ABI SysV standard, qui peut raisonnablement être supposé ne pas changer; entre autres choses, SysV ABI est la raison pour laquelle vous pouvez vous lier au noyau avec le compilateur (et la version) de votre choix, pas nécessairement le même que celui qui a émis le binaire du noyau.
ignis
1
... il permet également de chrooter / LXC dans une distribution livrée avec un noyau différent. etc.
ignis
1
(Pour plus de clarté: notez que le noyau a un ABI externe , dont nous discutons ici, et un ABI interne entre les modules du noyau, qui subit des modifications fréquentes et éventuellement incompatibles, mais il n'est pas vu par l'espace utilisateur et n'est pas pertinent lors de la compilation de l'espace utilisateur code.)
ignis
1
(Notez également que l'API ABI = / =. L'API (externe) du noyau inclut les symboles référencés dans le code source, et les développeurs du noyau se sont engagés à maintenir la compatibilité; à moins que les symboles ne soient très rarement utilisés dans les logiciels du monde réel, ce serait une décision déraisonnable pour eux d'apporter des modifications incompatibles, bien qu'aucune norme tierce n'oblige l'ensemble de l'API Linux et donc rien ne la gêne techniquement.)
ignis