Saturday, May 11, 2013

Compile the Linux Kernel (part1)

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 :

  1. Comprendre comment fonctionne le noyau Linux.
  2. Faire fonctionner un matériel qui n'est pas pris en charge par votre noyau actuel.
  3. Appliquer un correctif.
  4. 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


Pour Information, le noyau est identifié par un triplet version.révision.patch, exemple 2.4.13
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#> 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.

SERGE ABOU-SALEH

Author & Editor

Senior software engineer with 12 years of experience in both embedded systems and C# .NET

1 comments:

  1. Bonjour,
    J'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.

    ReplyDelete

Note: Only a member of this blog may post a comment.

 
biz.