Compile the Linux Kernel (part1)
Les distributions classiques fournissent des noyaux
binaires pré-compilés, soit sous
forme d’archives RPM dans le
cas des distributions Red Hat, soit sous
forme d’archives DEB dans
le cas de la distribution DEBIAN.
L’utilisation de Linux dans un environnement
industriel embarqué obligera à
adapter le noyau à l’environnement
matériel.
Il peut arriver que certains pilotes de périphériques
ne soient par fournis sur
l’archive officielle du noyau Linux.
Le noyau est tout simplement le programme qui gère
les interactions entre le matériel et les autres programmes. C'est
lui qui amorce le système d'exploitation.
Une chose que beaucoup de personnes ne comprennent
pas est que le noyau est un programme comme les autres, vous pouvez
parfaitement avoir plusieurs noyaux et utiliser celui de votre choix.
Pourquoi compiler son noyau ? Les noyaux fournis par
défaut dans votre distribution /Linux sont des noyaux capables de
tourner sur un maximum de machines et de matériels. Ils sont donc
souvent plus lourds, mais la différence de rapidité est en général
assez faible. En fait les vraies raisons de compiler son propre noyau
sont les suivantes :
- Comprendre comment fonctionne le noyau Linux.
- Faire fonctionner un matériel qui n'est pas pris en charge par votre noyau actuel.
- Appliquer un correctif.
- Vous voulez utiliser une distribution qui
oblige de compiler votre noyau.
La compilation du noyau est longue et demande
beaucoup d'attention sous peine de ne plus pouvoir démarrer sa
machine. Si vous n'avez pas le temps de lire beaucoup de
documentation et si vous n'êtes pas prêt à galérer sérieusement,
alors inutile de vous fatiguer pour rien.
Ce qui nous intéresse ici est la compilation de noyau destiné à l'embarqué et particulièrement aux architectures ARM.
Il est possible d'émuler
la plateforme ARM sur votre poste de travail Linux pour tester les kernel compilés avec Qemu.
List all installed package on your
Ubuntu system:
serge#> dpkg –get-selections
Install the ARM toochain:
serge#> sudo apt-get install gcc-arm-linux-gnueabi
Check the proper installation of the package :
serge#>
dpkg --get-selections | grep arm
Télecharger un emulateur ARM (QEMU) pour tester vos kernel (en attendant le matériel).
List all
available package with the name qemu to download :
serge#>
apt-cache search qemu
serge#>
sudo apt-get install qemu
serge#>
sudo apt-get install qemu-kvm-extras
Les révisions
paires identifient des noyaux stables. En toute rigueur, ce sont les
seuls
qu’il faut utiliser dans le cas de produits industriels. Les
révisions impaires sont des noyaux de développement. La fréquence
de diffusion
de ces noyaux peut être très élevée, parfois un par
semaine ou plus. Leur utilisation n’est absolument pas recommandée
pour
des applications industrielles.
Pour commencer, récupérer la
dernière version du noyau 3.8.9 depuis :
Créer un répertoire de travail en local et copier l'archive téléchargée
dans ce nouveau répertoire:
serge#>
cd /home/serge
serge#>
mkdir kernel_compilation
serge#> cp
./Downloads/linux-3.8.9.tar.xz ./kernel_compilation/
serge#> cd kernel_compilation/
serge#> ls -lrt
Décompresser l'archive dans le répertoire kernel_compilation :
serge#>
tar -xvf linux-3.8.9.tar.xz
Voici une brève description des fichiers et sous-répertoires de l’arborescence du noyau :
• arch
contient le code source spécifique des architectures matérielles
comme x86, ppc,
alpha ou m68k.
• Documentation
contient des fichiers de documentation au format.
• drivers
contient l’arborescence des divers pilotes de périphériques.
• fs
contient le code source des différents systèmes de fichiers, ou
file-systems supportés
par le noyau. Nous pouvons citer par exemple
ext2, vfat ou iso9660.
• include
contient les fichiers d’en-tête C nécessaires à la compilation
du noyau mais
également au développement d’applications.
• init
contient le fichier principal main.c, contenant la fonction
principale main(), du
noyau Linux.
• ipc
contient le code source de la version des IPC System V du noyau
Linux.
• kernel
contient le code source des fonctions majeures du noyau comme la
gestion des
tâches ou des processus.
• mm
contient les fonctions de gestion de la mémoire ou
memory-management.
• net
contient le code source des différents protocoles réseau supportés
par le noyau
Linux. Nous pouvons citer ipv4, ipv6 ou x25.
• scripts
contient le code source des outils de configuration du noyau.
• Makefile
et Rules.make sont les fichiers utilisés par la commande make
lors de la
compilation du noyau.
• sound
contient dans le cas du noyau 2.6 les pilotes ALSA (Advanced Linux
Sound
Archicture) désormais intégrés en standard aux sources du
noyau.
Télécharger
Git, le svn de Linux pour faire de la gestion de configuration :
serge#>
apt-cache search git
serge#>
sudo apt-get install git
L'adresse
du repository Git de travail est la suivante:
https://linux389pi@bitbucket.org/linux389pi/linux389pi.git
L'adresse du repository
officiel de la Rasperry est:
https://github.com/raspberrypi/linux
Clôner le
répertoire de travail en local depuis le repository Git (équivalent
svn checkout):
serge#>
git clone https://linux389pi@bitbucket.org/linux389pi/linux389pi.git
Au cas où, faire un pull ou fetch pour récupérer
les derniers fichiers du repository (equivalent à svn update):
serge#>
cd ~/kernel_compilation/linux389pi/arch/arm/configs
serge#>
git pull origin
Go to the configuration folder to check the default configuration :
serge#>
cd /home/serge/kernel_compilation/linux389pi/arch/arm/configs
Check the presence of the Rasperry Pi configuration file
bcmrpi_deconfig
Define your local environment before compilation:
serge#>
export ARCH=arm
serge#> export CROSS_COMPILE=arm-linux-gnueabi-
serge#> export CROSS_COMPILE=arm-linux-gnueabi-
serge#>
alias make='make -j8'
Comment:
The number coming after the “j” letter is obtained by doing:
2*<number of CPUs>
You
can get the number of CPU by checking the file:
cat
/proc/cpuinfo
Configure
the kernel from the root of your working directory:
serge#>
cd ~/kernel_compilation/linux389pi
serge#>
make bcmrpi_defconfig
After
entering the command, a .config file should be generated.
Build
the kernel from the root of your working directory:
serge#>
cd ~/kernel_compilation/linux389pi
serge#>
make
If
building the kernel produces compilation errors, fix the errors and
perform a clean before rebuilding again with the command:
serge#>
make mrproper
Correcting the build errors by applying a patchfile to the vanilla kernel
The vanilla kernel version is not adapted to
compile for an ARM architecture, that is why we encountered compiling
errors. In order to fix these errors, we are going to apply a
patchfile to the vanilla version.
First,
Go to the main directory
cd
kernel_compilation/
Rename
the directory you downloaded from your central repository:
mv
linux389pi linux_vanilla_kernel
Go
inside the Official Raspberry Pi directory you downloaded rom the
official website:
cd
rpi-3.8.y/
Initialize
a new local git repository on this directory:
git
init
git
add .
Commit
all the subdirectories
git
commit -m "added : rpi-3.8.y sources"
Add
a new local repository from the Pi repository and fetch:
git
remote add vanilla ../linux_vanilla_kernel/
git
fetch vanilla
Generate
the patch file based on the deltas between vanilla kernel version and
the official Rasperry Pi version:
git
diff --no-prefix vanilla/master HEAD > patchfile
Move
the patchfile to the vanilla kernel directory:
mv
patchfile ../linux_vanilla_kernel/
Apply
the patchfile to the vanilla version
patch
-p0 < patchfile
Rebuild
the kernel:
make
mrproper
export
ARCH=arm
export
CROSS_COMPILE=arm-linux-gnueabi-
alias
make='make -j8'
make
bcmrpi_defconfig
make
Check that no errors occurred.
Bonjour,
ReplyDeleteJ'aimerais savoir si l'accès au repôt linux389rpi.git est toujours disponible, svp? Lorsque j'essaie de le cloner, un mot de passe est demandé. J'ai pu télécharger le mainline kernel ailleurs mais je ne trouve pas le fichier bcmrpi_defconfig.