Kernel code source

Fermé
Romeric Messages postés 23 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 6 janvier 2018 - 11 déc. 2017 à 10:30
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 9 janv. 2018 à 09:57
Bonjour,
Jusqu'ici je suis très passionné par les systèmes d'exploitation. Alors pour apprendre plus les concernant, j'ai rencontré un enseignant qui veut bien m'aider. Pour être bref, Il m'a demandé de commencer par étudier le kernel de Linux/Unix et de le modifier dans la mesure du possible. Alors pour cela j'ai téléchargé la version 4.14.2 et celle 1.0 sur kernel.org. Je m'attendais à trouver un projet compilable mais à la place, c'est plutôt un ensemble de code source organisé en fichier. Pourrez-vous m'aider avec un lien ou je peux trouver un projet compilable sinon comment utilisé celui de kernel.org à partir de tous ses dossiers.

Merci.


A voir également:

4 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
12 déc. 2017 à 10:35
Bonjour,

Introduction

C'est tout à fait normal. En fait il faut distinguer plusieurs types de fichiers :
- les headers (.h) qui permettent de compiler quelque chose qui doit s'interfacer avec le noyau (par exemple un pilote)
- les sources (.c, et .h) qui inclue donc les headers, et qui permet de compiler le noyau lui même et ses modules de base (.ko) (et a fortiori, par la suite, des pilotes)
- l'image, installée à terme dans /boot, et ses modules (fichiers .ko) qui sont le résultat de cette compilation, ce qui permettent d'utiliser ta machine et son matériel.

Afin d'illustrer la suite de mon message, je vais considérer que tu utilises une distribution debian ou un dérivé (ubuntu, mint...). Ce que j'explique reste applicable la plupart du temps pour les autres distributions linux moyennant quelques adaptations.

Sous debian cela revient à types de paquets, respectivement
linux-sources-*
,
linux-headers-*
,
linux-image-*
où * est à remplacer par une numéro de version et une architecture (e.g. 4.13.0-1-amd64). Ces paquets (.deb) sont installés à partir du gestionnaire de paquets
apt-get
et sont en gros soit une archive qui contient ce que tu as récupéré sur kernel.org (pour les paquets
linux-headers
et
linux-sources
), soit le résultat obtenu après compilation (
linux-image
).

En pratique quand tu installes un système, seul le paquet
linux-image
(dans sa dernière version et pour ton architecture de micro processeur est installé). Cela suffit à la plupart des utilisateurs. S'ils souhaitent préparer un pilote (e.g. un pilote nvidia), les headers sont suffisants. Ensuite pour un public plus curieux ou qui désire préparer un noyau plus optimisé, il est possible de récupérer les sources et d'indiquer quelles fonctionnalités doivent ou non être supportées dans le noyau.

Récupérer des sources sur kernel.org revient à ce dernier choix, sauf que tu n'es pas passé par
apt-get
. En soi rien de bien gênant, mais personnellement je préfère toujours passer par le gestionnaires de paquets car ça permet de retrouver ce qui est installé sur la machine plus facilement, et donc de la nettoyer plus facilement.

Compiler un noyau

Tu peux regarder ce tutoriel, qui explique comment compiler un kernel. Il est recommandé d'avoir quelques bases en compilation.

Un kernel est écrit en langage C. Le C est un langage compilé, ce qui signifie que ses sources doivent être traitées pour produire un programme utilisable.

Plus précisément :
- compiler un programme consiste à convertir des sources (e.g. fichiers .c) en binaires (.o, .ko, exécutable, librairie .a ou .so, kernel). Les .o sont des binaires destinés à produire un autre binaire (exécutable, .so, .a, ...). Les .ko sont des modules de noyau (~ pilotes).
- le logiciel traditionnellement utilisé pour produire un binaire est
gcc

- chaque exécution de
gcc
est destiné à générer un objet ou un binaire.

Lorsqu'on compile un noyau, des centaines de binaires (.ko et autres) devront être générés. Bien trop pour qu'on les compile tous un par un :-) Pour éviter une tâche aussi fastidieuse, on va s'appuyer sur un script, appelé
Makefile
. Il permet au travers de la commande
make
de réaliser toute une chaîne de commandes. Plus précisément, un Makefile décrit les dépendances entre les différents objets. Il est alors possible de ne construire que les dépendances nécessaires à la compilation de ce que tu veux obtenir (par exemple, ton image de noyau).

L'utilisation des Makefile est très répandue et utilisée pour de nombreux projets (pas forcément des noyaux, et pas forcément écrits en C d'ailleurs). Généralement les dépendances sont connues à l'avance, mais ce n'est pas le cas d'un noyau qu'on veut, en général, optimiser. C'est la raison pour laquelle les dépendances utilisées par le Makefile sont déportées dans un fichier tiers, le fichier
.config
(placé dans le répertoire des sources du noyau).

La première étape pour compiler un noyau consiste à générer/mettre à jour ce
.config
en indiquant ce que tu veux construire. Pour ce faire, une interface permet de le faire
make menuconfig
ou
make oldconfig
(quand on le récupères depuis un répertoire de source de noyau antérieur).

Attention à ne pas enlever des fonctionnalités vitales, car sinon ta machine ne démarrera pas sur ce noyau (kernel panic). Comme généralement le but quand on compile son propre noyau est d'obtenir un noyau optimisé, toute la difficulté est donc de déterminer les fonctionnalités nécessaires ou dont tu pourrais avoir besoin, et désactiver autant que possible les autres. Pour commencer en douceur, tu peux te contenter de garder les choix activés par défaut, ce qui devrait te donner un noyau peu optimisé mais utilisable.

Une fois le
.config
défini, il est alors possible de passer à la compilation proprement dite, puis d'installer le noyau dans
/boot
et ses modules dans
/lib/modules
et de mettre à jour ton boot loader (e.g. grub). Si tu es sous debian ou une distribution qui en dérive, je te conseille d'utiliser
make-kpkg
pour avoir un paquet propre, puis d'installer le paquet obtenu avec
dpkg -i
. Cela permet également ne pas avoir à réaliser toutes ces étapes manuellement. Tout ceci est décrit dans le tutoriel (ainsi que le cas où tu n'es pas sous debian).

Bonne chance
0
Romeric Messages postés 23 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 6 janvier 2018
19 déc. 2017 à 11:56
Salut! Merci pour ta réponse à mon sujet et désolé de te répondre si tard. J'ai suivi la procédure de configuration du noyau telle que proposée sur le lien que tu a suggéré. Mais je n'ai pas encore lancé la compilation. En fait je me demandais si à la fin de la compilation j'aurais une installation complète que je peux graver sur un cd pour ensuite faire booter une machine dessus. Sinon comment je dois m'y prendre pour obtenir cela.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
23 déc. 2017 à 14:20
Attention il ne faut pas mélanger deux choses : le noyau et le système. Cette procédure permet de compiler uniquement le noyau. A la fin tu obtiens une image noyau ou un paquet debian selon la méthode que tu as utilisé (e.g.
make-kpkg
).

On est loin après ça d'avoir un système, il faut ensuite une chaîne de démarrage, un certain nombre de paquets essentiels (par exemple un shell). Si l'idée est de faire une distribution live minimale, il y a des outils pour ça et il n'est même pas utile de compiler son propre noyau (un noyau par défaut fera amplement l'affaire).
https://debian-facile.org/utilisateurs:abdelqahar:tutos:live-build

Bonne chance
0
Romeric Messages postés 23 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 6 janvier 2018
23 déc. 2017 à 18:15
Salut! Merci pour ton assistance!!! L'idée était de compiler un noyau sauf que le résultat final, j'ignorais complètement à quoi ça ressemblerait. J'ai utilisé la méthode de make-kpkg mais elle n'a pas abouti car il me manquait un paquet : kernel-package. Concernant la deuxième méthode, j'ai pas pu l'utilisé car je n'avais pas assez d'indice pour faire des recherches dessus.
Je pense que le sujet de base est déjà résolu. Je vais le passé en résolu. Encore mille fois merci pour ton assistance.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
31 déc. 2017 à 17:15
Merci pour ton retour.

Pour
make-kpkg
il suffit que tu installes avec
apt-get
le paquet approprié.

Bonne chance
0
Le paquet kernel-package est très lourd. Je compte l'installer en cours de semaine. Je vous réécris dès que j'ai compilé le kernel. Je ne saurais vous remercier suffisament pour votre assistance. Merci.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
4 janv. 2018 à 13:39
A priori il s'agit plutôt d'un paquet
linux-source-*
si tu utilises une distribution basée sur debian (comme ubuntu ou mint).
0
Romeric Messages postés 23 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 6 janvier 2018
Modifié le 9 janv. 2018 à 09:50
Bonsoir !

J'ai enfin pu lancer la compilation du kernel. Mais elle a été interrompue. Je viens juste de le faire donc je n'ai encore aucun indice pour essayer de corriger l'erreur. Ci-dessous, je vous laisse un aperçu de l'évolution de la compilation jusqu'à son interruption.

//Début du processus de compilation du kernel

exec make kpkg_version=13.018 -f /usr/share/kernel-package/ruleset/minimal.mk debian


== making target debian/stamp/conf/minimal_debian [new prereqs: ]==

This is kernel package version 13.018.
test -d debian || mkdir debian
test ! -e stamp-building || rm -f stamp-building
install -p -m 755 /usr/share/kernel-package/rules debian/rules
for file in ChangeLog Control Control.bin86 config templates.in rules; do \
cp -f /usr/share/kernel-package/$file ./debian/; \
done
cp: impossible d'évaluer '/usr/share/kernel-package/ChangeLog': Aucun fichier ou dossier de ce type
for dir in Config docs examples ruleset scripts pkg po; do \
cp -af /usr/share/kernel-package/$dir ./debian/; \
done
test -f debian/control || sed -e 's/=V/1.0./g' \
-e 's/=D/1.0.-10.00.Custom/g' -e 's/=A/amd64/g' \
-e 's/=SA//g' \
-e 's/=I//g' \
-e 's/=CV/1.0/g' \
-e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
-e 's/=R//g' /usr/share/kernel-package/Control > debian/control
test -f debian/changelog || sed -e 's/=V/1.0./g' \
-e 's/=D/1.0.-10.00.Custom/g' -e 's/=A/amd64/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
-e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
/usr/share/kernel-package/changelog > debian/changelog
chmod 0644 debian/control debian/changelog
test -d ./debian/stamp || mkdir debian/stamp
make -f debian/rules debian/stamp/conf/kernel-conf
make[1] : on entre dans le répertoire « /home/user/Téléchargements/linuxx »


== making target debian/stamp/conf/kernel-conf [new prereqs: ]==

make ARCH=x86_64 \
oldconfig;
make[2] : on entre dans le répertoire « /home/user/Téléchargements/linuxx »
make[2]: *** Aucune règle pour fabriquer la cible « oldconfig ». Arrêt.
make[2] : on quitte le répertoire « /home/user/Téléchargements/linuxx »
debian/ruleset/targets/common.mk:194 : la recette pour la cible « debian/stamp/conf/kernel-conf » a échouée
make[1]: *** [debian/stamp/conf/kernel-conf] Erreur 2
make[1] : on quitte le répertoire « /home/user/Téléchargements/linuxx »
/usr/share/kernel-package/ruleset/minimal.mk:93 : la recette pour la cible « debian/stamp/conf/minimal_debian » a échouée
make: *** [debian/stamp/conf/minimal_debian] Erreur 2
Failed to create a ./debian directory: at /usr/bin/make-kpkg line 970.
0
Romeric Messages postés 23 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 6 janvier 2018
Modifié le 9 janv. 2018 à 09:52
voilà, c'est tout . . .

J'ai dû séparer le contenu de mon message en deux, il ne tenait pas dans un seul message (problème lors de la validation).

J'ai essayé de compiler de même la version 4.14 pour voir si le même problème se présentera mais le comportement était différent. Sauf que j'ai pas eu l'impression que ce se soit bien passé aussi. Voici une copie des différents messages reçues lors de la compilation :

// Début du processus de la compilation du kernel 4.14

exec make kpkg_version=13.018 -f /usr/share/kernel-package/ruleset/minimal.mk debian

== making target debian/stamp/conf/minimal_debian [new prereqs: ]==

This is kernel package version 13.018.
test -d debian || mkdir debian
test ! -e stamp-building || rm -f stamp-building
install -p -m 755 /usr/share/kernel-package/rules debian/rules
for file in ChangeLog Control Control.bin86 config templates.in rules; do \
cp -f /usr/share/kernel-package/$file ./debian/; \
done
cp: impossible d'évaluer '/usr/share/kernel-package/ChangeLog': Aucun fichier ou dossier de ce type
for dir in Config docs examples ruleset scripts pkg po; do \
cp -af /usr/share/kernel-package/$dir ./debian/; \
done
test -f debian/control || sed -e 's/=V/4.14.2/g' \
-e 's/=D/4.14.2-10.00.Custom/g' -e 's/=A/amd64/g' \
-e 's/=SA//g' \
-e 's/=I//g' \
-e 's/=CV/4.14/g' \
-e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
-e 's/=R//g' /usr/share/kernel-package/Control > debian/control
test -f debian/changelog || sed -e 's/=V/4.14.2/g' \
-e 's/=D/4.14.2-10.00.Custom/g' -e 's/=A/amd64/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
-e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
/usr/share/kernel-package/changelog > debian/changelog
chmod 0644 debian/control debian/changelog
test -d ./debian/stamp || mkdir debian/stamp
make -f debian/rules debian/stamp/conf/kernel-conf
make[1] : on entre dans le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »


== making target debian/stamp/conf/kernel-conf [new prereqs: ]==

make ARCH=x86_64 \
oldconfig;
make[2] : on entre dans le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
HOSTCC scripts/basic/bin2c
scripts/kconfig/conf --oldconfig Kconfig
#
# configuration written to .config
#
make[2] : on quitte le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
make ARCH=x86_64 prepare
make[2] : on entre dans le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
scripts/kconfig/conf --silentoldconfig Kconfig
SYSTBL arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h
SYSHDR arch/x86/entry/syscalls/../../include/generated/asm/unistd_32_ia32.h
SYSHDR arch/x86/entry/syscalls/../../include/generated/asm/unistd_64_x32.h
SYSTBL arch/x86/entry/syscalls/../../include/generated/asm/syscalls_64.h
HYPERCALLS arch/x86/entry/syscalls/../../include/generated/asm/xen-hypercalls.h
SYSHDR arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_32.h
SYSHDR arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_64.h
SYSHDR arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_x32.h
HOSTCC arch/x86/tools/relocs_32.o
HOSTCC arch/x86/tools/relocs_64.o
HOSTCC arch/x86/tools/relocs_common.o
HOSTLD arch/x86/tools/relocs
CHK include/config/kernel.release
UPD include/config/kernel.release
WRAP arch/x86/include/generated/asm/clkdev.h
WRAP arch/x86/include/generated/asm/dma-contiguous.h
WRAP arch/x86/include/generated/asm/early_ioremap.h
WRAP arch/x86/include/generated/asm/mcs_spinlock.h
WRAP arch/x86/include/generated/asm/mm-arch-hooks.h
CHK include/generated/uapi/linux/version.h
UPD include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
UPD include/generated/utsrelease.h
CC arch/x86/purgatory/purgatory.o
AS arch/x86/purgatory/stack.o
AS arch/x86/purgatory/setup-x86_64.o
CC arch/x86/purgatory/sha256.o
AS arch/x86/purgatory/entry64.o
CC arch/x86/purgatory/string.o
LD arch/x86/purgatory/purgatory.ro
BIN2C arch/x86/purgatory/kexec-purgatory.c
CHK include/generated/timeconst.h
UPD include/generated/timeconst.h
CC kernel/bounds.s
CHK include/generated/bounds.h
UPD include/generated/bounds.h
GEN scripts/gdb/linux/constants.py
CC arch/x86/kernel/asm-offsets.s
CHK include/generated/asm-offsets.h
UPD include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
make[2] : on quitte le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
echo done > debian/stamp/conf/kernel-conf
make[1] : on quitte le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
make -f debian/rules debian/stamp/conf/full-changelog
make[1] : on entre dans le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »


== making target debian/stamp/conf/full-changelog [new prereqs: ]==

for file in ChangeLog Control Control.bin86 config templates.in rules; do \
cp -f /usr/share/kernel-package/$file ./debian/; \
done
cp: impossible d'évaluer '/usr/share/kernel-package/ChangeLog': Aucun fichier ou dossier de ce type
for dir in Config docs examples ruleset scripts pkg po; do \
cp -af /usr/share/kernel-package/$dir ./debian/; \
done
install -p -m 755 /usr/share/kernel-package/rules debian/rules
sed -e 's/=V/4.14.2/g' \
-e 's/=D/4.14.2-10.00.Custom/g' -e 's/=A/amd64/g' \
-e 's/=SA//g' \
-e 's/=I//g' \
-e 's/=CV/4.14/g' \
-e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
-e 's/=R//g' /usr/share/kernel-package/Control > debian/control
sed -e 's/=V/4.14.2/g' -e 's/=D/4.14.2-10.00.Custom/g' \
-e 's/=A/amd64/g' -e 's/=M/Unknown Kernel Package Maintainer <unknown@unconfigured.in.etc.kernel-pkg.conf>/g' \
-e 's/=ST/linux/g' -e 's/=B/x86_64/g' \
/usr/share/kernel-package/changelog > debian/changelog
chmod 0644 debian/control debian/changelog
make -f debian/rules debian/stamp/conf/kernel-conf
make[2] : on entre dans le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
make[2]: « debian/stamp/conf/kernel-conf » est à jour.
make[2] : on quitte le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
make[1] : on quitte le répertoire « /home/user/Téléchargements/linux-4.14.2/linux-4.14.2 »
echo done > debian/stamp/conf/minimal_debian
exec debian/rules
nothing to be done.


Je suis impatient d'avoir votre avis sur ce problème. Merci.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
9 janv. 2018 à 09:57
Bonjour,

Tu n'as pas a télécharger les sources de noyau "à la main" dans

/home/user/Téléchargements/linuxx
comme tu sembles l'avoir fait. Si tu installes un paquet
linux-source
le noyau correspondant sera dans
/usr/src/
.

De plus ton erreur de compilation semble provenir du fait que tu lance
make oldconfig
(visiblement indirectement, par l'intermédiaire de make-kpgk). Mais dans ce cas, il faut que le
Makefile
de tes sources de noyau propose cette cible, ce qui ne semble pas être le cas. Je pense que c'est lié au fait que tu n'as pas pris des sources de noyaux prévues pour être compilées avec
make-kpkg
. Cette commande est prévue pour fonctionner avec des sources fournies par un paquet
linux-source
.

Si tu veux absolument compiler les sources que tu as récupérées, suis ce tutoriel :
https://www.mistra.fr/tutoriel-linux-compiler.html

Bonne chance
0