Que contient l'tree source d'un kernel? Est-ce lié aux en-têtes de kernel Linux?

Dans les livres, je lis généralement les references à l'tree source Linux à /usr/src/linux avec l'set habituel de sous-directorys ( arch , block , crypto , …).

Je m'attendais à ce que cet tree contienne les files binarys composant le kernel. Dans mon système (Ubuntu 10.04) …

  1. pour les différents kernelx que j'ai (à l'aide de téléchargements de logiciels automatisés, pas installés manuellement), je trouve à cet endroit plutôt deux sous-directorys pour chaque kernel comme suit:

     /usr/src/linux-headers-2.6.32-22 /usr/src/linux-headers-2.6.32-22-generic 
  2. Dans les sous-directorys, je m'attendais à des files binarys, entre autres. Cependant, j'ai vérifié une bonne partie de l'arborescence, et le dernier sous-directory d'ici semble toujours avoir un Makefile (en lisant cela, il ressemble généralement plus à un file de configuration qu'à un file d'installation), et parfois à quelques autres files (principalement Kconfig ).

Ma question peut être naïve, mais je suis un peu confuse. Est (2) ce que je devrais m'attendre à voir dans l'tree source du kernel; et pourquoi ai-je la reference explicite aux "en-têtes"? J'avais besoin d'installer linux-generic-headers un certain time pour d'autres logiciels et je ne sais pas si cela pourrait être lié. Je réalise qu'il y a une bonne raison pour les makefiles (par exemple, pour installer des modules dans le sous-directory / driver), mais (à peu près) seulement makefiles?

Les packages d' kernel-header dissortingbution contiennent, comme leur nom l'indique, uniquement les files d'en-tête du kernel (plus la plomberie nécessaire) nécessaires pour build des logiciels comme les modules du kernel.

Vous ne devriez pas vous attendre à find des files binarys dans un directory source du kernel, à l'exception de la sortie de génération. (Si vous configurez et construisez vous-même un kernel, le directory source du kernel contiendra également les objects compilés, les modules, le kernel construit lui-même et quelques autres bits et morceaux binarys qui le font fonctionner).
KConfig files KConfig sont une description des options de configuration du kernel (et de leurs dependencies) disponibles pour un directory / module donné.
En dehors de cela, c'est tout (surtout) le code source C, les files d'en-tête et les Makefile . Il y a quelques scripts d'aide ici et là, et la source d'assemblage aussi.

Les packageages d'en-tête (ce que vous avez installé) ne contiennent que la partie en- tête de ce qui précède (et pas seulement tous les en-têtes "exportés") et une partie de l'infrastructure de construction. Donc ce que vous voyez est attendu. Les packageages d'en-tête ne contiennent pas de code source C (sauf pour certains stubs et code d'infrastructure de construction). Le but de ce type de packageage est d'économiser de l'espace (et de la bande passante) – l'arborescence des sources du kernel Linux est plutôt grande et complètement inutile si vous n'avez pas l'intention de comstackr le kernel vous-même. Les packages d'en-tête sont construits et expédiés par les dissortingbutions pour fournir les bonnes choses nécessaires pour build des modules, mais pas plus. (Ils ne contiennent certainement pas le kernel compilé.)

Adressant votre commentaire: les packages d'en-tête ne se déplacent nulle part. Ils sont construits pour des versions spécifiques du kernel, empackageées dans un directory spécifique, et c'est tout. C'est juste un set de files. (Notez que les packages d'en-tête n'ont pas nécessairement la même version que les packages binarys du kernel stable actuel – les packageages d'en-tête sont generics et peuvent être en retard par rapport au kernel réel que vous utilisez, mais ne doivent pas provenir d'un kernel version plus récente que le kernel installé (ou cible) actuel.)

Les binarys du kernel installés sont généralement installés dans le directory /boot , avec les binarys du bootloader et les files de configuration. (Il s'agit parfois d'un système de files indépendant, non monté par défaut.) Le nom exact des files dépend du kernel et de la dissortingbution. (C'est le cas du chargeur de démarrage.)

Les modules du kernel installés résident dans des sous-directorys de:

 /lib/modules/`uname -r`/ 

Donc, par exemple sur mon système, ils sont actuellement

 /lib/modules/3.1.4-gentoo/ 

Code source complet du kernel : Sur Ubuntu, si vous voulez que les sources complètes du kernel construise vous-même un kernel, vous devez l'installer en suivant les instructions ci- dessous .

Vous pouvez également download une archive tar depuis kernel.org et la décompresser quelque part (ne pas écraser les files installés par Ubuntu si vous utilisez cette archive, garder vos trucs personnels et les trucs gérés par RPM séparément).

/usr/src/linux est un endroit traditionnel pour mettre des sources de kernel, mais rien ne vous empêche de placer des sources de kernel ailleurs. Ce path est souvent juste un lien symbolique vers un directory. 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 kernel. Vous liez ce path à votre kernel en cours d'exécution (ou cible) de sorte que vous n'ayez pas besoin de spécifier la version exacte ou les informations de path lorsque vous construisez un module hors de l'arborescence. Aide un tas pour les dissortingbutions basées sur la source au less.