web-dev-qa-db-fra.com

Comment le noyau Linux peut-il se compiler?

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 certaines choses qui m'ont troublé:

  1. Le noyau est écrit en C, mais comment le noyau a-t-il été compilé sans qu'un compilateur ne soit 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 ne soit installé?

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

88
MainID

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

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

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

...

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

...

Continuez à pousser et vous trouverez des ordinateurs construits pour que leurs instructions puissent être saisies par réglage des 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 gèrent notre environnement physique. Également connu sous le nom de "vous tirer vers le haut par les bootstraps".

Je pense que vous devez distinguer:

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

et

installez , v: Pour vous connecter, configurer ou préparer quelque chose à utiliser [2] .

La compilation produit des exécutables binaires à partir du code source. L'installation place 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 qu'un compilateur ne soit 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 de la source et du compilateur, et de tous les autres outils.

Même dans les distributions "basées sur la source" 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 ne 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 n'a pas besoin de pour 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 autre chose (y compris le compilateur lui-même et le noyau).

Maintenant, problème de poulet et d'oeufs. Le premier binaire est compilé par quelqu'un d'autre ... Voir une excellente réponse de dmckee.

33
sastanin

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

Leur logiciel est développé sur une machine de bureau puis copié une fois qu'il a été compilé.

Si ce genre de chose vous intéresse, un article qui me vient à l'esprit est: Reflections on Trusting Trust ( pdf ), c'est un classique et amusant lis.

14
a2800276

Le noyau ne se compile pas - 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. En x86, ce sont les niveau de privilège actuel bits (CPL) dans le registre segment de code (CS). Si les bits CPL sont 00, le code s'exécute dans anneau de sécurité, également appelé mode noya. Si les bits CPL sont 11, le code s'exécute dans anneau de sécurité, é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 assez compliquées, mais il suffit de dire que le mode utilisateur a des privilèges considérablement réduits.

Maintenant, lorsque 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 s'exécutent 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 alors 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 éteint et en cours d'exécution.

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

12
Adam Rosenfield

Ce ne sont pas des tortues tout le long. Tout 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 qui exécute ce système d'exploitation. De même, au moins la toute première version d'un compilateur doit être effectuée sur un autre compilateur (et généralement certaines versions ultérieures également, si cette première version s'avère ne pas être en mesure de compiler son propre code source pour l'instant).

Je pense que les tout premiers noyaux Linux ont été compilés sur une boîte Minix, bien que je n'en sois pas certain. GCC était disponible à l'époque. L'un des tout premiers objectifs de nombreux systèmes d'exploitation est d'exécuter un compilateur suffisamment bien pour compiler leur propre code source. Pour aller plus loin, le premier compilateur a été presque certainement é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, 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 boîte 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.

5
The Spooniest

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 des descendants des grandes bêtes .. bref: la technologie (Egg) existait avant le produit actuel (Chicken)

Vous avez besoin d'un noyau pour construire un noyau, c'est-à-dire que vous en construisez 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 du développement du noyau de Bran 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 système d'exploitation).

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

5
Ric Tokyo

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 Nice.

Offrir juste un autre possibilité ...

1
in70x