Vous êtes sur la page 1sur 21

Prsentation de la cible Quest-ce que Linux ?

Sommaire La cible : Calao USB-A9260

Formation au Noyau Linux


Prsentation gnrale
Compiler
Jrme Pouiller <j.pouiller@sysmic.org>
Les concepts de dveloppement
Debugguer
LAPI
Contribuer

Sysmic - J. Pouiller Formation au Noyau Linux 2 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 3 / 182

Prsentation de la cible Quest-ce que Linux ? Prsentation de la cible Quest-ce que Linux ? Prsentation de la cible Quest-ce que Linux ?

La cible : Calao USB-A9260 Composants de Linux Elements


GNU/Linux est finalement un agglomra :

App App
Architecture trs classique dans le milieu de Linux embarqu :
Il y a trois lments important de GNU/Linux :
Microcontrolleur Atmel AT91SAM9260 App Bash GNU App App
Core ARM926EJ-S 180MHz Le noyau : Linux
64Mo de RAM GNU lib Lib Le projet GNU et plus particulirement la glibc, bash et les
256Mo de flash coreutils
64Ko dEEPROM GNU libc Les normes : SystemV, Posix, etc...

Choisie car compacte et trs bien supporte par Linux


Noyau Linux

Matriel

Sysmic - J. Pouiller Formation au Noyau Linux 4 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 5 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 6 / 182

Prsentation de la cible Quest-ce que Linux ? Prsentation de la cible Quest-ce que Linux ? Prsentation de la cible Quest-ce que Linux ?

La Norme Posix Le Projet GNU Le noyau Linux

Cr en 1991 par Linus Torvalds :


Cr en 1983 par Richard Stallman http://groups.google.com/group/comp.os.minix/
Portable Operating System Interface [for Unix] browse_thread/thread/76536d1fb451ac60
Pose les bases politiques de GNU/Linux
Uniformise les OS Inspir de Minix
GPL publie en 1989 just a hobby, wont be big and professional like gnu
Premire version publie en 1988 GPLv2 en 1991
GPLv3 en 2006
Noyau monolithique
Souvent implment en partie
Dbat TanenbaumTorvalds
... et parfois sen inspire simplement gcc apparait en 1985 http://groups.google.com/group/comp.os.minix/
Posix 9 Linux bash et les Coreutils apparaissent en 1988 (inspirs de sh browse_thread/thread/c25870d7a41696d2
1971/1977) Modulaire depuis la version 2.6
Linux 9 Posix
Nombre darchitectures supportes incalculable Systme communautaire
La licence GPL t choisie par pragmatisme et non par conviction
Eternels dbats dopinions entre Stallman et Torvalds

Sysmic - J. Pouiller Formation au Noyau Linux 7 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 8 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 9 / 182
Prsentation de la cible Quest-ce que Linux ? Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

3 Les BSP
Le noyau Linux 4 Obtenir le noyau
Quelques chiffres
Tlcharger les sources
Comprendre le versionning
15 millions de lignes de code dans 30000 fichiers (+15%/an)
Utiliser Git
Environ 1200 dveloppeurs dans 600 entreprises (+35%/an)
Environ 5000 contributeurs depuis la premire version de Linux
Deuxime partie II 5 Organisation des sources
Les sous-rpertoires de la racine
Environ 650 mainteneurs (cest--dire responsables dune partie
Le rpertoire arch/
du noyau)
Compiler le noyau
26 architecures (= jeux dinstructions) Compiler 6

Le systme de compilation du noyau


Des centaines de plateformes
Grer les configurations
Plus dun millier de drivers
Modifier les configurations
Une centaine de versions publies
Compiler
Environ 10000 contributions sur chaque version
Options de Kbuild
Enormment de forks et de version non-officielles
Rsultats de la compilation
Domaine dapplication trs large, du DSP au super-calculateurs
en passant pas les grille de calcul Compiler les modules
Faire le mnage
Sysmic - J. Pouiller Formation au Noyau Linux 10 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 11 / 182 7 Options principales Sysmic - J. Pouiller Formation au Noyau Linux 12 / 182

Configuration globale
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP Fonctionnalits du noyau
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Les options de boot


Quest-ce quun BSP ? Rcupration des sources Versionning
Le rseau
Board Support Package (BSP) AuLes systmes
dbut, de fichiers
le noyau sincrmentait de deux en deux : 2.0, 2.2, 2.4,
Normalement fourni par lintgrateur. 8 Les drivers
etc... Les version impaires indiquait les noyau en dveloppement.
Contient au minimum la toolchain (compilateur, linker, Chaque version du noyau apportait des ruptures importantes
Autres options
Ou rcuprer les sources du originales noyau ?
debuggueur) pour la cible, au minimum les sources, et souvent 9
avec
Le bootla tftp/nfs
version prcdente
des versions pr-compiles Utiliser les sources souvent fournies avec le BSP. Il arrive Avec le noyau 2.5 puis 2.6, le noyau est arriv une certaine
Cette toolchain est souvent compile avec une libc (glibc, clibc, souvent quelles contiennent des drivers particuliers et quelles 10 Options
maturit. deLesdmarrage
gros changements sont devenus rares et les
newlib, bionic, eglibc, dietlibc, klibc, etc...) et une version des soient dj configures 11 Fabrication
dveloppements dun BSP
sont devenus de plus en plus itratifs
binutils. Si ca nest pas le cas, elle pourra compiler le noyau Tlcharger sur kernel.org Finalement dans la version 2.6, toutes les versions mineures
Linux, mais aucune binaire utilisateur. sont stables
Contient souvent le bootloader (sources et/ou binaire) le noyau host$ wget http://www.kernel.org/pub/linux/ Les versions stables de la 2.6 peuvent recevoir des correctifs et
Linux (au minimum les sources, et parfois une version kernel/v3.x/linux-3.3.tar.bz2 sont alors numrots sur 4 chiffres : (exemple : 2.6.32.59)
pr-compile). host$ tar xvjf linux-3.3.tar.bz2 Le dveloppement dune nouvelle version du noyau 2.6 en
Si la cible possde des drivers spcifique externes Linux, ils intgrant les patchs provenant des sous-systmes. Les noyaux
doivent (devraient) tre fournis avec la toolchain. Utiliser git clone produit lors de lintgration de ses patchs est suffixs par rcX
De mme, si la cible doit utiliser certaine bibliothques (release candidate).
spcifiques, elle sont normalement fournies Le dveloppement noyau alterne les fentres de merge pendant
Contient la documentation (parfois incomplte...) lesquels, les mainteneurs des sous-systmes envoient leurs
Assez souvent, un rootfs est fourni dveloppements Linus Torvalds et fentres de stabilisation.
Sysmic - J. Pouiller Formation au Noyau Linux 13 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 14 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 15 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Versionning Git Git


git est loutil de gestion de sources du noyau Pour rcuprer un dpt :
Il est fortement recommander de lutiliser dans le cadre du git clone <dept>
La version 3.0 correspond en fait la version 2.6.40 renomme : dveloppement du noyau
Il ny a eu aucune refonte de larchitecture entre les version 2.6 et 3 Il sagit dun systme de gestion dcentralis. Quelques dpts notables :
Pour fter les 20ans du kernel Pour expliquer la dcentralisation, imaginez que : git://git.kernel.org/pub/scm/linux/kernel/git/
Pour marquer lintgration de la branche RT-Preempt dans le torvalds/linux-2.6.git Le dpt de Linus Torvalds. Il
Un utilisateur duplique un dpt svn
mainstream contient les derniers patchs du noyau en dveloppement
Des modifications sont apportes sur les deux dpts
Parce quavec le cycle de dveloppement itratif, la version 2.6 ne On essaye de resynchronisez les deux dpts...
git://git.kernel.org/pub/scm/linux/kernel/git/
sincrmentera jamais. Les version stable quant elles peuvent stable/linux-stable.git Le dpt stable. Contient la
recevoir des correctif et se retrouver sur 4 chiffres. Il y avait par
Considrez git comme un svn capable deffectuer cette opration dernire version stable du noyau, ainsi les mises jours des
consquent un chiffres en trop. Le passage en 3.Y.Z permettait de trs simplement. versions stables
revenir sur un modle classique 3 chiffres. Lorsquun utilisateur rcupre le code dun dpt, il devient git://git.kernel.org/pub/scm/linux/kernel/git/
Le passage en 3.X marque ainssi la stabilisation du cycle de lui-mme dpt next/linux-next.git Les dpt une dizaine de sous-projets
dveloppement du noyau Si lutilisateur laisse un moyen quelconque daccs en lecture importants sont mergs automatiquement dans ce dpt. Utilis
son dpt, dautres personnes pourrons leur tour le cloner ou principalement par des robots afin didentifier les problmes de
Rfrence : Documentation/development-process
merge en amont des phases dintgrations
tirer les modification quil a effectu
git://git.kernel.org/pub/scm/linux/kernel/git/
http://git.kernel.org liste les dpts publiques des tglx/history.git Lhistorique des versions entre 2.5.0 et
principaux dveloppeurs du noyau 2.6.12.
Sysmic - J. Pouiller Formation au Noyau Linux 16 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 17 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 18 / 182
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Git Organisation des sources Organisation des sources

Rcuprons la version stable


On remarque quil existent dnorme diffrences de tailles entre les
host$ git clone git://git.kernel.org/pub/scm/linux/ rpertoires : Les services indispensables un OS :
kernel/git/stable/linux-stable.git kernel Le scheduler de tches, les frameworks de gestion des
$ du -s */ | sort -n | column
40 usr 4092 scripts IRQ, le loader de binaires, diverses autre fonctionnalits ne
Chaque version du noyau est marque avec un tag 156 samples 5248 kernel rentrant dans aucune autre catgories.
160 init 6436 firmware mm Le gestionnaire de mmoire. Considr comme la partie la plus
host$ git tag complexe du noyau
180 virt 19524 Documentation
init La fonction de dmarrage du noyau (start_kernel).
Puis il est possible de rcuprer une version avec 232 ipc 21332 net arch Le code spcifique chaque architecture. En particulier, le
884 block 22728 include code ncessaire au boot, la gnration des images, les routine
host$ git checkout v3.3 1904 crypto 24016 sound assembleur pour la gestion des interruptions, etc...
9 1932 lib 32436 fs On peut estimer que lintelligence rside principalement dans
Votre dpt est alors non-modifiable. Vous devez crer une branche 2076 security 121584 arch kernel et mm. On remarque cette partie est finalement
de travail : 2400 mm 252688 drivers relativement petite dans le noyau.
3536 tools
host$ git checkout -b mybranch v3.3

Sysmic - J. Pouiller Formation au Noyau Linux 19 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 20 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 21 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Organisation des sources Organisation des sources Organisation des sources

Des bibliothques utilitaires :


Les drivers lib Divers utilitaires
drivers/* Tous les autres drivers et frameworks de crypto Fonctions utilitaires relatives la cryptographie
Les services supplmentaires du noyau : dveloppements. De loin la plus grosse partie du code du noyau.
Le code annexe :
fs Les systmes de fichiers : ext3, NTFS, NFS, etc... sound Les drivers de cartes son.
net La gestion du rseau et plus particulirement la stack IP firmware Certains priphriques ncessitent lupload dun include Les headers exposs du noyau.
ipc La gestion des communication inter-processus (shmem, mq, firmware pour sinitialiser. firmware contient les binaires de ces scripts Les scripts ou les programmes utilitaires ncessaires
etc..) firmwares (sans les sources !). La politique de Linux au sujet du la compilation ou lexploitation du noyau
security Les frameworks de gestion de la scurit (selinux, code de ces firmwares est quil sagit de donnes dinitialisation de usr Script ncessaire la gnration des initramfs
apparmor, etc..) ces priphriques et que par consquent, ils ont leurs place dans tools Les outils permettant la communication de certains
larborescence du noyau. frameworks avec le noyau (particulirement perf)
block Le framework des priphriques de block. La documentation
virt/kvm Le framework de virtualisation kvm. Documentation La documentation
sample Des exemples de code pour certains frameworks

Sysmic - J. Pouiller Formation au Noyau Linux 22 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 23 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 24 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Les architectures Le code spcifiques aux architectures Fonctionnement de Kconfig


Regardons arch/ de plus prs :
On retrouve dans les sous-rpertoire de arch/ certains
Les PC : x86 rpertoires de la racine.
Les workstations et les serveurs : alpha, sparc (Sun), ia64 Systme de compilation du noyau
mach-, plat-, plateforms contiennent du code spcifique
(Intel), powerpc, s390 (Mainframes dIBM) parisc un type de plateformes : Ti Omap, Atmel AT91, PowerPC 85xx Application de la rgle : Pas gnrique mais simple hacker
(Workstation HP) Dpend principalement de gmake
On pourra trouver des fichiers spcifique aux board.
Lembarqu : arm, mips, sh (STMicroelectronics), avr32, m68k, Particulirement vrai pour les architectures non plug-and-play qui Pas un systme de compilation rel. Compos de :
score, mn10300, m32r h8300 ncessite que les priphriques soient dclars manuellement Kconfig : Systme de gestion de configuration
Les architectures ddies : cris (Embedded Network), frv Kbuild : Ensemble de rgles de Makefile bien penses
include/ contient des headers spcifiques larchitecture.
(Futjisu, Traitement dimage) Adapt aux environnements proposant beaucoup doptions de
Lors de la compilation, un lien symbolique sera cr entre
Les DSP : c6x (Texas Instrument), heaxgon (Qualcomm), arch/<ARCH>/include/asm et include/asm. Ce lien configuration
blackfin permet au noyau de sabstraire de la plateforme Trs bien adapt la cross-compilation
Les softcores : microbaze, xtensa boot/ contient le code ncessaire au dmarrage de la cible : Utilis dans dautre projets : clibc, busybox, buildroot (tous
Les exprimentaux tile (Architecture distribue), unicore32 Le code du bootloader et les scripts associs permettant la dans le milieu de lembarqu)
(Universit de Pekin), openrisc dcompression du noyau en mmoire
User Mode Linux : um Les scripts ncessaire la gnration dune image au format du
bootloader, du flasher ou de la sonde JTAG
On retrouve nos 26 (+1) architectures supportes
Sysmic - J. Pouiller Formation au Noyau Linux 25 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 26 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 27 / 182
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Le systme de compilation Travailler avec les configurations Travailler avec les configurations
Lorsque votre fichier .config nest parfaitement compatible
Pour obtenir de laide sur les diffrentes cibles : avec vos sources (import, mise jours des sources, dition
make help propose des configurations prtablies. Il est manuelle, ...), il recommand (ncessaire ?) de lancer
host$ make help possible dimporter une de ces configuration :
host$ make oldconfig
La variable ARCH= spcifie larchitecture cible utiliser. Elle host$ make ARCH=arm usb-a9260_defconfig
oldconfig vous indique dventuelles incompatibilit entre
impacte les options du noyau. Comparez make help avec votre configuration et vos sources et vous demande votre avis
make ARCH=arm help. Kconfig sauvegarde la configuration dans .config.
sur les nouvelles options
Si ARCH nest pas spcifie, Kconfig utilise larchitecture host. Le fichier .config sera ensuite : Pour rpondre systmatiquement avec la rponse par dfaut :
Sourc dans les systmes de Makefile
Lorsque vous avez commenc spcifier ARCH, vous devez Transform en include/generated/autoconf.h et inclut host$ yes "" | make oldconfig
toujours la spcifier. dans les headers de compilations
Obtenir la liste des nouvelles options par rapport votre
Il est toutefois possible de placer cette variable dans le Makefile Certains constructeur vous fournirons un patch ajoutant une configuration :
racine ou dans lenvironnement pour viter de loublier. cible _defconfig
host$ make listnewconfig
host$ export ARCH=arm ... dautres vous fournirons un .config
Vous pouvez normalement trouver la configuration du noyau de
votre host dans /boot/config-uname -r
Sauver votre configuration en effectuant un sanity check
Sysmic - J. Pouiller Formation au Noyau Linux 28 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 29 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 30 / 182
host$ make savedefconfig

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
Rfrence : Documentation/kbuild/kconfig.txt
BSP Obtenir le noyau Organisation des sources Compiler le noyau
Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Configurer le noyau Configurer le noyau Les cibles de compilation


En Qt4 La compilation du noyau se lance juste avec
Pour configurer les options :
host% apt-get install libqt4-dev
host$ make
En ligne de commande (inutilisable pour un humain) host$ make xconfig

host$ make config En Gtk Le systme choisi les cible approprie en fonction de votre
architecture (principalement, une image et les modules)
En ncurses host% apt-get install libglade2-dev Il est souvent prfrable (ncessaire ?) de spcifier le type
host$ make gconfig dimage voulue avec
host% apt-get install libncurses5-dev
host$ make menuconfig Dans toutes les interfaces, il est possible dobtenir de la host$ make XXImage
description sur llment slectionn (<h> ou <?>)
Avec la nouvelle version de ncurses Il est possible de rechercher dans les descriptions des lments XX fait rfrence au format de la binaire produite :
(</>) Le code commence=t=il au premier octet ?
host% apt-get install libncurses5-dev Respecte-t-il le format ELF ?
host$ make nconfig Dans la recherche et dans laide, vous trouverez des
Y a-t-il un format particulier dentte respecter ?
informations sur les dpendances entre les options
Les script scripts/config permet de changer les Dans le doute, il faut consulter la documentation de votre
configuration la main bootloader

Sysmic - J. Pouiller Formation au Noyau Linux 31 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 32 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 33 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Options de Kbuild Options de Kmake Rsultats de la compilation


Certaines options peuvent tre passes sur la ligne de commande Fichiers produits (ou productibles) par la compilation :
C={1,2} lance loutil sparse sur les sources. Nous y
afin de modifier le comportement gnral du systme.
reviendrons.
ARCH= spcifie larchitecture utiliser. (Nous lavons dj vu) vmlinux : Limage ELF du noyau. Lisible par les debugueurs,
-jX est une option de make qui permet de lancer X compilation certains flasheurs, certain bootloaders
CROSS_COMPILE= spcifie le prfixe de la toolchain. Ainsi, si
simultanes. Grosso modo, X devrait tre plus ou moins votre
vous compilez avec vmlinuz : parfois quivalent du bzImage, mais normalement, il
nombre de coeurs CPU.
/opt/arm/usr/bin/arm-linux-ulibc-gcc, vous devez sagit devmlinux compress et stripp des informations inutiles
spcifier : O= permet de compiler out-of-source : au dmarrage. Inutilisable dans ltat, il est ncessaire de lui
CROSS_COMPILE=/opt/arm/usr/bin/arm-linux-ulibc-. host$ mkdir build adjoindre un bootloader pour le dcompresser et lexcuter.
Par commodit, on prfrera ajouter /opt/arm/usr/bin la host$ make ARCH=arm CROSS_COMPILE=arm-linux- O= Image : vmlinux stripp et prfix par un mini-bootloader
variable denvironnement PATH. Il est aussi possible de build menuconfig permettant de sauter sur la fonction start_kernel de
configurer CROSS_COMPILE par Kconfig vmlinux.
V=1 permet dafficher les commandes lances par le systme de Tous les fichier issus de la gnration seront placs dans build. bzImage et zImage : vmlinuz avec le bootloader bz2 ou gz.
compilation plutt que la version abrge. Pas trs lisible lors Une fois que votre configuration est cre, vous pouvez lancer
des compilations parallles mais indispensable pour comprendre make directement partir de build. La compilation xipImage : Idem Image mais destin tre excut
certaines erreurs de compilation out-of-source permet une grande souplesse de dveloppement directement sur un eeprom sans tre copier en mmoire au
De base, le noyau nactive que les warnings utiles (ainsi, les et est fortement recommande. pralable.
warnings produits sont rarement ignorer). W=[123] permet Rfrence : Documentation/kbuild/kbuild.txt uImage : Image avec une entte spciale pour u-boot.
dactiver des warnings supplmentaires
Sysmic - J. Pouiller Formation au Noyau Linux 34 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 35 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 36 / 182
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Le format S3 Les modules Les modules et linstallation


Une grosse partie du noyau peut tre compil directement dans le make modules permet de compiler les modules
noyau ou sous forme de modules. make INSTALL_MOD_PATH=$(pwd)/../target
Ils sont marqus par < > (non-compil), <*> (link en statique) modules_install copie les modules dans
ou <M> (compil en module). $INSTALL_MOD_PATH (= dans le rootfs de la cible)
Les modules peuvent tre apparents des plugins pour le make modules_prepare prepare les sources pour que les
Il est possible de gnrer des image au format SRecord en utilisant noyau. Il peuvent tre charg et dchargs dynamiquement. modules extrieur puissent compiler
objcopy Les modules doivent tre prsent sur la cible make INSTALL_PATH=$(pwd)/../target install appelle
Les modules permettent dallger la taille (et amliorer les arch/$ARCH/boot/install.sh qui appelle
host$ objcopy -O srec vmlinux vmlinux.srec performances) du noyau et vitent de redmarrer la cible lors du ~/bin/installkernel ou copie le noyau dans
dveloppement $INSTALL_PATH
Les modules ne peuvent tre charg quaprs le dmarrage du make *-pkg cre des packages (nafs) pour diverses
noyau. Par consquent, certaines fonctionnalits ne peuvent pas distributions. Ces packages contiennent le noyau et les modules.
tre sous forme de modules make INSTALL_HDR_PATH=$(pwd)/../BSP/include
Les drivers ncessaire au chargements des modules ne peuvent headers_install copie les headers dans
pas tre des modules. Ainsi, si vos modules sont sur une flash, $INSTALL_HDR_PATH. Ces headers sont suffisants pour
tous les drivers ncessaires laccs cette flash doivent tre compiler les programmes de lespace utilisateur. Si votre
statiques toolchain est correctement compile, vous ne devriez pas en
Il est possible de dvelopper des modules en dehors de avoir besoin.
Sysmic - J. Pouiller Formation au Noyau Linux 37 / 182
larborescence du noyau.
Sysmic - J. Pouiller Formation au Noyau Linux 38 / 182 Rfrence : Documentation/kbuild/kbuild.txt,
Sysmic - J. Pouiller Formation au Noyau Linux 39 / 182

Documentation/make/headers_install.txt
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Clean Configuration globale Configuration globale


General setup :
Prompt for development and/or incomplete code/drivers :
Dbloque les options de compilation pour les drivers/option
instables (staging, etc...) SYSVIPC et MQUEUE : Communication inter-processus dfinis
make clean Supprime les fichier objets (qui ne sont plus utiles par Posix
Cross-compiler tool prefix : Affecte la variable CROSS_COMPILE
une fois le noyau compil) IKCONFIG : Embarque le .config dans le noyau
Local version : Ajoute un identifiant la version. Indispensable
make mrproper Supprime tous les rsultats de la compilation EXPERT et EMBEDDED Dbloque les options permettant
dans les phases dintgration. La version peut tre lue dans
ainsi que les fichiers de configuration principalement de rduire la taille du noyau en supprimant des
/proc/version. Il est aussi possible de faire
make distclean Supprime les rsultats de compilation, les make kernelrelease dans un rpertoire de compilation du modules importants
configurations et fichiers originaires de lintgration de patchs ou noyau. CC_OPTIMIZE_FOR_SIZE : Compile avec -Os
de ldition de fichiers (*~, *.orig, *.rej, etc...)
Automatically append version information : Ajoute lidentifiant git KPROBES, PERF_EVENTS, PROFILING, GCOV_KERNEL : Active
la version. Indispensable dans les phases de dveloppement les diffrentes instrumentations du noyau
Kernel compression mode : Permet de choisir le type de
compression. Chaque algorithme a ces inconvnients et ses
intrts.
SWAP : Permet de grer un espace dchange dur un disque
Sysmic - J. Pouiller Formation au Noyau Linux 40 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 41 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 42 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Les priphriques de block Options de lhorloges Options de lordonnanceur

MODULES : Active la gestion des modules Kernel features


Preemption Model : Permet dactiver la premption du noyau. Le
HZ (pas sur ARM) : Dfinit lintervalle de rordonnancement de pire temps rponse sont amliors, mais le temps moyen est
BLOCK : Il est possible de dsactiver la gestion des priphrique de lordonnanceur. Plus cette valeur est forte, plus loverhead
block si votre systme nutilise que de la mmoire flash. gnralement moins bon. Un noyau premptif stresse beaucoup
introduit par le changement de contexte est important et plus les plus de code. Ne pas activer si vous utilisez des drivers extrieur
IO Schedulers : Permet de choisir un ordonnanceur dE/S temps de rponses des tches sont courts non garanti pour cette option.
diffrent de celui propos en standard NO_HZ : Permet de rendre la priode de rordonnancement des RT_PREEMPT (sur certaines architectures seulement) : Permet
tches dynamique. Devrait permettre un lger gain de CPU de threader les IRQ et ainsi de remplacer les spinlock par des
System type : (finalement ngligeable avec lordonnanceur en o(1)). Permet mutex. Ajoute un protocole dhritage de priorit aux mutex. Le
Permet de choisir le type darchitecture et de chipset surtout de gagner en consommation lectrique. kernel devient alors totalement premptif. A nutilisez que lors
Il est possible de dsactiver certains cache lors des phases de HIGH_RES_TIMER : Gre les timers avec une horloge diffrente dapplication temps relle. Etudiez des solutions base
dveloppement de lordonnanceur (lhorloge est alors gr comme un dhyperviseurs.
priphrique part). Permet dobtenir une bien meilleure Ne confondez pas la premption du noyau avec la premption
Vous trouverez aussi dans ce menu les options relative au jeu
prcision sur les mesure de temps, condition que votre des tches utilisateur.
dinstructions accept
matriel possde une horloge HighRes.

Sysmic - J. Pouiller Formation au Noyau Linux 43 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 44 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 45 / 182
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Option de gestion de la mmoire Configuration du boot et du FPE Configuration rseau

Boot options :
EABI, OABI, etc... : Diffrentes format dappel des fonctions. Flattened Device Tree : Utilise OpenFirmware, le nouveau format Networking :
Spcifique ARM (mais trs important) de description matriel appel aussi Flatten Device Tree Possibilit dactiver les innombrables protocoles rseaux de
Memory Model : Permet de grer les futurs systmes mmoire Default kernel command string : Permet de passer des niveaux 1, 2 et 3
asymtriques entre les CPU paramtres par dfaut au noyau (nous verrons cela un peu plus Network options : Beaucoup de fonctionnalit rseau : client
COMPACTION : Permet de compresser les page de mmoire loin) dhcp, bootp, rarp, ipv6, ipsec, les protocole de routage, gestion
plutt que les mettre en swap. Particulirement utile dans les boot loader address : Permettent de dmarrer le noyau partir de QoS, support des VLAN, du multicast,
systmes sans swap ! dune ROM, dune MMC, etc... Unix domain sockets : Les sockets UNIX (cf. sortie de netstat)
KSM : Permet de fusionner les page mmoire identiques. Kernel Execute-In-Place from ROM : Permet dexcuter un TCP/IP networking : Les sockets bien connue TCP/IP
Uniquement utile avec des machines virtuelles ou des chroot. noyau non compress partir dune ROM
Sinon, les noyau sait que le fichier est dj en mmoire et ne Netfilter : Le firewall de Linux. Dinnombrable options. Permet
duplique pas la page Floating point emulation : Si une instruction sur des nombres lutilisation diptables si loption IPTABLES est active.
virgule flottante est rencontre et ne peut pas tre excute, le noyau
peut alors muler linstruction (voir aussi -msoft-float)

Sysmic - J. Pouiller Formation au Noyau Linux 46 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 47 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 48 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Configuration des systmes de fichiers Configuration des systmes de fichiers Configuration des Drivers

File systems :
Second extended, Ext3 journalling file, The Extended 4 Miscellaneous filesystems Contient des systmes de fichiers Device Drivers Des centaines de drivers. Notons :
filesystem : Le file system standard de Linux spcifiques
FUSE : Permet de dvelopper des systmes de fichiers en eCrypt filesystem layer : Gestion transparent dun file system cod path to uevent helper : Le programme apell lorsquun nouveau
espace utilisateur Journalling Flash File System v2 : Spcialis pour les Flash avec priphrique est dtect (cf. /proc/sys/kernel/hotplug et
gestion de lcriture uniforme, des bad blocks et des erase blocks. /sys/kernel/uevent_helper)
Pseudo filesystems Systmes de fichiers sans supports Compressed ROM file system : Spcialis pour ROM sans accs
physiques Maintain a devtmpfs filesystem to mount at /dev : Un tmpfs
en criture.
TMPFS : File system volatile en RAM. Trs utilis avec des Squashed file system : Idem cramfs mais fortement compress
spcifique pour les devices automatiquement mont sur /dev.
systme en flash vu que laccs la Flash est coteux en temps et Les fichiers devices sont alors automatiquement crs sans
Network File Systems
destructeur pour la flash laide dun programme extrieur.
SYSFS et PROC_FS : Permettent au noyau dexporter un certain NFS client support : File system sur ethernet. Trs utilis dans
lembarqu durant les phases de dveloppement Memory Technology Device : Les flashs
nombre de donne interne vers le userland. Beaucoup doutils
systme tirent lors informations de ces systmes de fichiers. Ils Root file system on NFS : Permet de dmarrer le noyau sur une Staging drivers : Des drivers en cours de bta
doivent tre monts dans /sys et /proc. /proc est plutt partition NFS
orient processus alors que /sys est orient modules et
paramtrage du noyau.

Sysmic - J. Pouiller Formation au Noyau Linux 49 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 50 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 51 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Configuration du noyau Boot par tftp/nfs Notre cas


Dans notre cas, nous utilisons U-Boot (standard)

Pour le dveloppement du noyau, il est commun dutiliser les Compilation


Mais aussi : technologies : host% apt-get install uboot-mkimage
Kernel Hacking : Options concernant le dbugging du noyau. tftp : Il sagit dun protocole de transfert de fichier trs simple.
host$ make O=build ARCH=arm usb-a9260_defconfig
Security Options : Plusieurs framework permettant de grer des host$ make O=build ARCH=arm CROSS_COMPILE=arm-
Beaucoup de bootloaders limplmentent. Il permet un
droits plus fin sur les programmes excuts et/ou de garantir linux- -j3 uImage
dmarrage rapide dun nouveau noyau lors du dveloppement.
lintgrit des donne laide de TPM. On pourra aussi trouver des protocole sur RS232 ou sur USB
permettant la mme fonctionnalit. Comme pour un dmarrage Partage de limage par TFTP
Cryptographic API : Fonctions de cryptographies slectionnes
automatiquement par dautres modules (particulirement les normal, on indique au bootloader quelle adresse le noyau doit host% cp build/arch/arm/boot/uImage /srv/tftp/
protocoles rseaux) tre charg et on jump cette adresse uImage-2.6.33.7
Library routines : Idem Cryptographic API mais avec nfsroot : On demande au noyau de monter une partition rseau. host% ln -s uImage-2.6.33.7 /srv/tftp/uImage
principalement des calculs de checksum. On dispose ainsi dun espace de stockage illimit et il est simple
et rapide de mettre jour le rootfs. Au redmarrage, le bootloader passe par un registre lidentifiant
de la carte. Cet identifiant (spcifique larchitecture ARM) est
erron. A ce stade, il est plus facile de corriger ce problme dans
le noyau dans le fichier arch/arm/tools/mach-types.
Sysmic - J. Pouiller Formation au Noyau Linux 52 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 53 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 54 / 182
Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Passage doptions au noyau Le rootfs La configuration rseau


Il est possible de passer des options au dmarrage du noyau
Cest normalement le bootloader qui se charge de passer la
ligne de commande au noyau
Il est possible dinitialiser le rseau avant de montage du rootfs
Le bootloader utilise un protocole prdfini (lorsquil donne la root= indique le disque monter sur /
main au noyau, un des registre contient un pointeur sur la ligne Indispensable pour le dmarrage par NFS
Srement loption la plus utilise Syntaxe : ip=<client-ip>:<server-ip>:<gw-ip>:<
de commande)
Il est possible de surcharger la ligne de commande lors de la Il est possible de spcifier le nom dune partition. Par exemple netmask>:<hostname>:<device>:<autoconf>
compilation avec loption CMDLINE root=/dev/sda1 (PC) ou root=/dev/mtd0 (partition flash) Exemple : ip=192.168.1.72:::::eth0:
Les diverses options acceptes sont dcrites dans root=/dev/nfs demande au noyau de dmarrer sur NFS Pour le dmarrage par nfs, il est aussi ncessaire de spcifier le
Documentation/kernel-parameters.txt Remarque : la partition / ntant pas encore monte, ces nom rpertoire partag par le serveur :
Il est possible daccder la ligne de commande aprs le de partition ne correspondent pas des fichiers existants dans nfsroot=192.168.1.10:/srv/nfs
dmarrage dans /proc/cmdline /dev. Le kernel utilise simplement la mme syntaxe. Il aussi possible de dmarrer en utilisant un DHCP (ou un autre
Il existe des paramtres globaux au kernel et des paramtres protocole dauto-ngociation) : ip=on
spcifiques un module. Lorsque le module est compil dans en
statique, il est possible de lui passer des paramtres avec la
syntaxe <MODULE_NAME>.<PARAM>=<VALUE>
Beaucoup doptions sont modifiable posteriori par /sys
Sysmic - J. Pouiller Formation au Noyau Linux 55 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 56 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 57 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

La configuration rseau Dmarrage du noyau La console

A la fin du dmarrage du noyau, celui donne la main


Il est alors possible de spcifier le nfsroot dans la
lexcutable dclar avec init=. Par dfaut, il sagit de
configuration du serveur DHCP :
/sbin/init
host target { init ne se termine jamais Srement la deuxime option la plus utilise
option root-path "192.168.1.10:/srv/nfs";
Les arguments non-utiliss par le noyau sont pass init console= permet de demander au noyau dafficher la sortie de
next-server 192.168.1.10; printk sur un priphrique spcifique.
hardware ethernet 00:26:24:3a:14:5c; On peut estimer que notre systme dmarre partir du moment
ou nous obtenons un shell (cest en tous cas la que la plupart Sur PC, souvent limit console=ttyS0,115200n8.
fixed-address 192.168.1.72;
} des intgrateur Linux embarqu sarrteront) Sur un systme embarqu, il existe beaucoup de driver de ports
Du moins complexe au plus complexe dmarrer : sries diffrents. console peut alors prendre des valeurs
exotiques. A voir au cas par cas pour chaque driver.
Lors du dmarrage NFS, attention aux modifications de la init=/hello-arm-static
configuration rseau postrieure au montage du rootfs init=/hello-arm
init=/bin/sh
Rfrence : init=/sbin/init
Documentation/filesystems/nfs/nfsroot.txt
Effectuons ces tests avec le Rootfs original et un Rootfs vierge.

Sysmic - J. Pouiller Formation au Noyau Linux 58 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 59 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 60 / 182

Les BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun
Les
BSP
BSP Obtenir le noyau Organisation des sources Compiler le noyau Options principales Les drivers Le boot tftp/nfs Options de dmarrage Fabrication dun BSP

Panic La mmoire Etape de fabriquation dun BSP


Commencez par compiler une toolchain si celle-ci nest pas
Il est parfois ncessaire de donner des instructions au kernel sur fournie.
lutilisation quil peut faire des espaces mmoires Si le bootloader est fourni, travaillez avec celui-ci. Il arrive
mem=nn Force la taille de la mmoire que le noyau peut utiliser. souvent que les bootloader initialisent certains paramtres du
Sur beaucoup de plateformes, le noyau nest pas capable de CPU sans lesquels le noyau ne peut dmarrer
Un kernel panic est une erreur dtecte mais irrcuprable dtecter la capacit de la mmoire. Si vous navez pas de bootloader, vous devrez commencez par
paramtrer une sonde JTAG
panic=X permet demande au noyau de redmarrer aprs X memmap=nn@ss et memmap=nn$ss Force le noyau nutiliser
Sinon, vous pouvez dvelopper le noyau et le bootloader en
secondes en cas de kernel panic que la mmoire entre ss et ss+nn
parallle. Sans bootloader, vous devrez utiliser une sonde JTAG
Par dfaut, le noyau ne redmarre pas en cas de kernel panic memmap=nn@ss et memmap=nn$ss Force le noyau ne pas pour dmarrer votre cible
utiliser la mmoire entre ss et ss+nn Configurer le noyau jusqu pouvoir dmarrer lespace utilisateur
Il est possible dutiliser plusieurs fois ces options Compiler un busybox pour lespace utilisateur
Utiles pour rapidement rservs des espace dadresse dE/S pas Faites fonctionner les diffrents priphriques
encore dfini dans la configuration ou se rserver des blocs de Intgrer votre toolchain, votre bootloader, les fichiers de
mmoire particuliers pour la communication avec dautres configuration de votre noyau et de votre busybox, vos outils et
priphriques drivers spcifique dans un outil tel que BuildRoot
Zipper lensemble
Compilez lensemble et zipper le rsultat
Sysmic - J. Pouiller Formation au Noyau Linux 61 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 62 / 182 Intgrez vos modification dans lupstream
Sysmic - J. Pouiller Formation au Noyau Linux 63 / 182
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

12 Macros de base
13 Licenses des modules Les modules noyau
my_module
14 Dveloppement des modules
15 Ecriture des Makefile
A lextrieur du noyau
Un template de module :
Troisime partie III A lintrieur du noyau
// Declare special functions
16 Charger des modules
module_init(m_init);
17 Utiliser des paramtres
module_exit(m_exit);
Le Coding Style
Les modules La documentation // These uppercase macro will be added to
Rgles de documentation informative section of module (.modinfo)
MODULE_AUTHOR("Jrme Pouiller");
O trouver la documentation
MODULE_DESCRIPTION("A pedagogic Hello World");
Trouver de laide MODULE_LICENSE("Proprietary");
18 LAPI MODULE_VERSION("1.1");
19 Gestion des erreurs
20 Communiquer avec le noyau
Les appels systmes
Sysmic - J. Pouiller Formation au Noyau Linux 64 / 182
Les fichiers devices
Sysmic - J. Pouiller Formation au Noyau Linux 65 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 66 / 182

Read et write
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Les ioctls
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Quelques macros de base Quelques macros de base Parlons des licenses


Description du modules
Ces macros permettent de placer des informations sur des symboles
particulier dans module ; MODULE_DESCRIPTION Le noyau est dvelopp sous licence GPLv2
La GPL indique que tout travail driv dun projet sous GPL doit
Dclare la fonction appeler lors du chargement du module Version du module
tre GPL.
(traditionnellement module_init) MODULE_VERSION Ainsi, un module propritaire ne doit pas compiler en statique
module_init Rendre un symbole visible par les autres modules. Il sera alors avec le noyau (le rsultat est alors considr comme un travail
pris en compte dans le calcul des dpendances de symboles. driv du noyau). Il doit rester sous la forme dun module.
Dclare la fonction appeler lors du dchargement du module Pour le lutilisation dynamique des symboles, le dbat nest pas
(traditionnellement module_exit) EXPORT_SYMBOL(symbol)
tranch. Le noyau laisse la possibilit lauteur dexporter ses
Idem EXPORT_SYMBOL mais ne permet sont utilisation que pour modules avec EXPORT_SYMBOL ou avec EXPORT_SYMBOL_GPL.
module_exit
les modules GPL Si vous dveloppez un module Propritaire, vous naurez pas
Dclare un auteur du fichier. Peut apparatre plusieurs fois. EXPORT_SYMBOL_GPL(symbol) accs toute lAPI du noyau (environ 90% seulement).
Il est nanmoins possible de contourner le problme en utilisant
MODULE_AUTHOR License. Indispensable un module intermdiaire comme proxy logiciel.
MODULE_LICENSE

Sysmic - J. Pouiller Formation au Noyau Linux 67 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 68 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 69 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Les licences Headers Les modules noyau


my_module

En remplissant correctement la macro MODULE_LICENCE, le


systme de compilation du noyau empchera les compilations #include <linux/kernel.h>
illgales. MODULE_LICENCE peut prendre plusieurs valeurs : GPL, #include <linux/module.h>
GPL v2, GPL and additionnal rights, Dual MIT/GPL, Dual BSD/GPL, #include <linux/init.h>
Dual MPL/GPL. Toutes les autres valeurs sont considres comme Il nest pas possible pour le noyau de compiler avec des bibliothques
propritaire. extrieur. En particulier avec la libc. Tous les headers habituels static int __init m_init(void)
/proc/sys/kernel/tainted (ou uname -a) indique si des sont donc inaccessible dans le noyau. {
modules propritaires sont charg. Les headers publiques sont dans include/. On retiendra en pr_info("my_module init\n");
particulier : linux/module.h, linux/init.h, linux/kernel.h return 0;
Quels consquences ? }
indispensables pour compiler un module.
Pas de support de la part de la communaut 10
static void __exit m_exit(void)
Pas de garantie de la qualit du modules
{
Mauvaise image auprs de la communaut et des clients pr_info("my_module exit\n");
Par exprience, les modules propritaires que lon croise dans }
lembarqu peuvent cacher tout et nimporte quoi.

Sysmic - J. Pouiller Formation au Noyau Linux 70 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 71 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 72 / 182
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Les modules noyau Les modules noyau Compilation avec Kbuild


my_module my_module
Fichier Makefile lintrieur de larborescence noyau :
Pour amliorer le processus, on ajoute ces lignes dans le Makefile :
obj-$(MY_COMPILE_OPTION) := my_module.o
KDIR ?= /lib/modules/$(shell uname -r)/build
$(MY_COMPILE_OPTION) sera remplac par :
Fichier Makefile lextrieur du noyau : default: modules
: Non compil
obj-m := my_module.o m : compil en module
modules:
y : compil en statique
Puis, on appelle : $(MAKE) -C $(KDIR) M=$(shell pwd) modules
Fichier Kconfig :
host$ KDIR=/lib/modules/$(uname -r)/build modules_install: config MY_CONFIG_OPTION
host$ make -C $KDIR ARCH=arm M=$(pwd) modules $(MAKE) -C $(KDIR) M=$(shell pwd) tristate "my_module: A small Hello World
modules_install sample"
Il aussi est possible dappeler les cibles help et modules_install help
et on appelle Pedagogic purpose only.
1 host$ make ARCH=arm KDIR=../linux-2.6/usb-a9260
To compile it as a module, choose M here.
If unsure, say N.
Rfrence : Documentation/kbuild/modules.txt
Sysmic - J. Pouiller Formation au Noyau Linux 73 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 74 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 75 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Utilisation de Kconfig Utilisation de Kconfig Grer les modules

Chaque entre config prend comme attribut :


Avoir des informations sur le module
Son type et sa description en une ligne :
tristate, le plus classique pouvant prendre les valeurs , m et y host$ modinfo my_module.ko
bool pouvant prendre seulement les valeurs n et y Il est aussi possible :
int prennant un nombre Dinclure dautres fichiers avec source Charger un module
string prennant une chane
De dclarer un sous menu avec menu target% insmod my_module.ko
default Sa valeur par dfaut
De demander un choix parmis un nombre fini doptions avec
depends on Loption napparait si lexpression suivante est Dcharger un module
choice
vraie. Il est possible de spcifier des conditions complexes avec
les oprateurs &&, ||, = et != Rfrence : Documentation/kbuild/makefiles.txt, target% rmmod my_module
select Active automatiquement les options en argument si Documentation/kbuild/kconfig-language.txt
loption est active Afficher le buffer de log du kernel (Diagnostic MESsaGes)
help Description dtaille de loption. Si votre description ne target$ dmesg
tient pas en moins de 20 lignes, pensez crire une
documentation dans Documentation et y faire rfrence

Sysmic - J. Pouiller Formation au Noyau Linux 76 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 77 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 78 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Grer les modules Paramtres Paramtres


Nous devons dclarer le paramtre laide de la macro
Charger/dcharger un module correctement install/index dans module_param(name, type, perm);
modules.dep
name : Nom de la variable utilise comme paramtre
target% modprobe my_module
Il est possible de passer des paramtres aux modules : type : Type du paramtre (bool, charp, byte, short,
target% modprobe -r my_module
ushort, int, uint, long, ulong) (remarquez que ca ne
target$ modinfo my_module.ko correspond pas tout fait aux types C. Particulirement pour
Mettre jour le fichier de dpendances target% insmod my_module.ko param=2 bool et charp)
target% depmod perm : Permissions du fichier
host$ depmod -b ~/rootfs Il est possible de passer le paramtre au boot avec /sys/module/<module>/parameters/<param>. (utiliser les
my_module.param=2 macros de linux/stat.h). Si 0, le fichier napparat pas.
Notons que les modules sont des binaires elf standards qui La paramtre doit videment tre allou :
peuvent tre analyss avec les outils standard :
static int param = 0;
host$ arm-linux-objdump -t my_module.ko
Il est fortement recommand de documenter le paramtre
MODULE_PARM_DESC(param, "Useless parameter");
Sysmic - J. Pouiller Formation au Noyau Linux 79 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 80 / 182
Rfrence : linux/moduleparam.h
Sysmic - J. Pouiller Formation au Noyau Linux 81 / 182
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

/sys Le Coding Style Le Coding Style


On ne doit pas avoir besoin dutiliser lascenseur (vertical ou
horizontal) pour lire une fonction (bref : 80 colonnes et pas trop
Quelques remarques sur la programmation lintrieur du noyau : de lignes par fonction)
Indentation la tabulation
Il nest pas possible daccder aux fonctions de la libc (ni des ... et une tabulation fait 8 espaces
Etudions /sys autres bibliothques) lintrieur du noyau
Si lindentation vous empche dcrire votre fonction, cest que
/sys/module/my_module/parameters : Les paramtres. Pas de C++ dans le noyau. Cest techniquement fesable mais celle-ci possde trop de niveaux dimbrication
Modifiables si dclars modifiables dconseill et sera refus par lupstream Mettre au propre les tabulations et vrifier la taille des lignes :
/sys/module/my_module/sections : Des infos sur la zone Il ny a pas de garde fou pour la mmoire du noyau. Un accs
de chargement mmoire invalide pourra potentiellement est rattrap par un host$ scripts/cleanfile my_module.c
Oops, mais ca nest pas garanti.
Incolade sur la mme ligne que les blocs
Attention la portabilit. Votre code ne doit pas tre dpendant ... sauf pour les fonctions
de lendianess ou de taille des integer.
Pour indenter correctement votre code
host$ apt-get indent
host$ scripts/Lindent my_module.c

Sysmic - J. Pouiller Formation au Noyau Linux 82 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 83 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 84 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

CodingStyle La documentation Trouver de la documentation


Le noyau nest pas un modle de documentation
En revanche, le systme de dveloppement facilite normment Dans Documentation (en utilisant grep)
la recherche dinformations
Le noyau utilise un script perl appel kernel-doc. Ce script La cible htmldocs permet de compiler les documentation au
Les noms des variables locales doivent tre courts format Docbook (Documentation/DocBook)
parcours le code la recherche de syntaxe du mme type que
Si vous avez besoin de nom plus explicites, cest que vous avez doxygen. (Rfrence : Documentation/kernel-docs.txt) ... en particulier Linux Device Drivers et Linux Device Drivers.
trop de variables locales Un commentaire ne doit pas ce substituer un code pas illisible. Toutefois, ces compilations sont loin dtre exhaustives
Pas de CamelCase Prfrez rcrire le code plutt quajouter un commentaire. La cible mandocs permet dextraire les diffrente API invoque
Il faut prserver la propret de lespace de nommage en Une fonction exporte doit tre prfixe par un commentaire la dans les DocBook sous forme de pages de man.
prfixant par statique tout ce qui ne doit pas tre export dcrivant. Ce commentaire ne doit surtout explique comment la http://kernel.org/doc regroupe les diverses
(fonctions, variables) fonction marche. Le commentaire indique le quoi, mais surtout le documentations en ligne
pourquoi cette fonction existe.
Rfrence : Documentation/CodingStyle Dans les commentaires du noyau (fichiers .c ou .h)
Ces commentaires sont place avant la dfinition des fonctions.
Les fonction du noyau sont souvent dfinie dans les headers. Du http://lxr.linux.no offre une interface permettant de
coup, les commentaires sont parfois dans le fichier .c et parfois rapidement chercher des symboles et naviguer dans le code du
dans le fichier .h noyau.
Les commentaires expliquant le fonctionnement gnral dun
framework doivent tre crit sous la forme dune documentation
Sysmic - J. Pouiller Formation au Noyau Linux 85 / 182 darchitecture et place
Sysmic - J.dans
Pouiller Documentation/
Formation au Noyau Linux 86 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 87 / 182

Rfrence : Documentation/CodingStyle
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Les livres de rfrence Trouver de laide LAPI non-stable


Les rfrences :

Demander de laide la communaut LAPI non-stable ne facilite pas la maintenance des


documentations
Le fichier MAINTAINERS contient la liste des mainteneur de De mme, la maintenance des modules hors du noyau demande
chaque sous-systme beaucoup defforts
Les entres commencant par L: indique des mailing lists Cest encore pire de maintenir un module pour plusieurs versions
Notons <linux-newbie@vger.kernel.org> (driver nvidia par exemple)
MAINTAINERS liste aussi les sites officiel, les fichiers de En revanche, lAPI non stable permet des dveloppement plus
documentation, etc... pour les diffrents sous-projets du noyau agiles. En fait, le noyau serait intenable si il essayait de maintenir
LWN : http://lvn.net une API stable.
git blame permet de savoir qui a modifier la fonctions ou les
Embedded Linux Wiki : http://elinux.org
lignes qui nous intresse. Cela permet de sorienter vers le bon Lors quun dveloppeur modifie une API, il doit patcher
Les rfrences de nos amis de la communaut francaise : groupe lensemble des driver utilisant lancienne API.
Gilles Blanc : Linux embarqu - Comprendre, dvelopper, russir Rfrence : http://kernel.org/doc On prfre souvent laisser lancienne et la nouvelle API cohabiter
Jrme Pouiller : http://sysmic.org en demandant au maintainers de migrer vers la nouvelle
Thomas Petazzoni et Michael Opdenacker :
http://free-electrons.com/docs/
Sysmic - J. Pouiller Formation au Noyau Linux 88 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 89 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 90 / 182
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

LAPI non-stable Gestion des erreurs Gestion des erreurs

Il ny a pas de raisons de maintenir un driver lextrieur du


noyau, sauf les problmes de licences
La plupart des fonctions retournant des int retournent une Vous devez systmatiquement grer les erreur retourner par les
Il peut tre coteux en temps dintgrer un module dans le valeur ngative en cas derreur sous-fonctions mme si il vous semble impossible quelle se
mainstream. Les mainteneurs vous demanderons srement de
Les valeurs retourne correspondent aux inverses des erreurs produise.
corriger beaucoup de chose.
Posix dfinis dans errno.h (ie : -EAGAIN). Certaines pannes matrielles peuvent amener des
Il faut compter 2 4 fois le temps de dveloppement initial pour
Rfrence : errno(3), asm/errno-base.h et asm/errno.h comportements qui paraissent impossibles. Facilit le travaille
intgrer un module dans le mainstream
Les fonctions renvoyant des pointeurs peuvent retourner NULL des debugueurs en dtectant ce type derreur le plus tt possible
Une fois que votre module est intgr dans le mainstream et a
ou des valeurs spciale en cas derreur Lorsque vous grez une erreur, vous devez dfaire tout ce qui
pass la phase de staging, il sera thoriquement maintenu et
Utiliser les macro PTR_ERR, ERR_PTR et IS_ERR dj t fait
support pour toujours.
Rappel : le segfault nexiste pas dans le noyau. Une manire connue de grer les erreur dinitialisation dans le
Paradoxalement, lAPI non-stable permet que la dure de
noyau est dutiliser goto
maintenance dun driver dans le noyau sera longue (en thorie Rfrence linux/err.h
infinie)
Rfrence Documentation/stable_api_nonsense.txt

Sysmic - J. Pouiller Formation au Noyau Linux 91 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 92 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 93 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Grer les erreurs Communiquer avec le noyau Communiquer avec le noyau


char_dev char_dev

ptr = kmalloc(sizeof(device_t)); Le seul moya de communiquer depuis le userspace vers le


if (!ptr) { noyau passe par les appel systmes. Il existe dans la norme Unix des fichier spciaux, appels fichiers
ret = -ENOMEM Il sagit de placer les paramtres sur la piler et de dclencher devices, dont les appels systmes ne sont pas mapps sur des
goto err_alloc; une interruption logicielle particulire (sur x86, il sagit de fichiers rels mais sur des fonctions du noyau.
} linterruption 0x80, ou sysenter/sysexit). Ainsi, le noyau Un fichier device est associ deux nombre, le major et le minor.
dev = init(&ptr); reprend la main et effectue une action en fonction des On spcifie ces deux nombres lors de lors de la cration du
if (dev) { paramtres stocks que la pile. fichier avec la commande mknod :
ret = -EIO Le premier paramtre correspond au numro de lappel systme
goto err_init; (cf. syscalls(2), asm/unistd.h). target% mknod my_device c 253 0
10 } Il y a environ 300 appels systmes dans le noyau. Il est rare target% ls -l my_device
return 0; dajouter de nouveau appels systme et exceptionnel den
modifier ou den supprimer. Il est possible de communiquer avec les fichiers device en
err_init: Le modle Unix consiste limiter le nombre des appels utilisant les outils standard
free(ptr); systmes et de tout grer par lintermdiaire de fichiers. target% cat my_device
err_alloc: Parmi les appels systmes associs aux fichiers, nous trouvons target% echo foo > my_device
return ret; open, read, write, mmap, ioctl (pour modifier la
configuration du priphrique), etc...
Sysmic - J. Pouiller Formation au Noyau Linux 94 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 95 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 96 / 182

Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Communiquer avec le noyau Communiquer avec le noyau Mmoire userspace


char_dev char_dev

Cot noyau, un driver peut allouer une(des) entre(s) dans la


table des devices et associer des fonctions au appels systme Il existe historiquement deux types de fichiers devices :
associ cette entre (cf. register_chrdev, block : Pour les priphriques de tailles fixes accs alatoire.
struct file_operations dans linux/fs.h) Principalement des priphriques de stockage. Les fonction de la struct file_operations recoivent en
character : Pour les priphriques avec des donnes sous forme
En standard, tous les fichiers devices sont regroups dans /dev. paramtre des adresses provenant de lespace dadressage du
de flux comme des ports sries.
Autrefois, les numro de devices taient normaliss (cf processus appelant. En raison de la sparation des espaces
Cette diffrence est aujourdhui de moins en moins vidente mmoire (nous y reviendrons lorsque nous parlerons plus en dtail
Documentation/devices.txt) et les fichiers de /dev tait
crs statiquement Les cartes rseaux sont une exception notable de se modle. Il du fonctionnement de la MMU), ces adresses ne peuvent pas tre
nexiste pas de fichiers devices pour les cartes rseau. Il est utilise directement dans le noyau. Il est est ncessaire dutiliser les
Avec laugmentation du nombre de priphriques existants et ncessaire dutiliser des appels systmes spcifiques. fonctions copy_from_user et copy_to_user pour y accder.
larrive des bus hotplugs tels que lUSB, ce modle ntait plus
tenable. Il existe donc des systme dallocation dynamique de Notons aussi que de nos jours, de nombreuses fonctionnalits
numro de devices (cf. /proc/device et sont accessibles par les file systems virtuels (procfs, sysfs,
/sys/dev/{char,block}) et des systmes crant debugfs, etc...). Ils permettent les mme fonctionnalit que les
automatiquement les fichiers ncessaires (hotplug, udev, mdev, fichier devices, mais sans leur complexit.
devtmpfs, etc...)

Sysmic - J. Pouiller Formation au Noyau Linux 97 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 98 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 99 / 182
Macros de base Licenses des modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs
Macros de
Communiquer
base Licenses
avec des
le noyau
modules Dveloppement des modules Ecriture des Makefile Charger des modules Utiliser des paramtres LAPI Gestion des erreurs Communiq

Communiquer avec le noyau Communiquer avec le noyau Les ioctl


char_dev char_dev
Les appels systmes read et write permettent de communiquer
correctement avec les priphriques. Nanmoins, les priphriques
Nous allons faire un driver permettant de faire un pipe avec un buffer : possdent trs souvent des options de paramtrages. On utilise alors
lappel systme ioctl.
target% insmod my_chardev.ko
Vrifions le comportement : Celui-ci prend en paramtre un numro didentifiant et un
target% echo toto > my_dhardev
nombre variable darguments :
target% cat my_chardev target% insmod my_chrdev.ko
toto target% mknod my_chrdev c 251 0 ret = ioctl(fd, FIFO_GET_LEN, &arg);
target$ for i in {1..64}; echo "$i " > my_chrdev
Nous utiliserons : Il est existe une normalisation pour le format du numro dioctl
target$ cat my_chrdev
(FIFO_GET_LEN). Les macro _IO, _IOR, _IOW et _IOWR
target% rmmod my_chrdev
copy_to_user, copy_from_user permettent de gnrer des numro dioctl corrects :
kcalloc, kfree #define FIFO_GET_LEN _IOR(f, 0x01, int)
register_chrdev, unregister_chrdev_region
memmove On Rfrence :
Documentation/ioctl/ioctl-decoding.txt
Les ioctl existants sont lists dans
Documentation/ioctl/ioctl-number.txt
Sysmic - J. Pouiller Formation au Noyau Linux 100 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 101 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 102 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

21 Les frameworks
22 Les fonctions inspirs de la libc Les frameworks
23 Accder au E/S
24 Allouer de la memoire
Le noyau est divis en frameworks.
25 La MMU
Pour bien utiliser un framework, il est ncessaire de comprendre
Quatrime partie IV 26 Les interruptions
Allouer des interruptions
le fonctionnement du noyau et de la technologie dcrite par le
framework.
Les Softirq Un framework est gnralement dcrit dans son fichier .h
27 Les Wait Queues (exemple : linux/usb.h).
LAPI 28 Les DMA Un framework contient gnralement une paire de fonctions
29 Les structures de donnes register/unregister permettant au driver de se dclarer
Les listes auprs du framework (Exemple : usb_register_driver)
30 Mecanismes de synchronisation La fonction register prend souvent en paramtre une
Les fifos structure contenant des pointeurs sur des callbacks appeles
lors des divers vnements pouvant se produire (exemple : la
Les mutex
structure usb_driver)
Dsactivation des interruptions
Parmi les callbacks, il y a souvent une fonction probe
Spin Lock
Les RCU
Sysmic - J. Pouiller Formation au Noyau Linux 103 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 104 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 105 / 182
Les barrires mmoires

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Les frameworks Fonctions standards de string.h Fonctions standards de string.h

Les extensions de gcc sont utilises pour initialiser ces Convertions de nombres et de boolens : strtobool,
structures avec les attributs nomms Taille de chainesstrlen, strnlen kstrto{int,uint,l,ul}
Un framework fourni aussi dautres fonctions permettant de kstrto{s64,u64,s32,u32,s16,u16,s8,u8}
Comparaisons : strcmp, strncmp, strcasecmp,
lancer des actions (exemple : usb_submit_urb) kstrto{s64,u64,s32,u32,s16,u16,s8,u8}_from_user
strncasecmp, strnicmp, memcmp, strstarts
(existe aussi prfix avec simple_, mais destin mourrir)
Un framework peut raffiner un framwork plus gnrique (en le Recherches : strchr, strnchr, memchr, memscan, strrchr,
proxifiant) (exemple : les framework usb_serial et le framework Duplication avec allocation : kmemdup, kstrdup, kstrndup,
memchr_inv, strspn, strcpsn, strstr, strnstr, strpbrk
usb) memdup_user, strndup_user (nous verrons largument gfp
Copies : strcpy, strncpy, memcpy, strcat, strncat, un peu plus loin)
Une driver peu appartenir plusieurs frameworks. Par exemple, strsep
un driver de carte rseau peut utiliser le framework pci, le Formatage : sprintf, snprintf, sscanf
strlcpy et strlcat (De meilleures implmentations de
framework, network_device, sysfs, debugfs, etc... Utilitaire sur les nombres : max, max3, min, min3, clamp, swap
strncat et strncpy). Toujours utiliser ces fonctions.
Il existe un framework pour les modules (linux/modules.h) Notez que beaucoup de ces fonctions possdent des
skip_spaces, strim, strstrip : Supprime les blanc en
accessible avec THIS_MODULE implmentations gnriques mais peuvent tre surcharges par
dbut et fin de chane
Un exemple de framework simple enrobant les char devices : architecture
include/linux/cdev.h Rfrence : linux/string.h linux/kernel.h

Sysmic - J. Pouiller Formation au Noyau Linux 106 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 107 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 108 / 182
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Au sujet des accs aux E/S Fonctionnement en PIO Fonctionnement en MMIO


La mthode daccs aux E/S dpend de larchitecture : On doit dabord informer le noyau que lon utilise une plage de
Il existe des fonctions identique pour les MMIO.
ports avec
Memory Mapped Input Output (MMIO) : Registres mapps en
struct ressource *request_region(unsigned long struct ressource *request_mem_region(unsigned
mmoire. Il suffit de lire et crire une adresse particulire pour
start, unsigned long len, char *name); long start, unsigned long len, char *name)
crire dans les registres du priphrique. La mthode la plus
void release_region(unsigned long start, void release_mem_region(unsigned long start,
rpandue
unsigned long len); unsigned long len)
Port Input Output (PIO) : Registres accessible par un bus ddi.
Instructions assembleurs spcifiques (in, out). Cas notable de Rfrence : linux/ioport.h Il est possible de voir le mapping actuel dans le fichier
larchitecture x86. Permet dviter que deux drivers essayent de rfrencer la /proc/iomem
mme plage de ports. Il est ensuite ncessaire de faire appel au MMU pour mapper les
On dclare rarement les adresses des priphriques en absolu. On
Il est possible davoir des information sur les ports actuellement IO dans lespace dadressage du noyau
prfrera dfinir les offsets partir dune base :
utiliss en lisant le fichiers /proc/ioports
outb(base_device + REGISTER, 1); Une fois rserv, il est possible de lire/crire sur les ports avec : void *ioremap(unsigned long phys_add, unsigned
long size)
u\{8,16,32\} in\{b,w,l\}(int port);
ou void iounmap(unsigned long phys_addr)
void out\{b,w,l\}(u\{8,16,32\} value, int port)
writeb(base_device->register, 1); ;
Ces fonctions soccupent de la cohrence avec le cache.
Ces fonctions soccupent de convertir les donnes dans le bon
Sysmic - J. Pouiller Formation au Noyau Linux 109 / 182 endian Sysmic - J. Pouiller Formation au Noyau Linux 110 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 111 / 182

Rfrence : asm/io.h
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Fonctionnement en MMIO Accder aux IO en userspace Quelques notions


Sur les architectures simples, il possible de directement
drfrencer le rsultat de ioremap. Il existe nanmoins des
fonctions apportant une couche dabstraction (barrires Adresses physiques : Adresses physiques de la mmoire
/dev/mem est un fichier fichier device permettant daccder aux
mmoire, etc...). Adresses virtuelles : Adresses converties par le MMU
adresses physiques.
Adresses logiques : Adresses dans lespace du noyau mappe
u{8,16,32,64} read{b,w,l,q}(void *addr) Il est possible dutiliser mmap sur ce fichier et dcrire aux linairement sur les adresses physiques
void write{b,w,l,q}(u{8,16,32,64}, void *addr) adresses occupes par des priphriques Elles peuvent tre converties en adresses physiques en appliquant
Sur les architectures utilisant PIO, il est possible de demander au un simple masque de bits
Vous devez utilisez ces fonctions :
noyau de laisser un processus utilisateur utiliser les instruction Les adresses logiques sont des adresses virtuelles
les adresses ne sont pas volatiles assembleurs out* et in* pour quils puissent accder aux Sur les architectures 32bits, les adresses logiques sont places
write et read soccupent de placer des barrires et ou davoir entre 0xC0000000 (3Go) et 0xFFFFFFFF
priphrique avec ioperm et iopl.
des accs volatiles Il est toutefois possible de modifier ce parametrage
il peut y avoir des problmes de SMP ou de premption grs par Cest ainsi que fonctionne les serveurs graphiques XFree86 ou Il est possible de convertir une adresse logique en adresse
write et read xorg physique avec la macro __pa
certaines architectures ne supportent pas laccs direct la ... et faire linverse avec la macro __va
mmoire
il est plus facile pour sparse de dtecter des erreur
Cas notable des accs PCI (little endian obligatoire)

Sysmic - J. Pouiller Formation au Noyau Linux 112 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 113 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 114 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Quelques notions Les pages Les pages


Il est possible dallouer et de dsallouer des pages avec :
struct page *alloc_pages(unsigned int flags,
Les pages sont lunit de gestion du MMU.
unsigned int order);
Mmoire basse (Low Memory) : Partie de ladressage virtuel PAGE_SIZE indique la taille des page sur larchitecture courante struct page *alloc_page(unsigned int flags);
contenant les adresses logiques. (voir /proc/kallsyms en Une page fait 4 8Ko. void __free_page(struct page *page);
root) void __free_pages(struct page *page, unsigned
Page Frame Number (PFN) Le numro de la page. Ce sont en int order);
Mmoire haute (High Memory) : Le reste de ladressage virtuel fait les bits de poids fort des adresses.
Out Of Memory (OOM) killer : Mcanisme dclench lorsque le Il est facile de convertir les pages en pfn et inversement avec Les flags sont dcrit un peu plus loin
systme ne peut plus fournir de mmoire. Dans ce cas, un page_to_pfn et pfn_to_page (correspond page - CST et order indique le nombre de pages allouer. Le noyau alloue
processus est dsigne pour tre kill. Il sagit dun algorithme pfn + CST) 2order pages
heuristique int get_order(unsigned long size) retourne order
Il est possible dobtenir ladresse virtuelle dune page avec la
ncessaire pour avoir size octets de mmoire
macro page_address (si elle est mappe dans lespace
Il existe des raccourcis pour allouer une nouvelle page et obtenir
dadressage du noyau)
son adresse :
unsigned long get_zeroed_page(int flags);
unsigned long __get_free_page(int flags);
unsigned long __get_free_pages(int flags,
Sysmic - J. Pouiller Formation au Noyau Linux 115 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 116 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 117 / 182
unsigned long order);
void free_page(unsigned long addr);
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Le Slab Cration de pool dans le Slab Options dallocation


Le Slab est lallocateur de mmoire du noyau. Cest lquivalent Si vous avez de grande quantit dobjets identiques grer, ou si
de lallocateur de la libc. Elles permettent de spcifier des contraintes sur lallocateur. Les plus
vous avez des besoins spcifiques, vous pouvez crer un pool
Il existe des alternatives telles que le Slub ou le Slob courantes sont :
spcialement pour vos besoins.
Il gre des pool despace mmoire. GFP_KERNEL : Standard
Il est possible dobtenir des informations sur ltat du Slab en Le cas chant, il est mme possible dutiliser vos propres fonctions
GFP_USER : De la mmoire destine tre donne un
lisant le fichier /proc/slabinfo dallocation :
processus utilisateur. Elle est alors bien spare des pages
Il est possible dallouer et de dsallouer des espaces de
mempool_t *mempool_create(int min_nr, alloues pour le noyau.
mmoire avec le Slab en utilisant :
mempool_alloc_t *alloc_fn, mempool_free_t * GFP_HIGHUSER : Indique en plus que lallocation doit tre faite
void *kmalloc(size_t size, gfp_t flags); free_fn, void *data); dans la mmoire haute
void kzalloc(size_t size, gfp_t flags); void mempool_destroy(mempool_t *pool);
void kzfree(const void *p); GFP_ATOMIC : Lallocateur ne peux pas bloquer durant
void *kcalloc(size_t n, size_t size, gfp_t lallocation. Permet dtre utilis dans des interruptions. Utilise le
Vous pouvez garder la politique dallocation par dfaut en utilisant : pool dallocation durgence. Ne pas en abuser.
flags);
void kfree(const void *objp); void *mempool_alloc(mempool_t *pool, int gfp_mask); GFP_DMA : Retourne un bloc contenu dans lespace physique
void mempool_free(void *element, mempool_t *pool); utilisable par les DMA
On retrouve aussi lquivalent de realloc :
Rfrence : linux/gfp.h
void *krealloc(const void *p, size_t new_size, Rfrence : linux/mempool.h, /proc/slabinfo
gfp_t flags);
Sysmic - J. Pouiller Formation au Noyau Linux 118 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 119 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 120 / 182

Sauf mention contraire, le Slab retourne des adresse logiques


Les frameworks
Dans tous les cas, le Slab retourne de la mmoire physiquement
Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis
contigu
Rfrence : linux/slab.h
vmalloc Conversions La mmoire des processus

Il est possible dallouer de la mmoire non-contigu avec Copier des donnes depuis/vers lespace dadressage du
vmalloc : processus courant :
void *vmalloc(unsigned long size); Il est possible de faire des conversions en utilisant : int copy_from_user(kern_buf, user_buf, size);
void *vzalloc(unsigned long size); phys_to_virt et virt_to_phys (qui appellent __pa et __va int copy_to_user(user_buf, kern_buf, size);
void vfree(void *addr); si possible)
Retourne le nombre doctets non copis
page_to_virt, virt_to_page, phys_to_page et
Alloue dans la mmoire haute Lire/affecter une variable simple (jusqu 8 octets) de lespace
page_to_phys (qui appellent page_address)
... ainsi la mmoire alloue peut tre non contigu dans la dadressage du processus courant :
pfn_to_page et page_to_pfn
mmoire physique
get_user(var, user_ptr);
Il est ainsi possible dallouer dimportante quantit de mmoire. put_user(var, user_ptr);
Rfrence : linux/vmalloc.h, mm/vmalloc.c,
/proc/vmallocinfo La taille de var est automatiquement calcule

Sysmic - J. Pouiller Formation au Noyau Linux 121 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 122 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 123 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

La mmoire des processus Mapper des adresse physiques Sparse


La variable current pointe sur le processus courant Parmi les fonctions les plus utiles, remap_pfn_range permet de
mapper des adresses physiques dans un espace utilisateur. Elle est
Chaque processus possde une table de mapping mmoire particulirement utile pour implmenter lappel mmap : Sparse est un outils spcifique au noyau
Le mapping du processus courant se trouve dans current->mm Sparse parse le code et interprte certains attributs non dfinis
int remap_pfn_range(
lors de la compilation avec gcc
current->mm->rb_tree contient des virtual memory area struct vm_area_struct *vma,
unsigned long addr, bitwise indique que deux types ne peuvent pas tre casts
(vma) sous la forme dun arbre rouge-noir
Il est possible dutiliser la fonction find_vma(mm, addr) pour unsigned long pfn, (exemple : phys_addr_t et long unsigned)
retrouver une VMA unsigned long size, address_space(NUM) prcise le domaine dun pointeur et
allouer de la mmoire consiste allouer une structure pgprot_t flags); empche les pointeurs de diffrent domaines dtre affect entre
vm_area_struct et lajouter dans larbre rouge-noir eux :
Le noyau parle ensuite to pin une page en mmoire lorsque celle-ci vma Espace dadressage virtuel dans lequel le mapping doit address_space(0) Kernel
doit tre rellement alloue seffectuer. Dans le cadre de mmap, fournie par le kernel. address_space(1) User
Il est possible dobtenir les mapping dun processus en lisant les addr Ladresse lintrieur de vma (=offset) address_space(2) MMIO
fichier /proc/<PID>/map, /proc/<PID>/smap, pfn La page physique mapper Lancer vos compilation avec loption C=1 pour activer Sparse
/proc/<PID>/pagemap size Taille de lintervalle mapper Rfrence : linux/compiler.h, sparse(1)
Rfrence : Documentation/vm/pagemap.txt, flags Flags ventuels (reprendre vma->vm_page_prot)
Documentation/filesystems/proc.txt, linux/mm.h Il est aussi possible de surcharger lattribut
Sysmic - J. Pouiller Formation au Noyau Linux 124 / 182
vm_operations_struct Sysmic - J.*
vm_ops
Pouiller
de la vm_area_struct afin
Formation au Noyau Linux 125 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 126 / 182
de grer soit mme les diffrentes exceptions. Peut-tre utile pour le
dveloppement de certains drivers (good luck)
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Interruptions Interruptions Le PIC


Pour demander la gestion dune interruption :
int request_irq(
unsigned int irq, Une fois alloue, il est possible de demander au systme (au
irq_handler_t handler, Il est possible dobtenir la liste des interruptions enregistres
Programmable Interrupts Controller (PIC) en fait) dactiver ou non
unsigned long flags, dans /proc/interrupts
linterruption avec :
const char *devname,
On libre linterruption avec : void enable_irq(unsigned int irq)
void *dev_id)
void free_irq(unsigned int irq, void *dev_id) void disable_irq(unsigned int irq)
irq : Le numro de lIRQ
handler La fonction apeller. Note : Les PIC sont des priphriques comme les autres. Nous
irq : Numro dirq nexpliquons pas spcifiquement ici comment dvelopper un driver
flags Principalement :
IRQF_SHARED : Linterruption peut tre partag dev_id : Instance supprimer. dev_id doit donc tre unique pour un PIC.
devname : Un descriptif pour /proc/interrupts pour chaque IRQ
Rfrence : linux/interrupts.h
dev_id : Pointeur qui sera pass en paramtre de handler.
On utilise gnralement un pointeur sur une structure dcrivant
linstance du device. Ce pointeur aussi son importance lors de
la libration de linterruption.
Sysmic - J. Pouiller Formation au Noyau Linux 127 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 128 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 129 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Les handlers dinterruption Softirq Tasklets


Les softirqs sont excuts dans lenvironnement des
Les gestionnaires (handlers) dinterruption :
interruptions mais alors que les interruptions sont actives
Il est de type irqreturn_t (*)(int irq, void *dev_id) Elles nempchent pas le dclenchement des interruptions mais Excuts par les SoftIrq Hi et Tasklet
Il doit retourner (irqreturn_t) ne sont pas ordonnances avec les tches
Par consquent, quasiment les mmes rgles que les Hi est excut avec la priorit la plus haute parmi les SoftIrq,
IRQ_HANDLED si linterruption a bien t gre alors que les Tasklets ont quasiment la priorit la plus basse
IRQ_NONE dans le cas inverse. Linterruption est alors passe au interruptions sappliquent
handler enregistr suivant si linterruption est partage Les Softirq sont rservs aux tche demandant une frquence Pour initialiser et ds-enregistrer un tasklet :
de traitement importante. Les dveloppeurs du kernel gardent le
Il doit acquitter linterruption sur le priphrique DECLARE_TASKLET(name, void (*func)(unsigned
nombre de Softirq en quantit limite :
Il ne doit pas tre bloquant : long), unsigned long data);
pas de wait_event HI_SOFTIRQ, BLOCK_IOPOLL_SOFTIRQ, void tasklet_init(struct tasklet_struct *t,
pas de sleep TIMER_SOFTIRQ, TASKLET_SOFTIRQ, void (*func)(unsigned long), unsigned long
allocation de mmoire avec GFP_ATOMIC NET_TX_SOFTIRQ, SCHED_SOFTIRQ, data);
attention aux sous-fonctions, vrifier quelles sont bien interrupt NET_RX_SOFTIRQ, HRTIMER_SOFTIRQ, void tasklet_kill(struct tasklet_struct *t);
compliant BLOCK_SOFTIRQ, RCU_SOFTIRQ,
Le maximum de traitement doit tre report dans le Bottom Half Les SoftIrq Hi et Tasklet sont des multiplexeurs permettant
(bh) dexcuter dautres tches
Rfrence : linux/interrupts.h
Sysmic - J. Pouiller Formation au Noyau Linux 130 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 131 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 132 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Tasklets Les kthreads Les kthreads


Equivalent des threads en espace utilisateur
Crer une kthreads : Affecter une kthread un CPU
Pour demander lexcution dun Tasklet (dans le SoftIRQ Tasklet
struct task_struct *kthread_create(int (* void kthread_bind(struct task_struct *k,
et dans le SoftIRQ Hi)
threadfn)(void *data), void *data, const unsigned int cpu)
void tasklet_schedule(struct tasklet_struct *t) char namefmt[], ...)
void tasklet_hi_schedule(struct tasklet_struct Tuer une kthread :
*t) Marquer la tche comme devant tre tre ordonnance
(Fonctionne avec toute les tches, pas spcifique aux kthreads) int kthread_stop(struct task_struct *k)
Si la tasklet tait dj prvue pour tre excute, elle ne sera wake_up_process(struct task_struct *k)
excute quune fois. Ne pas trop abuser des kthreads. Les calculs seffectuent
normalement dans les SoftIRQ et surtout dans les appel
Si la tasklet est dj en cours dexcution, elle sera r-excute Il est possible de faire kthread_create et wake_up en un seul
systme des processus. Le cas chant, prfrez lutilisation des
(mais pas simultanment, mme sur un SMP). appel :
Workqueue gnriques. Enfin, posez-vous la question si laction
Rfrence : linux/interrupts.h struct task_struct *kthread_run(int (*threadfn) doit tre effectue dans le noyau ou dans lespace utilisateur
(void *data), void *data, const char namefmt Rfrence : linux/kthread.h
[], ...)

Sysmic - J. Pouiller Formation au Noyau Linux 133 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 134 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 135 / 182
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Workqueues Workqueues Les Wait Queues


Mcanisme gnral pour repousser un calcul
Permet dordonnancer des des tches dans une kthread
Permet dattendre de manire passive un vnement.
Exemple dutilisation des Workqueues : flush des caches des
disques, dfragmentation en arrire-plan, etc... Peut-tre utilis dans le contexte dune tche ou dans une
Il est possible dutiliser dautre workqueue (= dautres kthreads) kthread.
INIT_WORK(work, func) permet de dclarer une nouvelle que celle de schedule_work
structure work excutant func Cela permet de faire passer la tche associe de ltat run
int queue_work(struct workqueue_struct *wq, ltat wait
int schedule_work(struct work_struct *work)
struct work_struct *work) permet de demander
permet de demander lexcution de work Fonctionne de manire similaire des pthread_cond ou des
lexcution de work en spcifiant la workqueue.
int schedule_work_on(int cpu, struct rt_event sous Xenomai ou les OSFlags sous C/OS-II
work_struct *work) spcifie un CPU particulier sur lequel le Il est aussi possible de crer ses propres workqueues avec
Pour dclarer :
work doit sexcuter alloc_workqueue(name, flags, max_active)
DECLARE_WAIT_QUEUE_HEAD(my_queue) : initialisation
int schedule_delayed_work(struct delayed_work * Rfrence : linux/workqueue.h lors de la dclaration
work, unsigned long delay) dmarre work aprs un wait_queue_head_t my_queue;
certain dlais. Permet de faire des tches priodiques. init_waitqueue_head(&my_queue) : Dclaration et
bool cancel_delayed_work(struct delayed_work * initialisation spars
work) Annule une tche
dlaye
Sysmic - J. Pouiller Formation au Noyau Linux 136 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 137 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 138 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Les Wait Queues Les Wait Queues Coherent mapping


Pour attendre un vnement : Gre un mapping cohrent accessible depuis le priphrique et
Attend un vnement sur la queue ET que la condition soit le CPU
vrifie void *dma_alloc_coherent(
void wait_event(queue, condition); Pour rveiller les tches en attentes struct device *dev, /* Device sur lequel est
mapp le DMA. Fourni par le framework */
Idem mais retourne une erreur si excut dans un appel systme Rveil tous les processus en attente sur la queue
size_t size, /* Taille du mapping */
et le processus est tu avec SIGKILL dma_addr_t *handle, /* Adresse physique
wait_up(queue);
int wait_event_killable(queue, condition); fournir au device */
Idem mais, seulement les interruptibles gfp_t gfp) /* Flags habituels */
Idem mais retourne une erreur si excut dans un appel systme
et le processus recoit un signal wait_up_interruptible(queue); dma_alloc_coherent retourne une adresse virtuelle pour
int wait_event_interruptible(queue, condition); accder au mapping par le CPU.
La libration du buffer se fait par :
Idem wait_event mais avec un timeout
void dma_free_coherent(struct device *dev,
void wait_event_timeout(queue, condition); size_t size, void *cpuaddr, dma_handle_t
bus_addr);
wait_event_timeout + wait_event_interruptible :
void wait_event_tinterruptible_timeout(queue,
Sysmic - J. Pouiller Formation au Noyau Linux 139 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 140 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 141 / 182
condition);

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Streaming mapping Les listes Les listes


Dans ce mode, le driver doit allouer lui-mme la mmoire Implmentation assez singulire de listes gnriques en C. Exemple :
(utilisation de GFP_DMA). utilisation de la macro container_of qui permet de retourner
Il faut configurer le cache du CPU que la zone mmoire puisse un pointeur sur lobjet contenant en connaissant ladresse dun #include <linux/list.h>
tre utilis pour un DMA : attribut et et le type : stuct my_node_t {
struct list_head node;
dma_addr_t dma_map_single(struct device *dev, #define container_of(ptr, type, member) ({ \ /* other attributes */
void *buffer, size_t size, enum const typeof( ((type *)0)->member ) *__mptr = }
dma_data_direction direction); (ptr); \ void f() {
(type *)( (char *)__mptr - offsetof(type, LIST_HEAD(my_list);
direction peut tre DMA_TO_DEVICE, DMA_FROM_DEVICE, member) );})
DMA_BIDIRECTIONAL, DMA_NONE struct my_node_t new_node;
Le cache nest pas cohrent. Pour accder au buffer, il faut Pour dclarer une liste : struct my_node_t *i;
apeller : Dclarer un type pour les noeuds de sa liste 10 printf("%d\n", list_empty(my_list));
Ajouter un attribut de type struct list_head son type list_add(&new_node->node, &my_list);
void dma_unmap_single(struct device *dev, Une liste vide est alors compos dune simple printf("%d\n", list_size(my_list));
dma_addr_t bus_addr, size_t size, enum struct list_head dclarer avec LIST_HEAD(my_var) list_for_each_entry(i, &my_list, node) {
dma_data_direction direction) Pour les fonction dajout, suppression, etc... tout est gr avec }
Cet appel doit tre fait aprs que le priphrique ait termin ces les list_head }
accs au buffer Pour accder au donnes lies un list_head, il faut utiliser la
Le streaming mapping
Sysmic -permet
J. Pouiller des optimisations
Formation au Noyau Linux que cohrent 142 / 182 macro list_entry (qui
Sysmic est en Formation
- J. Pouiller fait laaumme
Noyau Linuxchose que 143 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 144 / 182

mapping ne permet pas container_of)


Rfrence : linux/list.h
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Les arbres Les fifo kfifo


Il existe deux implmentations principales darbre dans le noyau
Les rbtree (arbres rouges-noirs) Dclarer et initialiser une kfifo :
Fonctionnent aussi base de container_of mais ncessite Apell aussi Buffer Circulaire
une plus grande part de personnalisation que les listes. DEFINE_KFIFO(fifo, type, size)
Lune des structure les plus utilise dans le noyau
En particulier, ncessite limplmentation des fonction de
Permet la communication avec les interruptions (pas de pause fifo : Nom de la fifo
recherche et dajout.
lors des accs) et entre les processus type : Type des objets contenir
Cette architecture permet de dfinir sa propre fonction de
Pendant longtemps, chaque driver avait son implmentation de size ; Taille de la fifo
comparaison sans impacte sur les performance et en maintenant
fifo
une certaine gnricit Pour pousser, tirer et lire des lments :
Il existait un dbut dinterface commune dans
Rfrences : Documentation/rbtree.txt et int kfifo_put(fifo, val)
linux/circ_buf.h
linux/rbtree.h int kfifo_get(fifo, val)
Il existe maintenant une implmentation de rfrence : kfifo
Les radix priority search tree (arbres prfixes ou prio_tree) int kfifo_peek(fifo, val)
Uniquement utilis pour rfrencer les structures vma
Rfrences : Documentation/prio_tree.txt et
linux/prio_tree.h
Sysmic - J. Pouiller Formation au Noyau Linux 145 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 146 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 147 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

kfifo Mutex Mutex


Mthodes assez classiques des mutex :
Dclarer et initialiser un mutex :
Pleins dautres fonctions utiles :
DEFINE_MUTEX(name);
kfifo_recsize(fifo) void mutex_init(struct *mutex);
kfifo_reset(fifo) Prcautions classiques lutilisation des sections critiques :
kfifo_size(fifo)
Acqurir le mutex le plus tard possible, Relcher le plus tt Acqurir le mutex. Attention, si appel depuis un processus,
kfifo_len(fifo)
Etudier la granularit ncessaires aux sections critiques celui-ci ne peut plus tre tu
kfifo_is_full(fifo)
kfifo_is_empty(fifo) Attention aux bug classiques : latences, dead locks, mutex_lock(struct mutex *lock);
inversements de priorits
Il est possible de coupler une kfifo avec wait_queue Idem, mais le processus peut-tre tu
Il est possible de dclarer une kfifo avec un espace mmoire mutex_lock_killable(struct mutex *lock);
dport de la structure et ainsi utiliser des espace mmoire
spciaux. Idem, mais le processus peut tre interrompu avec un signal
mutex_lock_interruptible(struct mutex *lock);

Sysmic - J. Pouiller Formation au Noyau Linux 148 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 149 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 150 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Mutex Autre mcanismes Dsactivation des interruption et de la premption

Idem, mais retourne immdiatement si le mutex est dj lock Dans la mme branche, le noyau propose aussi :
mutex_trylock(struct mutex *lock); Des smaphores (rfrence : linux/semaphore.h) Lors de certains accs, les mcanismes de protections de
Des Read-Write Lock (rfrence : linux/rw_semaphore.h) ressources inter-tches ne sont plus suffisants.
Retourne 1 si le mutex est lock Cela peut concerner des accs concurrent avec des
Mutex avec protocole dhritage de priorits et dtection de dead
mutex_is_locked(struct mutex *lock); lock (aka rt_mutex) (rfrence : interruptions.
Documentation/rt-mutex-design.txt, Il est alors ncessaire de dsactiver temporairement les
Unlock le mutex linux/rtmutex.h) interruptions afin de garantir que lon ne sera pas interrompu.
Les rt_mutex peuvent tre utilis par la libpthread Ces fonctions sont utiliser avec parcimonie
mutex_unlock(struct mutex *lock);
rfrence : Documentation/pi-futex.txt
Documentation/rt-mutex.txt
Rfrence : linux/mutex.h

Sysmic - J. Pouiller Formation au Noyau Linux 151 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 152 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 153 / 182
Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Dsactivation des interruption et de la premption Dsactivation des interruption et de la premption Spin Lock

Dans certains cas, une tche peut avoir besoin dun accs exclusif
Sauve/restaure ltat des interruptions dans/de flags et dsactive une ressource potentiellement utilise dans une interruption. Dans ce
les interruptions : cas, il est ncessaire de dsactiver les interruptions lors de laccs
local_irq_save(unsigned long flags); Dsactive/Ractive les SoftIrq (bottom halves) : la ressource. Nanmoins, linterruption peut se produire sur un autre
local_irq_restore(unsigned long flags); local_bh_disable(); CPU. Il est alors ncessaire de se protger contre cette ventualit
local_bh_enable(); Il sagit dune attente active sur une section critique
Dsactive/Active les interruptions ( priori, toujours utiliser les
versions _save et _restore) Ne traite pas les problmes de concurrence mais de paralllisme
Dsactive/Ractive la premption uniquement. Par consquent, uniquement en environnement
local_irq_disable(); preempt_disable(); SMP
local_irq_enable(); preempt_enable(); Principalement utilis lors de en complment de la dsactivation
des interruption
Retourne vrai si les interruption du CPU local sont dsactives :
La premption est aussi dsactiv durant un spin lock
local_irq_disabled(); Le noyau propose aussi des read/write spin locks : rwlock_t
Rfrence linux/rwlock.h

Sysmic - J. Pouiller Formation au Noyau Linux 154 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 155 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 156 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Spin Lock Spin Lock Read-Copy-Update (RCU)

Lock et dsactive/ractive les interruptions sur le processeur Type dalgorithme non bloquant :
API :
courant. Les flags contiennent ltat du masque dinterruption :
La lecture nest pas bloquante
Dclarer et initialiser un spin lock :
spin_lock_irqsave(spinlock_t *lock, unsigned On note le nombre de lecteurs
DEFINE_SPINLOCK(lock); long flags);
Les modification seffectuent sur une copie de lobjet
spin_lock_init(spinlock_t *lock); spin_unlock_irqrestore(spinlock_t *lock,
unsigned long flags); Les lecture suivante se font sur la nouvelle version de lobjet
Idem que les fonctions mutex_* : Lorsque le dernier lecteur a termin, lobjet dorigine est dtruit.
Spinlock et dsactive/ractive les SoftIrq : Seul subsiste la nouvelle version.
spin_lock(spinlock_t *lock);
spin_lock_bh(spinlock_t *lock); Les RCU sont un design darchitecture. Les RCU ne possdent
spin_trylock(spinlock_t *lock);
spin_unlock_bh(spinlock_t *lock); que peu dAPI pouvant tre rutilis.
spin_unlock(spinlock_t *lock);
Rfrence Documentation/RCU/whatisRCU.txt
Documentation/RCU/*
Rfrence : linux/spinlock.h

Sysmic - J. Pouiller Formation au Noyau Linux 157 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 158 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 159 / 182

Les frameworks Les fonctions inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes
Les frameworks
Mecanismes
Les fonctions
de synchronisation
inspirs de la libc Accder au E/S Allouer de la memoire La MMU Les interruptions Les Wait Queues Les DMA Les structures de donnes Mecanis

Exemple : Manipulation de listes les barrires mmoire les barrires mmoire


Le compilateur et le CPU peuvent optimiser du code en
rordonnancant les instructions. Utilisation de barrires :
typedef struct {
mmiowb() Empche le rordonnancement des accs en criture
struct a_t a; Le compilateur et le CPU ne rordonnance que les instructions la mmoire mappe sur IO
int count_usage = 0;
bool obsolete = false; indpendantes (donc, a priori, sans danger) rmb() Barrire en lecture. Toutes les lecture demandes avant la
} rcu_t;
rcu_t *a = malloc(sizeof(rcu_t)); Ce comportement peut nanmoins introduire des erreurs sur les barrire sont termine avant rmb() et aucun lecture demandes
systme SMP ou lors daccs certains priphriques. aprs la barrire nest commence avant rmb()
Il est assez complexe de savoir ou doivent se placer les wmb() Barrire en criture
mb() Lecture et criture
barrires. Elle interviennent nanmoins dans un certains nombre
void read_a() { void write_a() { smp_wmb(), smp_rmb() et smp_mb() ont un comportement
// lock: struct rcu_t *a3 = a; de structures de donnes ou dalgorithme identique, mais ne sont prsentent que si le systme est compil
rcu_t *ptr = a; struct rcu_t *a2 = malloc(
ptr->count_usage++; sizeof(rcu_t)); Les barrire sont implmentes en utilisant des instructions en SMP
// do something with ptr;
// unlock:
memcpy(a2, a);
// modify a2;
assembleur particulires Il existe dautre types de barrires trs spcifiques
ptr->count_usage--; a = a2; barrier() est un barrire pour le compilateur. Toutes les Tous les mcanismes de protections de ressources partag
if (ptr->obsolete && !ptr-> a3->obsolete = true;
count_usage) if (!a3->count_usage) instruction avant la barrire seront places avant les instructions contiennent dj des barrires correctement places (ca tombe
free(ptr); free(ptr); aps la barrire bien, cest la que cest le plus complexe)
} }
Toutes les barrires CPU impliquent une barrire compiler. Du Rfrence : Documentation/memory-barriers.txt
coup barrier() est peu utilis.
Sysmic - J. Pouiller Formation au Noyau Linux 160 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 161 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 162 / 182
Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

printk
31 Afficher des informations
Dynamic printk printk affiche les information sur la console et les copie dans
un buffer. Il est possible dafficher ce buffer avec dmesg
Il est possible dutiliser directemenr printk en specifiant le
Cinquime partie V 32 kgdb
degr dimportance de linformation :

33 Tracker la mmoire printk(KERN_ALERT "Aie\n");

Debuguer 34 Outils base de Kprobe et apparents


Notez labsence de virgule entre KERN_ALERT et la chane
Nanmoins, il est maintenant conseill dutiliser les macros
kprobe pr_cont, pr_develpr_debug, pr_info, pr_notice,
Tracepoint pr_warning, pr_err, pr_crit, pr_alert, pr_emerg
Ftrace Existe aussi suffix de _once pour ntre affich que la premire
fois.
Oprofile
print_hex_dump_bytes et print_hex_dump affichent un
Perf dump en hexadcimal dun buffer. La seconde est la forme
gnrale qui permet de faire peu prs la mme chose que la
commande hexdump
Sysmic - J. Pouiller Formation au Noyau Linux 163 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 164 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 165 / 182

Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

printk debugfs Debuguer le noyau


printk est compatible avec la norme C99 et ajoute des Activation d kgdb permettant dembarquer gdbserver dans le
extensions pour pretty-printer certains pointeurs (%p). En noyau :
particulier : Un certain nom doutils de debug sont command par debugfs
%pF pour rsoudre le nom dune fonction du segment de text Il sagit dun type de partition virtuel Compilation
%pUB et %pUL pour afficher les UUID ou les GUID Activ avec host$ cp -a build build-dbg
%pM pour afficher des adresses MAC
%pI4 pour affichier des adresses IPv4 host$ make O=build-dbg ARCH=arm CROSS_COMPILE=
mount -t debugfs none /sys/kernel/debug
%pI6 et %pI6c pour afficher des adresses IPv6 arm-linux- menuconfig
Les formats dIP peuvent tre suivit de h, n, l ou b pour demander ... Compile the kernel with debug info ...
Il est possible dobtenir le statut de dprintk avec
des conversions dendian avant dafficher ... KGDB: kernel debugging with remote gdb ...
%m pour errno cat /sys/kernel/debug/dynamic_debug/control host$ make -j3 O=build-dbg ARCH=arm
Rfrence linux/printk.h, CROSS_COMPILE=arm-linux- uImage
Documentation/printk-formats.txt ... et dactiver de nouvelles traces avec
Il est aussi possible de provoquer des dump de la pile avec les Limage ELF est beaucoup plus grosse
macro BUG(), BUG_ON(condition) et BUG_ON_NULL(ptr) echo file hello.c +plf > /sys/kernel/debug/
Les pr_debug ne sont compil que si lune des option dynamic_debug/control host$ ls -l build-dbg/vmlinux build/vmlinux
CONFIG_DEBUG ou CONFIG_DYNAMIC_DEBUG est active host$ cp build-dbg/uImage /srv/tftp/uImage
Dans le cas de DYNAMIC_DEBUG, il est possible dactiver les -2.6.33.7-dbg
messages atomiquement en passant par debugfs
Rfrence : Documentation/dynamic-debug-howto.txt
Sysmic - J. Pouiller Formation au Noyau Linux 166 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 167 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 168 / 182

Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

Debuguer le noyau Commandes gdb utiles Commandes gdb utiles


Gestion de lexcution Obtenir des informations
Point darrt ladresse 0x9876 Voir la pile dappel
Passage des arguments kgdboc indiquant quel interface kgdb gdb> b *0x9876 gdb> bt
doit utilis et kgdbwait indiquant que kgdb doit attendre notre
connexion avant de continuer le boot b hello.c:30 Point darrt la ligne 30 du fichier hello.c Afficher les variable locales la fonction
uboot> set bootargs ${bootargs} kgdboc=ttyS0 gdb> b hello.c:30 gdb> i locales
kgdbwait
uboot> tftp Point darrt sur la fonction main Afficher les arguments de la fonction
<Ctrl-a q> gdb> b main gdb> i args
host$ arm-linux-gdb vmlinux
gdb> target remote /dev/ttyUSB1 Continuer un programme arrt Afficher la valeur de a
gdb> c gdb> p a
Rfrence : htmldocs/kgdb.html
Dmarrer le programme avec arg comme argument Afficher la valeur de abs(2 * (a - 4))
gdb> r arg gdb> p abs(2 * (a - 4))

Sysmic - J. Pouiller Formation au Noyau Linux 169 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 170 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 171 / 182
Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

Commandes utiles Commandes utiles Kgdb et les modules


Et plus... Les modules sont charg dynamiquement. Ils ne sont pas
Afficher la valeur de i chaque fois que lon passe sur le point contenu dans le fichier vmlinux
darrt 1 Il est ncessaire dindiquer gdb de charger le module que lon
Debuguer chaud souhaite dbuguer
gdb> command 1
> silent Nanmoins, gdb ne peut pas savoir quel addresse t
Attacher gdb un processus existant charg le module
> p i
gdb> attach 1234 > c Ces informations peuvent tre rcupres dans
> end /sys/modules/*/sections
Arrter le debug sans arrter le processus On peut alors les donner gdb avec add-symbol-file :
Arrter le programme lorsque la variable i est modifie ou lue
gdb> detach target% cat /sys/modules/my_modules/sections
gdb> watch i host$ gdb vmlinux
gdb> awatch i > target remote 192.168.1.55:2345
> add-symbol-file my_modules.ko 0xd0832000 \
Passer dune thread une autre -s .bss 0xd0837100 -s .data 0xd0836be0
gdb> thread 2
gdb> thread 1 Il existe des scripts effectuant la procdure automatiquement. A
adapter suivant vos besoins.
Sysmic - J. Pouiller Formation au Noyau Linux 172 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 173 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 174 / 182

Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

kmemleak kmemcheck Kprobe


Dun point de vue gnrique, Les Kprobes permettent de deffectuer
une action lors du passage de lexcution dune case mmoire
Active un algorithme proche dun garbage collector. Mais au lieu particulire (Rfrence : Documentation/kprobes.txt)
de librer la mmoire, enregistre simplement les blocs perdus.
Modifie la MMU de manire ce quune exception soit dclenche Dans la partie userspace, il existe une api davoir des informations
Le rsultat se trouve dans /sys/kernel/debug/kmemleak
chaque accs la mmoire. Lors quun accs en lecture est effectu, statistique sur le passage sur une ligne. Il suffit dindiquer une
La procdure classique : adresse (ou un symbole) prober :
kmemcheck vrifie si loctet dj t crit auparavent. Si ca nest
target% echo clear > /sys/kernel/debug/kmemleak pas le cas, une erreur du mme type quun Oops est gnre echo p do_fork > /sys/kernel/debug/tracing/
target% modprobe my_module kprobe_events
... (Pas disponible sur ARM)
target% modprobe -r my_module ... et de lactiver
target% echo scan > /sys/kernel/debug/kmemleak Rfrence : Documentation/kmemcheck.txt
echo 1 > /sys/kernel/debug/tracing/events/kprobes/
target% cat /sys/kernel/debug/kmemleak p_do_fork_0/enable
Rfrence : Documentation/kmemleak.txt On peut maintenant lire les rsultats dans :
cat /sys/kernel/debug/tracing/trace

Sysmic - J. Pouiller Formation au Noyau Linux 175 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 176 / 182
Rfrence : Documentation/trace/kprobetrace.txt
Sysmic - J. Pouiller Formation au Noyau Linux 177 / 182

Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

Tracepoint ftrace oprofile


Les tracepoints sont des endroit spcifi dans le code du noyau qui
peuvent sembler intressant mesurer :
Pas de possibilit de les dclarer nimporte ou dans le code
Permet dobtenir plus dinformations que les kprobes Permet dinstrumenter certaines latence particulire. Il utilise loption
Les dveloppeur du noyau ont estim que lendroit tait pour y -pg de gcc. Cela ajoute un appel _mcount avant chaque appel de
mettre un tracepoint et ont configur le format adquate (cf. fonction. Contrairement kprobe, ftrace ne peut se placer quau Les CPU modernes possdent des registres de debugs et
/sys/kernel/debug/tracing/events/*/format) dbut dune fonction. breakpoints hardware capable de profiler le code. Oprofile permet de
Loverhead pour un tracepoint dsactiv est un poil plus paramtrer et de visualiser le contenu de ces registres. Oprofile nest
important que pour les kprobe vu quil ny a pas de patch la Nanmoins, ftrace est trs utilis dans le temps rel, la mesure des disponible que sur certaines architectures.
vole du code (mais du coup lusage est permit en XIP) temps de latence et ltude du scheduling.

Pour en obtenir la liste des tracepoints : Reference : Documentation/trace/ftrace.txt


find /sys/kernel/debug/tracing/events/ -type d Documentation/trace/ftrace-design.txt

Il est videment possible de de dfinir ses propres tracepoints (cf.


Documentaiton/trace/tracepoints.txt)

Rfrence : Documentation/trace/events.txt
Sysmic - J. Pouiller Formation au Noyau Linux 178 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 179 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 180 / 182
Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents Afficher des informations kgdb Tracker la mmoire Outils base de Kprobe et apparents

perf SystemTap

Permet daccder quasiment toutes les technologies prcdentes.


Compiler en natif, ce qui permet dtre trs rapide... Ncessite une
perf vous offre une interface pour accder : formation lui-seul.
aux tracepoint
Le principe :
aux kprobe
aux registres de debug hardware et au breakpoints hardware On crit du pseudo-code C
Il est converti en un modules C
Ainsi, perf offre une interface plus complte que oprofile (et
disponibles sur plus darchitecture) Il est compil, puis charg sur le noyau de la cible
Le rsultats est rcupr par un service appel relayfs
(perf ne compile pas sur notre carte de test car notre toolchain est un
peu trop vieille pour le noyau 3.3 (et jai la flemme de la recompiler)) Rfrence : systemtap-doc

Pour une vue globale est diffrents outils dinstrumentation :


Documentation/trace/tracepoint-analysis.txt

Sysmic - J. Pouiller Formation au Noyau Linux 181 / 182 Sysmic - J. Pouiller Formation au Noyau Linux 182 / 182

Vous aimerez peut-être aussi