Comment le noyau Linux peut-il se compiler?


88

Je ne comprends pas très bien le processus de compilation du noyau Linux lorsque j'installe un système Linux sur ma machine.

Voici quelques éléments qui m'ont dérouté:

  1. Le noyau est écrit en C, mais comment le noyau a-t-il été compilé sans un compilateur installé?
  2. Si le compilateur C est installé sur ma machine avant la compilation du noyau, comment le compilateur lui-même peut-il être compilé sans qu'un compilateur soit installé?

J'étais tellement confus pendant quelques jours, merci pour la réponse.


pour autant que je sache, le compilateur C a été écrit dans une sorte d'assambler par des gens fous et intelligents des laboratoires AT&T pour compiler UNIX pour un ordinateur donné (notez que l'histoire commence avec UNIX, pas Linux, donc j'ai peur que vous manquer un chapitre ... ou plusieurs!). En bref, il n'était pas nécessaire de réécrire le noyau Unix pour différents ordinateurs tant que ces ordinateurs ont un compilateur approprié pour le langage C. Ces compilateurs ont été écrits dans l'assembleur spécifique des ordinateurs cibles. Roughty disant "Premier compilateur écrit dans l'assambler de l'ordinateur donné, puis UNIX écrit en C"
Victor

Réponses:


208

La première série de binaires pour votre machine Linux a été construite sur une autre machine Linux (probablement).

Les binaires du premier système Linux ont été construits sur une autre plate-forme.

Les binaires de cet ordinateur peuvent retracer leur racine vers un système original qui a été construit sur une autre plate-forme.

...

Poussez cela assez loin et vous trouverez des compilateurs construits avec des outils plus primitifs, qui étaient à leur tour construits sur des machines autres que leur hôte.

...

Continuez à pousser et vous trouvez des ordinateurs conçus pour que leurs instructions puissent être entrées en réglant les commutateurs sur le panneau avant de la machine .

Des trucs très cool.

La règle est "construire les outils pour construire les outils pour construire les outils ...". Tout comme les outils qui exécutent notre environnement physique. Également connu sous le nom de "tirant vers le haut par les bootstraps".


3
Pas forcément impur. Simplement non optimisé. le premier compilateur sera optimisé pour fonctionner sur 386, mais la version recompilée sera optimisée pour n'importe quelle architecture que vous avez.
Breton

1
Vous pouvez ajouter un troisième étage, si tout va bien, la sortie du deuxième étage doit être égale à la sortie du troisième étage.
Ismael

27
Ce n'est pas seulement un logiciel, c'est du matériel. Il n'y a aucun moyen de construire un P4 (ou même un 486) sans ordinateur.
BCS

1
@BCS: Oh, oui. Nous avons atteint le point où les outils logiciels et matériels sont profondément liés et interdépendants.
dmckee --- ex-moderator chaton

4
"On constate invariablement qu'un système complexe qui fonctionne a évolué à partir d'un système simple qui a fonctionné." en.wikipedia.org/wiki/Gall's_law
ajuc

33

Je pense que vous devriez faire la distinction entre:

compile , v: Pour utiliser un compilateur pour traiter le code source et produire du code exécutable [1] .

et

install , v: pour se connecter, configurer ou préparer quelque chose à utiliser [2] .

La compilation produit des exécutables binaires à partir du code source. L'installation met simplement ces exécutables binaires au bon endroit pour les exécuter plus tard. Ainsi, l'installation et l'utilisation ne nécessitent pas de compilation si les binaires sont disponibles. Pensez à «compiler» et «installer» comme «cuisiner» et «servir», en conséquence.

Maintenant, vos questions:

  1. Le noyau est écrit en C, mais comment le noyau a-t-il été compilé sans un compilateur installé?

Le noyau ne peut pas être compilé sans compilateur, mais il peut être installé à partir d'un binaire compilé.

Habituellement, lorsque vous installez un système d'exploitation, vous installez un noyau précompilé (exécutable binaire). Il a été compilé par quelqu'un d'autre. Et seulement si vous voulez compiler le noyau vous-même, vous avez besoin du source et du compilateur, et de tous les autres outils.

Même dans les distributions «basées sur les sources» comme gentoo, vous commencez par exécuter un binaire compilé.

Ainsi, vous pouvez vivre toute votre vie sans compiler les noyaux, car vous les avez compilés par quelqu'un d'autre.

  1. Si le compilateur C est installé sur ma machine avant la compilation du noyau, comment le compilateur lui-même peut-il être compilé sans qu'un compilateur soit installé?

Le compilateur ne peut pas être exécuté s'il n'y a pas de noyau (OS). Il faut donc installer un noyau compilé pour exécuter le compilateur, mais il n'est pas nécessaire de compiler le noyau lui-même.

Encore une fois, la pratique la plus courante consiste à installer les binaires compilés du compilateur et à les utiliser pour compiler tout le reste (y compris le compilateur lui-même et le noyau).

Maintenant, problème de la poule et de l'œuf. Le premier binaire est compilé par quelqu'un d'autre ... Voir une excellente réponse de dmckee.


14

Le terme décrivant ce phénomène est bootstrapping , c'est un concept intéressant à lire. Si vous pensez au développement embarqué, il devient clair que de nombreux appareils, comme les réveils, les micro-ondes, les télécommandes, qui nécessitent des logiciels ne sont pas assez puissants pour compiler leur propre logiciel. En fait, ces types de périphériques ne disposent généralement pas de suffisamment de ressources pour exécuter à distance quelque chose d'aussi compliqué qu'un compilateur.

Leur logiciel est développé sur un ordinateur de bureau, puis copié une fois compilé.

Si ce genre de chose vous intéresse, un article qui me vient à l'esprit est: Réflexions sur la confiance en confiance ( pdf ), c'est un classique et une lecture amusante.


1
Vous confondez la compilation croisée avec le bootstrap. Le premier concerne un compilateur qui n'existe que sur un PC, et qui crée des opcodes pour l'architecture cible. De toute évidence, vous ne pouvez pas faire cela sans un autre ordinateur, il y a donc un dilemme de la poule et de l'œuf. La réponse au dilemme est le bootstrapping, où un compilateur simple manuscrit ou préexistant est utilisé pour générer un compilateur plus complexe.
Kevin Vermeer

12

Le noyau ne se compile pas lui-même - il est compilé par un compilateur C dans l'espace utilisateur. Dans la plupart des architectures de CPU, le CPU a un certain nombre de bits dans des registres spéciaux qui représentent les privilèges du code en cours d'exécution. Dans x86, il s'agit des bits de niveau de privilège (CPL) actuels dans le registre de segment de code (CS). Si les bits CPL sont 00, le code s'exécute dans l' anneau de sécurité 0 , également connu sous le nom de mode noyau . Si les bits CPL sont 11, on dit que le code s'exécute dans l' anneau de sécurité 3 , également appelé mode utilisateur . Les deux autres combinaisons, 01 et 10 (anneaux de sécurité 1 et 2 respectivement) sont rarement utilisées.

Les règles sur ce que le code peut et ne peut pas faire en mode utilisateur par rapport au mode noyau sont plutôt compliquées, mais il suffit de dire que le mode utilisateur a des privilèges considérablement réduits.

Maintenant, quand les gens parlent du noyau d'un système d'exploitation, ils se réfèrent aux parties du code du système d'exploitation qui peuvent s'exécuter en mode noyau avec des privilèges élevés. Généralement, les auteurs du noyau essaient de garder le noyau aussi petit que possible pour des raisons de sécurité, de sorte que le code qui n'a pas besoin de privilèges supplémentaires ne les a pas.

Le compilateur C est un exemple d'un tel programme - il n'a pas besoin des privilèges supplémentaires offerts par le mode noyau, il fonctionne donc en mode utilisateur, comme la plupart des autres programmes.

Dans le cas de Linux, le noyau se compose de deux parties: le code source du noyau et l'exécutable compilé du noyau. Toute machine avec un compilateur C peut compiler le noyau du code source dans l'image binaire. La question est donc de savoir quoi faire de cette image binaire.

Lorsque vous installez Linux sur un nouveau système, vous installez une image binaire précompilée, généralement à partir d'un support physique (tel qu'un CD-DVD) ou du réseau. Le BIOS chargera (l'image binaire du) chargeur de démarrage du noyau à partir du support ou du réseau, puis le chargeur de démarrage installera (l'image binaire du) noyau sur votre disque dur. Ensuite, lorsque vous redémarrez, le BIOS charge le chargeur de démarrage du noyau à partir de votre disque dur, et le chargeur de démarrage charge le noyau en mémoire, et vous êtes en marche.

Si vous voulez recompiler votre propre noyau, c'est un peu plus compliqué, mais cela peut être fait.


5

Lequel était là en premier? La poule ou l'oeuf?

Les œufs existent depuis l'époque des dinosaures.

.. certains confondent tout en disant que les poulets sont en fait les descendants des grandes bêtes .. pour faire court: la technologie (oeuf) existait avant le produit actuel (poulet)

Vous avez besoin d'un noyau pour construire un noyau, c'est-à-dire que vous construisez l'un avec l'autre.

Le premier noyau peut être tout ce que vous voulez (de préférence quelque chose de sensé qui peut créer le produit final souhaité ^ __ ^)

Ce tutoriel de Bran's Kernel Development vous apprend à développer et à construire un petit noyau que vous pouvez ensuite tester avec une machine virtuelle de votre choix.

Signification: vous écrivez et compilez un noyau quelque part, et le lisez sur une machine virtuelle vide (sans OS).

Ce qui se passe avec ces installations Linux suit la même idée avec une complexité supplémentaire.


5

Ce ne sont pas des tortues tout en bas. Comme vous le dites, vous ne pouvez pas compiler un système d'exploitation qui n'a jamais été compilé auparavant sur un système exécutant ce système d'exploitation. De même, au moins la toute première construction d'un compilateur doit être effectuée sur un autre compilateur (et généralement certaines versions ultérieures aussi, si cette première version s'avère ne pas être capable de compiler son propre code source pour le moment).

Je pense que les tout premiers noyaux Linux ont été compilés sur une boîte Minix, même si je n'en suis pas certain. GCC était disponible à l'époque. L'un des tout premiers objectifs de nombreux systèmes d'exploitation est d'exécuter suffisamment bien un compilateur pour compiler leur propre code source. Pour aller plus loin, le premier compilateur a presque certainement été écrit en langage assembleur. Les premiers assembleurs ont été écrits par ces pauvres gens qui devaient écrire en code machine brut.

Vous voudrez peut-être consulter le projet Linux From Scratch . Vous construisez en fait deux systèmes dans le livre: un "système temporaire" qui est construit sur un système que vous n'avez pas construit vous-même, et puis le "système LFS" qui est construit sur votre système temporaire. La façon dont le livre est actuellement écrit, vous construisez en fait le système temporaire sur une autre machine Linux, mais en théorie, vous pouvez l'adapter pour construire le système temporaire sur un système d'exploitation complètement différent.


1

Si je comprends bien votre question. Le noyau ne se "compile pas" de nos jours. La plupart des distributions Linux fournissent aujourd'hui l'installation du système via un live cd Linux. Le noyau est chargé à partir du CD dans la mémoire et fonctionne comme il le ferait normalement comme s'il était installé sur le disque. Avec un environnement Linux opérationnel sur votre système, il est facile de simplement valider les fichiers nécessaires sur votre disque.

Si vous parliez du problème d'amorçage; dmckee l'a résumé assez bien.

Offrir simplement une autre possibilité ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.