Que contient un arbre source du noyau? Est-ce lié aux en-têtes du noyau Linux?

25

Dans les livres, je lis généralement des références à l'arbre source Linux à /usr/src/linuxavec l'ensemble des sous - répertoires habituels ( arch, block, crypto, ...).

Je m'attendais à ce que cet arbre contienne les fichiers binaires constituant le noyau. Dans mon système (Ubuntu 10.04) ...

  1. pour les différents noyaux que j'ai (en utilisant des téléchargements de logiciels automatisés, non installés manuellement), je trouve à cet endroit à la place deux sous-répertoires pour chaque noyau comme suit:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. Dans les sous-répertoires, je m'attendais à des fichiers binaires, entre autres. Cependant, j'ai vérifié une bonne partie de l'arborescence, et le dernier sous-répertoire d'ici semble toujours avoir un Makefile(lors de sa lecture, il ressemble généralement plus à un fichier de configuration qu'à un fichier d'installation), plus parfois quelques autres fichiers isolés (surtout Kconfig).

Ma question est peut-être naïve, mais je suis un peu confuse. Est (2) ce à quoi je dois m'attendre dans l'arborescence des sources du noyau; et pourquoi ai-je la référence explicite aux «en-têtes»? J'ai dû installer linux-generic-headersun certain temps en arrière pour certains autres logiciels et je ne sais pas si cela pourrait être lié. Je me rends compte qu'il y a une bonne raison pour les makefiles (par exemple, pour installer des modules dans le sous-répertoire / driver), mais (à peu près) uniquement des makefiles?

gnometorule
la source

Réponses:

30

Les kernel-headerpackages de distribution contiennent, comme leur nom l'indique, uniquement les fichiers d'en-tête du noyau (plus la plomberie nécessaire) qui sont nécessaires pour construire des logiciels comme les modules du noyau.

Vous ne devriez pas vous attendre du tout à trouver des fichiers binaires dans un répertoire source du noyau , à l'exception de la sortie de génération. (Si vous configurez et construisez un noyau vous-même, le répertoire source du noyau contiendra également les objets compilés, les modules, le noyau construit lui-même et quelques autres éléments binaires qui le font fonctionner.)
KConfig fichiers sont une description des options de configuration du noyau (et leurs dépendances) disponibles pour un répertoire / module donné.
En dehors de cela, c'est tout (principalement) du code source C, des fichiers d'en-tête et Makefiles. Il y a quelques scripts d'assistance ici et là, ainsi que la source de l'assembly.

Les packages d'en-tête (ce que vous avez installé) ne contiennent que la partie d'en- tête de ce qui précède (et pas tout cela - uniquement les en-têtes "exportés"), et une partie de l'infrastructure de construction. Donc, ce que vous voyez est attendu. Packages d'en-tête ne contiennent pas de code source C (à l'exception de certains stubs et du code d'infrastructure de construction). L'intérêt d'avoir ce type de paquet est d'économiser de l'espace (et de la bande passante) - l'ensemble de l'arborescence des sources du noyau Linux est plutôt volumineux et complètement inutile si vous n'avez pas l'intention de compiler le noyau vous-même. Les packages d'en-tête sont construits et expédiés par des distributions pour fournir exactement ce qu'il faut pour construire des modules, mais pas plus. (Ils ne contiennent certainement pas le noyau compilé.)

Répondre à votre commentaire: les packages d'en-tête ne se déplacent nulle part. Ils sont construits pour des versions spécifiques du noyau, emballés dans un répertoire spécifique, et c'est tout. Ce n'est qu'un ensemble de fichiers. (Notez que les packages d'en-tête n'ont pas nécessairement la même version que les packages binaires stables actuels du noyau - les packages d'en-tête sont génériques et peuvent être en retard par rapport au noyau que vous utilisez. Ils ne doivent cependant pas provenir d'un noyau version plus récente que le noyau installé (ou cible) actuel.)

Les fichiers binaires du noyau installés sont généralement installés dans le /bootrépertoire, avec les fichiers binaires du chargeur de démarrage et les fichiers de configuration. (Il s'agit parfois d'un système de fichiers indépendant, non monté par défaut.) Le nom exact des fichiers dépend du noyau et de la distribution. (Il en va de même pour le chargeur de démarrage.)

Les modules du noyau installés résident dans des sous-répertoires de:

/lib/modules/`uname -r`/

Ainsi, par exemple sur mon système, ils sont actuellement en

/lib/modules/3.1.4-gentoo/

Code source complet du noyau : Sur Ubuntu, si vous voulez que les sources complètes du noyau construisent vous-même un noyau, vous devez installer en suivant les instructions ici .

Vous pouvez également télécharger une archive tar source kernel.orget la décompresser quelque part (n'écrasez pas les fichiers installés par Ubuntu si vous utilisez cette archive tar, gardez vos fichiers personnels et ceux gérés par RPM séparément).

/usr/src/linuxest un endroit traditionnel pour mettre des sources du noyau, mais rien ne vous empêche de mettre des sources du noyau ailleurs. Ce chemin n'est souvent qu'un lien symbolique vers un répertoire. par exemple, je l'ai sur ma machine:

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

Le lien symbolique est là pour simplifier la construction d'applications qui dépendent de la source du noyau. Vous liez ce chemin à votre noyau en cours d'exécution (ou cible) afin de ne pas avoir à spécifier la version exacte ou les informations de chemin lorsque vous créez un module hors de l'arborescence. Aide au moins un tas de distributions basées sur la source.

Tapis
la source
Merci beaucoup pour cette réponse détaillée et assez complète. Cela m'embêtait depuis un moment. Si je ne prolonge pas mon accueil, et si vous trouvez le temps, puis-je ajouter avec bonté: (a) J'ai lu ce qui précède que dans mon cas (pas de noyau auto-installé), certains (un) des sous les répertoires devraient (pourraient) contenir le code source du noyau C et de l'assembleur. Où serait-ce - pas une liste complète, seulement comme dans ma navigation sur peut-être 20 à 30 des sous-répertoires, je n'en ai jamais rencontré un? J'ai téléchargé les fichiers sources du noyau sur kernel.org; Je veux juste mieux comprendre mon système. (b) ...
gnometorule
... alors où (génériquement) se trouvent les binaires du noyau lorsque vous n'installez pas le noyau vous-même, comme dans mon cas? (c) Vous vous référez aux "paquets d'en-tête" que j'ai pris comme "en-têtes génériques linux". L'arbre que je vois de ces packages est-il? Si oui, sont-ils déplacés là où se trouvait l'arborescence source avant de les installer? Merci encore.
gnometorule
(si vous répondez, utilisez 'answer'not comment pour que je puisse au moins vous voter à nouveau pour votre aide)
gnometorule
Développé un peu. Les packages d'en-tête sont destinés aux en-têtes. Les packages source complets fournissent le code source complet. Les packages binaires ne fournissent que des binaires.
Mat
5
linux-sourcecontient la source en amont, apt-get source linux-image-$(uname -r)obtient la source du noyau avec les correctifs d'Ubuntu.
Lekensteyn