Vous êtes sur la page 1sur 191

Dveloppement noyau, drivers sous GNU Linux

Thierry GAYET (ALTEN) 10/2007 v1.0 OSP 006 Creative Common Thierry.Gayet@yahoo.fr

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

PLAN

Introduction. Construction d'un noyau. Architecture du noyau. Mthodologie de dveloppement Dveloppement dans le noyau Interruptions Direct Memory Access (DMA) Hooking de primitive. Hotplug et udev /proc et /sys Conseils et ressources.

interne Groupe France Tlcom

1 - INTRODUCTION

Histoire de GNU Linux Organisation du dveloppement du noyau Linux L'quipe des dveloppeurs au complet Portabilit du noyau Nouveauts du noyau 2.6 Etat des versions du noyau Versions et numrotation du noyau Caractristiques principales du noyau Problmatique de la licence GPL

interne Groupe France Tlcom

Histoire de Linux

1991: Le noyau Linux est crit partir de zro (from scratch) en 6 mois par Linus Torvalds
dans sa son PC 80386. chambre de l'universit d'Helsinki, afin de contourner les limitations de

1991: Linus distribue son noyau sur Internet. Des programmeurs du monde entier
le rejoignent et contribuent au code et aux tests.

1992: Linux est distribu sous la licence GNU GPL 1994: Sortie de Linux 1.0 1994: La socit Red Hat est fonde par Bob Young et Marc Ewing,

crant ainsi un nouveau modle conomique bas sur une technologie OSS.

1995-: GNU/Linux et les logiciels libres se rpandent dans les serveurs Internet. 2001: IBM investit 1 milliard de dollars dans Linux 2002-: L'adoption massive de GNU/Linux dmarre dans de nombreux secteurs de l'industrie.

interne Groupe France Tlcom

Linux : premier contact


Premier post effectu par Linux Torvald sur le forum Usenet (newsgroup) :
Path: gmdzi!unido!fauern!ira.uka.de!sol.ctr.columbia.edu!zaphod.mps.ohio-state.edu! wupost!uunet!mcsun!news.funet.fi!hydra!klaava!torvalds From: torva...@klaava.Helsinki.FI (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Keywords: 386, preferences Message-ID: <1991Aug25.205708.9541@klaava.Helsinki.FI> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki Lines: 20 Hello everybody out there using minix I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-) Linus (torva...@kruuna.helsinki.fi) PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.

interne Groupe France Tlcom

Organisation du dveloppement du noyau Linux


Linus TORVALD le dcideur et responsable du projet ; propritaire du nom "Linux".

Andrew MORTON adjoint au projet, le numro 2


David Miller

Alan COX responsable de la partie rseau. Russell KING responsable de l'architecture ARM. etc Andi KLEEN responsable de l'architecture x86-64.
interne Groupe France Tlcom

L'quipe des dveloppeur au complet

" Un travail de longue dure par une quipe de Geeks / Nerds / professionnels passionns. "

interne Groupe France Tlcom

Les dveloppeurs du noyau GNU Linux officiels

interne Groupe France Tlcom

Gestion et organisation du projet Linux

Organisation de la gestion du Projet GNU Linux partir de Linus Torvald.


http://opensource.mit.edu/papers/dafermoslinux.pdf http://catb.org/~esr/writings/cathedral-bazaar/

interne Groupe France Tlcom

Cycle de dveloppement

10

interne Groupe France Tlcom

Acteurs professionnels du noyau Linux

http://www.kernel.org/pub/linux/kernel/people/gregkh/kernel_history/developer_graph-2.6.18.pdf
11

interne Groupe France Tlcom

Croissance exponentielle du noyau GNU Linux

Linux est un projet en continuelle volution

12

interne Groupe France Tlcom

Le processus de dveloppement

Le code remonte de la base Linus Torvalds :


Les dveloppeurs de base proposent leurs modifications : Elles sont dbatues sur la LKML, Des aller-retours avec les responsables de sous systmes permettent de les rafiner, Linus Torvalds intervient parfois ds ce stade ;

QLes modifications solides et trs demandes sont intgres l'arbre d'Andr Morton pour plus de tests (aprs discussions) : Plus de visibilit, tests et commentaires, dont ceux de Torvalds, Le code est intgr s'il est prouv solide, lgant et utile (Linux Torvalds dfinit son rle comme le pouvoir de dire non ) ;

Un processus souvent plus chaotique que cette description idalise

13

interne Groupe France Tlcom

Le processus de dveloppement

Le dveloppement du noyau mainline :


Une fentre d'ajouts de fonctionnalits (merge window) : Dure d'environ 2 semaines, Clture officielle par la sortie d'une pr-version -rc1, Parfois, des oublis contaminent la pr-version suivante ; Une priode de stabilisation : Seulement des corrections, Un -rc par semaine environ jusqu' la stabilit apparente, Un objectif 2 mois (en pratique, jusqu' 3) ; Sortie de la version officielle : Cette version est rarement parfaite, Maintien d'une liste de rgressions (par Michal Piotrowski, sur http://kernelnewbies.org/known_regressions).interne Groupe France Tlcom

14

Quelques branches de dveloppements

Les architectures alternatives :


ARM : http://www.arm.linux.org.uk/ MIPS : http://www.linux-mips.org/ SH4 : http://sourceforge.net/projects/linuxsh Power PC : http://penguinppc.org/ uClinux : http://www.uclinux.org/

Quelques branches de dveloppement :


USAGI (IPv6) : http://www.linux-ipv6.org/ les ordonnanceurs exprimentaux : SD : http://members.optusnet.com.au/ckolivas/kernel/ CFS : http://people.redhat.com/mingo/cfsscheduler/

RT-preempt : http://people.redhat.com/~mingo/realtime-preempt/
interne Groupe France Tlcom

15

Portabilit
Il est dvelopp principalement en langage C (pas de langage objet tel que le C++) avec une lgre couche en assembleur. Pour les portages sur une nouvelle architecture, il convient donc d'adapter cette dernire. En rsum, ce qui est propre un linux donn est localis dans le rpertoire arch/ des sources du noyau.

Minimum: processeurs 32 bits, avec ou sans MMU (Memory Management Unit) Architectures 32 bits: alpha, arm, cris, h8300, i386, m68k, m68knommu, mips, parisc, ppc, s390, sh, sparc, um, v850 Architectures 64 bits: ia64, mips64, ppc64, sh64, sparc64, x86_64 Voir arch/README ou Documentation/arch/README pour plus de dtails
interne Groupe France Tlcom

16

Nouveauts du noyau 2.6

Un nouvel ordonnanceur de tches, nomm O(1) a fait son apparition. Celui-ci tient beaucoup mieux la charge quand de nombreuses tches concurrentes s'excutent, et privilgie une rpartition quitable du temps de calcul entre celles-ci. Le noyau 2.6 est capable de grer plus de 4 Go de mmoire physique sur des machines x86 32 bits. Ce noyau apporte NPTL, une bibliothque optimise pour la gestion des threads POSIX et Futexes des smaphores optimises pour les processus. L'interactivit du nouveau noyau a t largement amliore. Ainsi, des modifications visant diminuer le temps d'excution des appels systmes (patchs low-latency et preempt) ont t intgrs. Simplification de devfs en udev. La granularit de l'horloge (tick) est passe de 10 ms 1 ms. L'architecture ALSA, qui fournit un systme avanc de gestion des cartes sons, a t intgre au noyau, en lieu et place d'OSS. Concernant les systmes de fichiers, de nombreuses optimisations sont disponibles pour ext2/ext3/ext4 : EA, ACL, rpertoires indxs et allocateur Orlov. Ct priphriques, plus besoin d'muler un graveur IDE en SCSI pour graver. Notez galement le support amlior de l'USB 2 et de l'ACPI. Une dernire amlioration trs importante est l'incorporation d'un ordonnanceur intelligent des accs aux disques durs. Celui-ci limite trs largement les dplacements de la tte de lecture du disque, et apporte des dbits levs en cas d'accs concurrentsinterne . Groupe France Tlcom

17

Etat des versions des noyau GNU Linux


Linux 2.6

Linux 2.2

Support par la communaut de dveloppeurs de Linux Dsormais mature et exhaustif. La plupart des pilotes ont t mis niveau. Toutes nouvelles fonctionnalits et performances accrues.

Branche plus maintenue au mme titre que les versions 1.x!!


Linux 2.4

Mr et exhaustif Mais les dveloppements sont arrts; peu de dveloppeurs voudront apporter leur aide. Sera dfinitivement obsolte lorsqu'un nouveau produit sera lanc. Toujours bien si les sources, outils et support viennent de vendeurs Linux commerciaux.
http://www.linux-foundation.org/publications/linuxkerneldevelopment.php Arbre des versions
interne Groupe France Tlcom

18

Evolutions des versions

Linux 1.0 (1994)


x86 seulement, Monolithique ;

Linux 1.2 (1995)


Ajout d'Alpha et Sparc

Linux 2.0 (mi-1996)


MIPS, Power PC, m68k Modulaire Multi-processeur,

Linux 2.2 (dbut 1999)


Ultra Sparc et ARM

Linux 2.4 (dbut 2001)


IA64 (Itanium), MIPS64, IBM S390 et SuperH support grand systmes USB, PnP, hotplug, firewall stateful.
interne Groupe France Tlcom

19

Numrotation des versions du noyau Linux


Les versions sont numrotes : X . Y . Z
Z : identifie de manire unique la version.
Branche de dev

1.3.XX

Y : type de la version : Nombre pair : version stable Nombre impair : version instable (dveloppement)
1.2.XX 1.4.XX Branche stable

X.Y: numro de version principale


1.0.XX 1.1.XX 1.2.XX 1.3.XX Etc : : : : version version version version stable de dev. stable de dev

Exemples : 2.0.40 : version 2.0 stable 2.3.74 : version 2.3 de dveloppement

20

interne Groupe France Tlcom

Caractristiques principales de Linux

Portabilit et support matriel : voir liste des processeurs supports ; Scalabilit : tourne sur des super ordinateurs aussi bien que sur des petits appareils ; Conformit aux standards et interoprabilit ; Support rseau avec une pile trs complte ; Scurit : grsecurity, selinux, revues de code (couvertures) ; Stabilit et fiabilit ; Modularit : possibilit de chargement de modules en dynamique.

21

interne Groupe France Tlcom

A propos des logiciels libres


Le noyau GNU Linux est un Logiciel Libre Free Software. Les Logiciels Libres donnent l'utilisateur 4 liberts : La libert d'utiliser le programme, comme bon lui semble ; La libert d'tudier comment le programme fonctionne, et de l'adapter ses besoins ; La libert de redistribuer des copies pour aider les autres ; La libert d'amliorer le programme, et de distribuer les amliorations au public.

http://www.gnu.org/philosophy/free-sw.html "Free software is a matter of liberty, not price. To understand the concept, you should think of free as in free speech, not as in free beer." http://www.gnu.org/philosophy/free-sw.html
22

interne Groupe France Tlcom

La GNU General Public License (GPL)


Les licences Copyleft se reposent sur le droit d'auteur pour exiger que toute version modifie reste un logiciel libre. La GNU GPL requiert que les modifications et les travaux drivs soient aussi placs sous GPL: Ne s'applique qu'aux logiciels distribus (pas en test ou dveloppement) Tout programme utilisant du code GPL (li statiquement ou dynamiquement) est considr comme une extension de ce code et donc plac sous GPL Pour plus de dtails : Copyleft: http://www.gnu.org/copyleft/copyleft.html FAQ GPL: http://www.gnu.org/licenses/gpl-faq.html Pour plus d'information pratique sur le sujet dans l'Union Europenne, contacter la Fondation pour une Infrastructure de l'Information Libre : http://ffii.org/index.en.html
23

interne Groupe France Tlcom

Contraintes de licence sur le noyau Linux


Exemple de contraintes au moment de distribuer :

Aucune contrainte avant toute distribution. Vous pouvez partager vos modifications au dbut dans votre propre intrt, mais n'y tes pas obligs ! Pour tout priphrique embarquant Linux et des Logiciels Libres, vous devez distribuer vos sources l'utilisateur final. Vous n'avez aucune obligation de les distribuer qui que se soit d'autre ! Les modules propritaires sont tolrs (mais non recommands) tant qu'ils ne sont pas considrs comme drivs de code GPL. Le portage d'un code fonctionnant dj sous un autre systme d'exploitation peut tre exempt de contamination avec la GPL. Les pilotes propritaires ne peuvent pas tre lis statiquement au noyau. Un pilote crit de zro est considr comme une souche propre non contamine. Aucun soucis pour les pilotes disponibles sous une licence compatible avec la GPL (dtails dans la partie sur l'criture de modules) S'appliquent aussi lorsque vous dveloppez dans des pays libres de brevets. Il se peut que vous ne puissiez pas exporter vos produits. Pilotes noyau avec brevets: vrifiez toujours la description du pilote dans la configuration du noyau Les problmes avec des brevets connus sont toujours documents.
Groupe France Tlcom Prfrer toujours les alternatives sans brevets (Linux RTAIinterne au lieu de

24

2 - CONSTRUCTION D'UN NOYAU

Paquets ncessaires pour la gnration Rcupration des sources du noyau Vrification de l'intgrit des sources Application des patchs

Exemple d'application d'un patch Cration d'un patch noyau

Dfinition de la configuration (mode texte + graphique)


Compilation et installation

Etude de la phase de boot


Quelques chargeurs de dmarrage Cration d'une image initrd

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Phase 0 : Paquets ncessaires pour la compilation Pour installer le noyau 2.6.x, assurez-vous d'avoir les paquets suivants (version
minimum) : la librairie ncurses-5, certaines distributions l'appellent libncurses5 et libncurses5-dev (ou libncurses5-devel) l'utilitaire bzip2 l'utilitaire gzip Gnu gcc 2.95.3 (commande : gcc --version) Gnu make 3.78 (commande : make --version) binutils 2.12 (commande : ld -v) util-linux 2.10 (commande : fdformat --version) module-init-tools 0.9.10 (commande : depmod -V) procps 3.1.13 (commande : ps --version)

Phases pour la gnration d'un noyau :


1. 2. 3. 4. 5. 6.

Rcupration du code source du noyau et de ses patch Vrification de l'intgrit des packages reu Application des patch sur le code source Gnration d'une configuration Compilation Installation

26

interne Groupe France Tlcom

PHASE 1 : rcupration d'une copie des sources officiels

Tlcharger les sources depuis le site http://kernel.org/ (maintenu par la socit Transmeta)
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.7.tar.bz2 et wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.7.tar.bz2.sign

Il peut tre aussi ncessaire de rcuprez une mise jour (ensemble de correctifs) pour la version x.y.<z-1> :
wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-2.6.7.bz2 et wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-2.6.7.bz2.sign

A noter que ce serveur est accessible par divers protocoles :


FTP HTTP NFS SMB/CIFS ftp://ftp.kernel.org/pub http://ftp.kernel.org/pub ftp.kernel.org:/pub \\ftp.kernel.org\pub

Les sources peuvent aussi tre rcuprs depuis les serveurs de paquets officiels :
Mandriva Fedora Debian Ubuntu Slackware Gentoo
27

: urpmi kernel-headers kernel-source : yum install kernel-source : apt-get install kernel-headers-$(uname -r) kernel-source-$(uname -r) : apt-get install linux-headers-N_de_noyau linux-source-$(uname -r) : installpkg /o_est/kernel-source-2.6.x.tgz /o_est/kernel-headers-2.6.x.tgz : emerge gentoo-sources
interne Groupe France Tlcom

Phase 2 : vrification de l'intgrit des sources

Vrifiez l'intgrit des sources:

gpg --verify linux-2.6.7.tar.bz2.sign linux-2.6.7.tar.bz2

Example :
% gpg --verify linux-2.3.9.tar.gz.sign linux-2.3.9.tar.gz gpg: Signature made Mon Oct 9 23:48:38 2000 PDT using DSA key ID 517D0F0E gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>"

Cette tape rarement effectue est pourtant importante pour tre sr de l'intgrit du code source rcupr. Il en va de mme pour tout autre package open-source.

Dtails sur GnuPG: http://www.gnupg.org/gph/en/manual.html Dtails sur la signature des sources du noyau: http://www.kernel.org/signature.html

28

interne Groupe France Tlcom

Phase 3 : application des patchs (si ncessaire)


Commande patch: utilise la sortie (stdout) de la commande diff pour appliquer un
ensemble de changements une arborescence de fichiers sources.

Utilisation classique de patch :


patch -pn < fichier_diff

n: nombre de niveaux de rpertoires sauter (ex. page suivante) Patches Linux: Toujours appliquer sur la version x.y.<z-1> Toujours prvu pour n=1: patch -p1 < linux_patch

A noter qu'il est possible d'inverser un patch de la faon suivante :


patch -R -p1 < ../patch-x.y.z

La commande diff effectuant un diffrentiel entre un ou plusieurs fichiers (rcursif), les patchs doivent tre regnrs pour chaque version de kernel du fait de l'volution du code source du noyau Linux.

29

interne Groupe France Tlcom

Exemple d'application d'un patch

Dump d'un Patch sur un fichier donn :


--- linux-2.6.8.1/include/asm-arm/hardware.h 2004-08-14 12:54:48.000000000 +0200 +++ linux-2.6.8.1_modified/include/asm-arm/hardware.h 2004-08-17 12:42:06.119650556 +0200 @@ -15,13 +15,4 @@ #include <asm/arch/hardware.h> -#ifndef __ASSEMBLY__ -struct platform_device; -extern int platform_add_devices(struct platform_device **, int); -extern int platform_add_device(struct platform_device *); -#endif #endif

Exemple d'utilisation : $ cd linux-2.6.8.1 $ patch -p1 < hardware.diff

Applique dans ce cas les changements au header include/asm-arm/hardware.h. Un patch peut cependant tre rcursif et toucher donc un ensemble de fichiers.

-pnombre : enleve le plus petit prfixe contenant nombre slashs de la tte de chaque nom de fichier trouv dans le fichier patch. Une squence d'un ou de plusieurs slashs adjacents compte pour un slash unique. Cela contrle la faon dont les noms trouvs dans le fichier patch sont traits, au cas o vous conserveriez vos fichiers dans un rpertoire diffrent de celui qui a envoy le patch. Par exemple, en supposant que le nom du fichier dans le fichier patch tait u/howard/src/blurfl/blurfl.c Spcifier -p0 donne le nom de fichier entier non modifi, -p1 donne : u/howard/src/blurfl/blurfl.c Sans le slash de tte, -p4 donne : blurfl/blurfl.c Ne pas spcifier de -p du tout vous donne blurfl.c. Ce que vous obtenez finalement est recherch soit dans le rpertoire courant, soit dans le rpertoire spcifi par l'option -d.
30

interne Groupe France Tlcom

Cration d'un patch noyau


1. Tlchargez la dernire version des sources du noyau sur lequel vous travaillez. 2. Faites une copie de ces sources :
rsync -a linux-2.6.9-rc2/ linux-2.6.9-rc2-patch/

3. Appliquez vos modifications aux sources copis et testez les : 4. Crez un fichier correctif (patch) :
diff -Nru linux-2.6.9-rc2/ linux-2.6.9-rc2-patch/ > patchfile Patchfile doit suivre une charte de nommage rappelant la version du noyau prise comme rfrence, le(s) bug(s) corrig(s).

5. Comparez toujours la structure complte des sources (utilisable par patch -p1) Nom du fichier correctif: doit rappeler le problme rsolu

31

interne Groupe France Tlcom

Etape 4 : dfinition la configuration du noyau


diter le Makefile pour dfinir la version et l'architecture de la cible (si ncessaire) :
Pour identifier l'image de votre noyau avec d'autres, compiles partir des mme sources, utilisez la variable EXTRAVERSION: VERSION =2 PATCHLEVEL = 6 SUBLEVEL =7 EXTRAVERSION = -openstb

(uname -r retournera: 2.6.7-openstb )

Configuration : dfinir quelles fonctionnalits mettre dans le noyau. Plusieurs mthodes peuvent tre utilises :
make config make menuconfig make oldconfig make xconfig make gconfig (mode texte) (interface ncurses) (chargement d'une ancienne configuration) (interface X utilisant le librairie graphique Qt/KDE) (interface X utilisant la librairie graphique de GNOME)

Il est possible d'diter la configuration la main

Les symboles de configuration du noyau (syntaxe Makefile) sont stocks dans le fichier .config la racine des sources. Les fichiers de config des distributions sont gnralement dans /boot/ Pour rcuprer la configuration actuelle d'un noyau 2.6 :
sudo zcat /proc/config.gz > /usr/src/linux/.config

Fonctionne si le noyau est compil avec l'option : CONFIG_IKCONFIG_PROC = y


32

interne Groupe France Tlcom

Configuration en mode texte


make config : mode texte, ou on choisit une une toutes les options (c'est dire des centaines !), sans possibilit de retour arrire. Trs fastidieux. Dconseill.

make menuconfig : Interface texte. Pratique galement. Vous pouvez aussi diter le fichier .config la main ! Attention cependant aux dpendances. make oldconfig Permet de mettre jour un fichier de config d'un ancien noyau Mise en garde pour les symboles optionnels Demande les valeurs des nouveaux symboles

33

interne Groupe France Tlcom

Configuration en mode graphique


make xconfig :

qconf: nouvelle interface Qt de configuration pour Linux 2.6. Bien plus facile utiliser ! Lisez help -> introduction: vous y trouverez des options utiles! Navigateur de fichiers: plus simple de charger les fichiers de configuration
Il faudra d'abord installer le paquet libqt3-mt-dev

make gconfig : identique xconfig, mais avec les bibliothques graphiques de gnome.

Il faudra d'abord installer le paquet liglade2-dev.


34

interne Groupe France Tlcom

Sections des options du noyau


Les options correspondent des fonctionnalits que vous pouvez activer/dsactiver dans le noyau suivant vos besoins. Elles sont organises suivant diffrentes sections et sous-sections, nous allons ici dcrire les principales sections qui existent et en donner une brve description pour vous donner une ide des options qu'elles peuvent contenir. Note: Il est important de noter que d'une version l'autre du noyau, les options, sous-sections ou mme les sections peuvent changer, mais l'ide gnrale reste conserve. Les options section par section :

35

Code maturity level options: Permet de cacher ou de faire apparatre les options qui sont encore en dveloppement et donc considres comme instables (souvent utile de dire 'oui' ici si l'on veut pouvoir profiter des dernires avances du noyau). General setup: Ensemble d'options gnrales sur votre systme (sauf si vous voulez compiler pour des architectures trs particulires, vous pouvez le laisser tel quel). Loadable module support: Options concernant la gestion des modules (le dfaut est presque toujours correct pour une utilisation normale). Block layer: Les entres/sorties sur votre carte-mre (inutile d'y toucher). Processor type and features: Options relatives au(x) processeur(s): type (x86, Sparc, ...), hyper-thread, dual-core, SMP, etc. Power management options (ACPI, APM): Options concernant l'conomie d'nergie, la mise en veille et l'ACPI/APM. Bus options (PCI, PCMCIA, EISA, MCA, ISA): Gestion de tous les endroits o vous pourriez enficher des cartes (PCI, PCMCIA, ISA, etc). Executable file formats: La gestion des fichiers excutable (Le support ELF doit toujours tre 'Y'). Networking: Options concernant les protocoles rseau grs par votre noyau (le dfaut est bien souvent suffisant, mais jetez y un coup d'il tout hasard). Device Drivers: Options concernant tous les pilotes matriel (c'est bien souvent ici que l'on passe le plus de temps). File systems: Options concernant les systmes de fichiers grs par votre noyau (vous aurez y jeter un coup d'oeil). Instrumentation Support: Option de profilage du noyau (inutile de l'activer). Kernel hacking; Options de dbogage du noyau (inutile de l'activer sauf si vous avez des envies particulires). Security options: Options concernant le modle de scurit de votre noyau (le dfaut est suffisant) Cryptographic options: Algorithmes cryptographiques pouvant tre implants dans le noyau (le dfaut est suffisant). Library routines: Bibliothques communes du noyau (le dfaut est suffisant)
interne Groupe France Tlcom

Positionner les options


Le moment est venu de choisir vos options. Si c'est la premire fois que vous compilez le noyau, je vous conseille de les passer toutes en revue les unes aprs les autres en lisant l'aide qui y est attache, dans l'ordre, afin de voir si elles s'appliquent vous ou non. Dans l'outil de configuration du noyau, chaque question attend une rponse : 'oui' (Y), 'non' (N) ou ventuellement 'module' (M) pour rendre la fonctionnalit chargeable dynamiquement.

De manire gnrale, il est bon de modulariser les fonctionnalits qui ne servent pas en permanence (lecteur de CD, carte rseau, clefs USB, ...), mais tout n'est pas possible (enfin... pas simplement :). Par exemple, vous ne devriez pas mettre en module ce qui est utilis lors du dmarrage de votre ordinateur (pilotes des disques-durs IDE, systme de fichiers que vous utilisez pour votre partition /, ou encore le support rseau si votre partition racine est monte par le rseau et NFS dans le cas des stations diskless par exemple, etc). En effet, les modules sont chargs aprs le noyau, et si les modules IDE sont sur un disque IDE, il faut d'abord les charger avant de pouvoir accder au disque, mais pour les charger, il faut avoir accs au disque et donc les avoir chargs avant... vous voyez le cercle vicieux ? En fait, il est possible de contourner ce problme grce initrd, mais cela dpasserait l'ambition de ce document... Tout le reste peut tre compil en modules, c'est dire carte son, carte rseau (sauf si votre racine est dporte sur un serveur NFS comme dit prcdemment), le support ppp (pour internet par modem), le CD-ROM, ... Voici ci-dessous les options classiques utiliser pour une configuration standard. Si rien n'est dit ici propos d'une option, regardez l'aide ou conservez la valeur par dfaut ; vous pouvez aussi rpondre 'N' tous les priphriques que vous ne possdez pas, comme par exemple, IDE/ATAPI TAPE, etc. Quoi qu'il arrive, dans le doute, il vaut mieux laisser les options par dfaut.
36

interne Groupe France Tlcom

Connatre son matriel

PCI : lspci et lspci -t ou lspcidrake (sous mandrake)


01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go 5200] (rev a1) (prog-if 00 [VGA]) Subsystem: Samsung Electronics Co Ltd: Unknown device c00f Flags: bus master, 66Mhz, medium devsel, latency 248, IRQ 11 Memory at c8000000 (32-bit, non-prefetchable) [size=16M] Memory at d8000000 (32-bit, prefetchable) [size=128M] Expansion ROM at <unassigned> [disabled] [size=128K] Capabilities: [60] Power Management version 2 Capabilities: [44] AGP version 3.0

DMI (Desktop Management Interface) : dmidecode


[...] DMI type 2, 8 bytes. Board Information Block Vendor: ASUSTeK Computer INC. Product: P4S8L Version: REV 1.xx Serial Number: xxxxxxxxxx [...]

Disques IDE : hdparam


hdparm -i /dev/hda /dev/hda: Model=FUJITSU MHT2040AT, FwRev=0022, SerialNo=NN77T3C13KB9 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a:

PROCESSEUR : cat /proc/cpuinfo USB : lsusb APCI : cat /proc/acpi/info cat /proc/acpi/battery/BAT1/info cat /proc/acpi/thermal_zone/THRM/temperature /proc/acpi/thermal_zone/THRM/trip_points

Il faut aussi regarder les messages du noyau : dmesg

http://rhlinux.redhat.com/kudzu/ http://www.freedesktop.org/wiki/Software/hal http://www.linux.org/apps/AppId_4812.html http://ezix.org/project/wiki/HardwareLiSter http://ezix.sourceforge.net/software/lshw.html http://smartmontools.sourceforge.net/ http://www.nongnu.org/dmidecode/ http://secure.netroedge.com/~lm78/ http://www.nt.phys.kyushu-u.ac.jp/shimizu/download/download.html


37

interne Groupe France Tlcom

Phase 5 : compilation et installation du noyau

Pour une compilation croise (pour une autre architecture) il faut modifier la plateforme cible par dfaut : ARCH ?= arm CROSS_COMPILE ?= arm-linux(prfixe du compilateur crois) Ou bien dfinit les variables en mme temps que make ARCH=arm CROSS_COMPILE=arm-linux(Utile quand vous compilez pour diffrentes plateformes) Voir les commentaires dans les Makefile du noyau Linux pour plus de dtails

Compilation : make Phase la plus longue (Ex: 45 minutes pour compiler un noyau 2.6.15.4 (38 Mo compress) sur un

portable Pentium 4 3,2 GHz avec 512 Mo de RAM).

Installation (en tant que root !) :

sudo make install sudo make modules_install

Avec la version 2.4, il fallait faire : make dep && make clean && make bzImage puis make modules

Les commandes suivantes ne sont plus ncessaires en 2.6 : make depends make modules (effectue par make)

Ou bien en une seule commande : make && make modules_install && make install

Il peut tre intressant d'effacer tous les fichiers crs (pour crer des patches...) : makemrproper

38

interne Groupe France Tlcom

Optimisation de la phase de compilation

Adapter la configuration de votre noyau en ne choisissant que les modules ncessaires votre
matriel. Cela peut diviser le temps de compilation par 30 et conomiser des centaines de MB!

Compiler plusieurs fichiers en parallle : make -j <number> Lance plusieurs compilations en parallle, autant que possible

make -j 4 Plus rapide mme sur les machines uniprocesseur ! Moins de temps perdu lire ou crire les fichiers (les autres processus occupent le processeur) Pas utile de dpasser 4 (trop de changements de contexte) make -j <4*number_of_processors> Sur une machine multiprocesseurs. Attention ne pas perturber les autres utilisateurs !

Voir la ligne de commande dtaille ou Verbose (gcc, ld) : make V=1

39

interne Groupe France Tlcom

Fichiers gnrs aprs un make


Si la compilation se passe sans problme, les fichiers suivant sont gnrs :

vmlinux Image brute du noyau Linux, non compresse Fichier de mapping des symboles Listes des adresses des symboles des primitives inclues dans le noyau linux compil arch/<arch>/boot/zImage Image du noyau compresse avec zlib arch/<arch>/boot/bzImage Image du noyau compresse aussi avec zlib. Gnralement suffisamment petite pour tenir sur une disquette ! Image par dfaut sur i386

La commande file donne certaines informations sur le noyau linux :


file /boot/vmlinuz-2.6.17-10mdv vmlinuz-2.6.17-10mdv: Linux kernel x86 boot executable RO-rootFS, root_dev 0x1606, swap_dev 0x1, Normal VGA
40

interne Groupe France Tlcom

Fichiers installs aprs un make install + make module_install


/boot/vmlinuz-<version> /boot/System.map-<version> /boot/initrd-<version>.img systme /etc/grub.conf ou /etc/lilo.conf Image du noyau Stocke les adresses des symboles (primitives systmes) du noyau Initial RAM disk, contenant les modules ncessaires pour monter le de fichier root. make install lance mkinitrd ! make install met jour les fichiers de configuration de votre bootloader pour supporter votre nouveau noyau ! Il relance /sbin/lilo si LILO est votre bootloader. Modules noyau et autres fichiers Tout ce qui est ncessaire pour construire des modules pour ce noyau: fichier .config (build/.config), informations sur les symboles des modules(build/module.symVers), headers du noyau (build/include/) Fichiers modules .ko (Kernel Object), avec la mme structure de que dans les sources. modules.alias Aliases des modules pour insmod et modprobe. Exemple: alias sound-service-?-0 snd_mixer_oss Dpendances des modules pour insmod et modprobe. Aussi utilis pour ne copier que les modules ncessaires dans un systme de fichier minimal. Dit quel module appartient un symbole donn.
interne Groupe France Tlcom

/lib/modules/<version>/ build/

kernel/ rpertoires /lib/modules/<version>/

modules.dep modules.symbols
41

Exemple de fichier de mapping des symboles des primitives du noyau


$ cat /boot/System.map 00100000 A phys_startup_32 bfffe400 A __kernel_vsyscall bfffe410 A SYSENTER_RETURN bfffe420 A __kernel_sigreturn bfffe440 A __kernel_rt_sigreturn c0100000 A _text c0100000 T startup_32 c01000a4 T startup_32_smp c0100124 t checkCPUtype c01001a5 t is486 c01001ac t is386 c0100210 t L6 c0100212 t check_x87 c010023a t setup_idt c0100257 t rp_sidt (...)
42

interne Groupe France Tlcom

Dmarrage d'un systme GNU Linux

Quand le systme dmarre (boot ou reboot), le CPU invoque le vecteur de reset de faon rcuprer l'adresse d'un programme localis excuter Pour un systme traditionel, cet emplacement est localis dans le B.I.O.S. de la carte mre. Quand un device bootable est trouv, la premire tape consiste en un chargement du boot loader en RAM (MBR). Le boot loader doit tre d'une taille infrieure ou gale 512 octets (un seul secteur) et son rle est de charger en RAM puis d'excuter la seconde tape (GRUB, LILO, )

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Dmarrage d'un systme GNU Linux


La seconde tape peut afficher un cran de boot (splashscreen) et cre une zone de mmoire (RAMFS) pour charger le rootfs temporaire depuis l'image Initrd. Une fois cette seconde tape de lance, charge le noyau linux en mmoire vive puis invoque ce dernier. Par le suite il y a commutation entre le rootfs temporaire et celui qui sera utilis par la suite (rellement). Aprs que le noyau soit charg et initialis, le noyau dmarre en premier la premire application de l'espace utilisateur via la libc (/sbin/init) en suivant le numro dfini dans /etc/inittab. Dans Ubuntu, /sbin/init est remplac par upstart : http://upstart.ubuntu.com/

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Dtail de la phase de dmarrage


La procdure de dmarrage de Linux ressemble ceci :
1.

Le BIOS de la machine initialise le matriel puis charge le secteur de dmarrage. Le secteur de dmarrage (ou MBR pour Master Boot Record) excute le chargeur de dmarrage (bootloader) qui va permettre de lancer le noyau. Le noyau initialise les priphriques, charge les pilotes du matriel et monte le systme de fichiers racine. Puis il excute /sbin/init. init est le programme responsable du dmarrage de tous les processus utilisateurs. Il lit le fichier /etc/inittab puis excute un ensemble de scripts dcrit dans ce fichier. Le script excut ensuite est /etc/init.d/rcS. Il lance tout dabord les scripts du rpertoire /etc/rcS.d/, qui ne sexcutent quune fois, au dmarrage de la machine. Ensuite /etc/init.d/rcS traite lun des rpertoires /etc/rc*.d en fonction du runlevel par dfaut spcifi dans /etc/inittab (en gnral, le numro 2). Par consquent, ce sont tous les scripts du rpertoire /etc/rc2.d qui sont excuts. Ce style de procdure de dmarrage est appel SysV (pour Systme V).

2.

3.

4.

5.

Par la suite, la commande init permettra de changer de runlevel. Elle est, bien entendu, rserve ladministrateur. Les rpertoires /etc/rc*.d ne contiennent pas les scripts de dmarrage rels, mais plutt des liens symboliques vers des scripts situs dans le rpertoire /etc/init.d. Ceci permet dviter une redondance inutile. La manire dont sont nomms les liens symboliques dterminera lordre dans lequel les services seront dmarrs : simple, ingnieux et pratique.
$ ps axfl UID PID PPID STAT TTY TIME COMMAND 0 1 0 S ? 0:03 init

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Quelques chargeurs de dmarrage



LILO: LInux LOader. Chargeur de dmarrage originel de Linux. Toujours utilis ! http://freshmeat.net/projects/lilo/ Matriel support: x86 GRUB: GRand Unified Bootloader de GNU. Plus puissant. http://www.gnu.org/software/grub/ Matriel support: x86 CoreBoot (Ex Linux Bios) : Remplaant du BIOS, bas sur Linux. http://www.coreboot.org/Matriel support: x86 sh-boot: Chargeur de dmarrage du projet LinuxSH. http://cvs.sourceforge.net/viewcvs.py/linuxsh/sh-boot/ Matriel support: sh LAB: Linux As Bootloader, de Handhelds.org Partie du noyau Linux de Handhelds.org Voir http://handhelds.org/moin/moin.cgi/Linux26ToolsAndSources Matriel support: arm (exprimental) U-Boot: Universal Bootloader. Le plus utilis sur arm. http://u-boot.sourceforge.net/ Matriel support: arm, ppc, mips, x86 RedBoot: Chargeur de dmarrage bas sur eCos de Red-Hat. http://sources.redhat.com/redboot/ Matriel support: x86, arm, ppc, mips, sh, m68k...

Loadlin : le chargeur de linux (LOADLIN = LOAD LINux) ftp://ftp.sunet.se/pub/Linux/distributions/slackware/slackware-current/kernels/loadlin16c.zip http://en.wikipedia.org/wiki/Loadlin


Syslinux, chargeur util pour les clef usb et les liveCD http://www.kernel.org/pub/linux/utils/boot/syslinux/ ISOLINUX : un chargeur pour les cdrom ISO 9660

http://syslinux.zytor.com/iso.php

46

interne Groupe France Tlcom

Ligne de commande du noyau


Comme la plupart des programmes C, le noyau Linux accepte des arguments en ligne de commande :

Utile pour configurer le noyau au dmarrage, sans avoir le recompiler. Exemple (utilis pour le PDA HP iPAQ h2200) root=/dev/ram0 rw init=/linuxrc \ console=ttyS0,115200n8 console=tty0 \ ramdisk_size=8192 cachepolicy=writethrough \

Paramtres les plus utiliss :

root Permet d'identifier le systme de fichier racine init Script excuter la fin de l'initialisation du noyau Par dfaut: /sbin/init console Console pour les messages de dmarrage ro / rw Monte le priphrique root en lecture seule / lecture-criture

Des centaines de paramtres sont dcrit dans Documentation/kernel-parameters.txt


47

interne Groupe France Tlcom

Initrd (initial RAM Disk)


Initrd = Initial RAM disk = disque mmoire temporaire de dmarrage.

Systme de fichier racine (/) minimaliste en RAM Utilis traditionnellement pour minimiser le nombres de pilotes de priphriques compils dans le noyau. Exemple: le module ext3 qui permet de monter le systme de fichier racine final. Utile aussi pour lancer des scripts d'initialisation complexes Utile pour charger des modules propritaires (qui ne peuvent tre lis statiquement au noyau) Pendant la phase d'installation (make install) cre l'image initrd (init RAM disk) : mkinitrd -o /boot/initrd.img-2.6.15.4 /lib/modules/2.6.15.4. Exemple de cration d'une image initrd :
mkdir /mnt/initrd dd if=/dev/zero of=initrd.img bs=1k count=2048 mkfs.ext2 -F initrd.img mount -o loop initrd.img /mnt/initrd ( Peut tre rempli avec: busybox, les modules, le script linuxrc ) umount /mnt/initrd gzip --best -c initrd.img > initrd

Pour plus d'information : il suffit de lire Documentation/initrd.txt dans les sources du noyau. Elle couvre aussi le changement de systme de fichier racine (pivot_root).
http://www.ibm.com/developerworks/linux/library/l-initrd.html

48

interne Groupe France Tlcom

3 ARCHITECTURE DU NOYAU

Vue simplifie du noyau Vue modulaire du noyau Hypergraphe des sources du noyau Rle du noyau Dcoupage du noyau Virtual File System (VFS) Process Management (PM) Memory Management (MM) Gestion des entres/sorties (I/O) Network Stack (NS) System Call Interface (SCI)

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Vue simplifie d'un diagramme matriciel du noyau GNU Linux

50

interne Groupe France Tlcom

Vue modulaire du noyau GNU Linux

51

interne Groupe France Tlcom

Vue de l'hypergraphe form par l'arborescence des sources du noyau 2.4.9

Linux possde plusieurs hypergraphes tel que celui-ci ou bien celui reprsentant les dpendances des paquets quant l'tablissement d'une distribution conforme LSB (mme basique).

Note : ce schma n'est pas trs lisible mais montre cependant la reprsentation en oignon (concentrique) du noyau GNU Linux
52

interne Groupe France Tlcom

Rle du noyau GNU Linux


GNU (GNU is Not Unix) Linux est le coeur du systme. Il fournit une interface (API) avec le matriel via une couche de drivers. Il gre aussi l'ordonnacement des tches rendant ce dernier :
multi-tches ; premptif (davantage en 2.6 qu'en 2.4) ; multi-utilisateurs

Cependant il n'est pas nativement temps rel. Pour ce faire il faut rajouter un microkernel temps rel tel que RTAI, RTLINUX ou XENOMAI. En d'autre terme le noyau manage les tches tant en espace noyau qu'en espace utilisateur. Vue de l'espace user, le noyau peut tre contact via un ensemble d'appels systmes rfrencs dans la librairie C (glibc).

53

interne Groupe France Tlcom

Linux et le temps rel

Le noyau Linux n'tant pas Temps rel en natif il est Cependant possible de le Complter d'un micro-kernel Temps rel o linux est excut Comme sous UML, c'est-dire sous la forme d'un process

http://uuu.enseirb.fr/~kadionik/embedded/linux_realtime/linux_realtime9.html http://en.wikipedia.org/wiki/RTLinux http://en.wikipedia.org/wiki/RTAI http://en.wikipedia.org/wiki/Wind_River_Systems http://fr.wikipedia.org/wiki/Xenomai http://www.xenomai.org/index.php/Main_Page http://fr.wikipedia.org/wiki/Xenomai


interne Groupe France Tlcom

54

Dcoupage du noyau Linux

Le noyau GNU Linux a hrit de l'architecture de UNIX propritaire. Il est souvent compar un oignon tant il est organis en couches successives, en partant du matriel, au drivers jusqu' l'espace utilisateur qui est sa frontire

Espace utilisateur

Matriel
55

interne Groupe France Tlcom

VFS - Virtual File System

56

interne Groupe France Tlcom

VFS : Virtual File System


Linux n'tant pas monolithique c'est--dire qu'il est constitu d'un ensemble de parties comme la pile rseau, la gestion de la mmoire, etc Bref VFS est la couche d'abstraction de haut niveau intra-kernel regroupant un ensemble de primitives gnriques comme open, close, read, write (au nom prs). S'il s'agit d'crire un fichier (une fifo ou autre) sur un disque, h bien l'implmentation dans le kernel sera la mme qu'il s'agisse d'un disque avec un systme de fichier cramfs, jffs2 ou 3, ext2 ou 3, reizerfs, etc VFS est la couche virtuelle qui permet de niveler les appels d'un point de vue noyau ou drivers en se souciant pas du systme de fichiers rellement utilis. En plus de l'API offerte, VFS est un dispatcher sous cette couche, il y a un module spcifique chaque systme de fichiers

57

interne Groupe France Tlcom

Oprations sur les fichiers

La primitive register_chrdev(), permet de dclarer des file_operations (appelles fops). Voici ses principales oprations :

loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *);

http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/

58

interne Groupe France Tlcom

Oprations sur les fichiers


int (*ioctl) (struct inode *, struct file *, unsigned
int, unsigned long); Utilise pour envoyer au priphrique des commandes spcifiques, qui ne sont ni des lectures, ni des critures (ex: formater un disque, changer une configuration).

int (*mmap) (struct file *, struct vm_area_struct); Demande que la mmoire du priphrique soit mappe dans l'espace d'adressage du processus utilisateur

struct module *owner; Utilise par le noyau pour garder une trace de qui utilise cette structure et compter le nombre d'utilisateurs du module.
LFH : http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/Linux-Filesystem-Hierarchy.pdf

59

interne Groupe France Tlcom

La structure file
Au niveau kernel, VFS fournit la mthode open() pour ouvrir un fichier et retourner un pointeur sur la structure reprsentant le fichier ouvert. Les pointeurs vers cette structure sont les " fips".

mode_t f_mode; Mode d'ouverture du fichier (FMODE_READ, FMODE_WRITE) loff_t f_pos; Position dans le fichier ouvert. struct file_operations *f_op; Peuvent tre changes la vole. struct dentry *f_dentry Utilis pour accder l'inode: filp->f_dentry->d_inode.

Pour information :

copy_from_user Copie des donnes de l'espace utilisateur vers l'espace noyau. copy_to_user Copie des donnes de l'espace noyau vers l'espace utilisateur.

60

interne Groupe France Tlcom

Table des systmes de fichiers courants

61

interne Groupe France Tlcom

Fuse : un systme de fichier en espace utilisateur Pas mal de qualits :


API simple via la librairie dynamique libfuse Implmentation d'un systme de fichiers en espace user ( pas de dveloppement noyau) Utilisation ne ncessitant pas de patcher le noyau Implmentation scurise Transfert entre l'espace noyau et l'espace utilisateur optimis Ne ncessite pas des droit root Fonctionne sous GNU Linux 2.4 et 2.6 A prouv sa stabilit

http://fuse.sourceforge.net/ http://fuse.sourceforge.net/wiki/index.php/FileSystems
62

interne Groupe France Tlcom

PM (Process Management)

63

interne Groupe France Tlcom

PM : Process Management

Cration

STOPPE

Diagramme tats-transition des processus gr par l'ordonnaceur du noyau GNU Linux

Signal

Signal

PRET

Ordonnancement

EN EXECUTION Terminaison ZOMBIE

Fin d'entre/ sortie SUSPENDU

Entre/ Sortie

64

interne Groupe France Tlcom

Le scheduler CFS (depuis 2.6.23)


Le Completely Fair Scheduler (ordonnanceur compltement quitable en anglais), ou CFS est un ordonnanceur de tches pour le noyau linux, qui a fait son apparition avec la version 2.6.23 sortie le 9 octobre 2007, remplaant ainsi le prcdent ordonnanceur qui tait apparu dans le noyau 2.5.2pre10 en janvier 2002. Il gre l'allocation de ressource processeur pour l'excution des processus, en maximisant l'utilisation globale du CPU tout en optimisant l'interactivit. Il a t crit par Ingo Molnr. Contrairement au prcdent ordonnanceur utilis par le noyau linux, CFS n'est pas bas sur des files de processus, mais utilise un arbre rouge-noir implmentant une chronologie des futures excutions des tches. En effet, l'arbre trie les processus selon une valeur reprsentative du manque de ces processus en temps d'allocation du processeur, par rapport au temps qu'aurait allou un processeur dit multitche idal, sur lequel tous les processus s'excuterait en mme temps et la mme vitesse. Ainsi, chaque intervention de l'ordonnanceur, il "suffit" ce dernier de choisir le processus le plus en manque de temps d'excution pour tendre au mieux vers le comportement du processeur multitche idal. De plus, l'ordonnanceur utilise une granularit temporelle la nanoseconde, rendant redondante la notion de tranches de temps, les units atomiques utilises pour le partage du CPU entre processus. Cette connaissance prcise signifie galement qu'aucune heuristique (base sur des statistiques, donc pouvant commettre des erreurs) n'est requise pour dterminer l'interactivit d'un processus. Plusieurs avances sont apportes par le nouveau noyau 2.6.25. L'ordonnanceur CFS a t rendu plus agressif dans le dplacement des processus entre les coeurs de calcul. Maintenant, dans le cas d'une comptition entre des tches temps rel pour accaparer un seul coeur, le noyau migrera plus efficacement certaines tches vers les autres processeurs afin d'viter les temps d'attente. D'autre part le verrou global du noyau (big kernel lock) est maintenant premptible par dfaut et l'option permettant de ne pas le rendre premptible va sans doute disparatre. Les timers haute rsolution peuvent maintenant tre utiliss pour calculer les priorits entre les processus ce qui rend l'ordonnanceur plus prcis lors de ses allocations de temps. On peut galement noter que la fonction d'ordonnancement de groupe, introduite dans le noyau prcdent, gagne des fonctions de support du temps rel.
http://kerneltrap.org/node/8059 http://people.redhat.com/mingo/cfs-scheduler/ http://www.ibm.com/developerworks/linux/library/l-cfs/ http://en.wikipedia.org/wiki/Completely_Fair_Scheduler

65

interne Groupe France Tlcom

Etat d'attente
L'endormissement est ncessaire lorsqu'un processus utilisateur attend des donnes qui ne sont pas encore prtes. Il est alors plac dans une queue/file d'attente. Dclarer la queue : DECLARE_WAIT_QUEUE_HEAD(module_queue); Plusieurs moyens d'endormir un processus :

sleep_on()

Ne peut pas tre interrompu !

interruptible_sleep_on() sleep_on_timeout()

wait_event() wait_event_interruptible() Dort jusqu' ce qu'une condition soit vrifie.

Peut tre interrompu par un signal Utilisez seulement les commandes interruptibles !

Les autres sont rarement ncessaires.


interruptible_sleep_on_timeout() Similaire ci-dessus, mais avec un dlai d'expiration.
interne Groupe France Tlcom

66

Se rveiller !

wake_up(&queue);
Rveille tous les processus attendant dans la queue donne

wake_up_interruptible(&queue);
Rveille seulement les processus interruptibles

wake_up_sync(&queue);
Ne rordonnance pas lorsque vous savez qu'un autre processus est sur le point de s'endormir, car dans ce cas un rordonnancement va de toute faon se produire.

67

interne Groupe France Tlcom

MM (Memory Management)

68

interne Groupe France Tlcom

Organisation de la mmoire
ZONE_NORMAL :
4 GB

KERNEL VIRTUAL SPACE

3 GB

1 GB

USER VIRTUAL SPACE

KERNEL PHYSICAL SPACE

0 GB

0 GB

Mmoire virtuelle

Mmoire physique

Il est possible d'tendre l'utilisation de la mmoire au dela des 4 Go Via l'utilisation de la mmoire haute (ZONE_HIGHMEM).
http://www.informit.com/content/images/0131453483/downloads/gorman_book.pdf
69

interne Groupe France Tlcom

Modes adressage et conversions

Adressage logique : utilis par les instructions du microprocesseur. Adressage linaire : entier non-sign de 32 bits (jusqu' 4 294 967 296 cellules de mmoire). Adressage : utiliser pour adresser physiquement la mmoire vive via le bus hardware.

Conversions d'adressage successif.

70

interne Groupe France Tlcom

kmalloc et kfree

Allocateurs basiques, quivalents noyau des


malloc et free de la glibc :
static inline void *kmalloc(size_t size, int flags); size: quantit d'octets allouer flags: priorit (voir la page suivante) void kfree (const void *objp);

Exemple:

data = kmalloc(sizeof(*data), GFP_KERNEL);

71

interne Groupe France Tlcom

Proprits de kmalloc

Rapide ( moins qu'il ne soit bloqu en attente de pages) N'initialise pas la zone alloue La zone alloue est contigu en RAM physique Allocation par taille de 2n-k (k: quelques octets de gestion) Ne demandez pas 1024 quand vous avez besoin de 1000 ! Vous recevriez 2048 !

72

interne Groupe France Tlcom

Options pour kmalloc


Dfinis dans include/linux/gfp.h(GFP: get_free_pages)

GFP_KERNEL

Allocation mmoire standard du noyau. Peut tre bloquante. Bien pour la plupart des cas. Allocation de RAM depuis les gestionnaires d'interruption ou le code non lis aux processus utilisateurs. Jamais bloquante. Alloue de la mmoire pour les processus utilisateur. Peut tre bloquante. Priorit la plus basse.

GFP_NOIO

Peut tre bloquante, mais aucune action sur les E/S ne sera excute. Peut tre bloquante, mais aucune opration sur les systmes de fichier ne sera lance. Allocation de pages en mmoire haute en espace utilisateur. Peut tre bloquante. Priorit basse.

GFP_ATOMIC

GFP_NOFS

GFP_USER

GFS_HIGHUSER

73

interne Groupe France Tlcom

Flags pour kmalloc


Options supplmentaires (pouvant tre ajouts avec l'oprateur |)

__GFP_DMA
Allocation dans la zone DMA

__GFP_REPEAT
Demande d'essayer plusieurs fois. Peut se bloquer, mais moins probable.

__GFP_HIGHMEM Allocation en mmoire tendue (x86 et sparc)

__GFP_NOFAIL
Ne doit pas chouer. N'abandonne jamais. Attention: utiliser qu'en cas de ncessit!

__GFP_NORETRY
Si l'allocation choue, n'essaie pas d'obtenir de page libre.

74

interne Groupe France Tlcom

Allocation par pages


Plus approprie que kmalloc pour les grosses tranches de mmoire:

unsignedlongget_zeroed_page(intflags);
Retourne un pointeur vers une page libre et la remplit avec des zros

unsignedlong__get_free_page(intflags);
Identique, mais le contenu n'est pas initialis

unsignedlong__get_free_pages(intflags,
unsignedlongorder); Retourne un pointeur sur une zone mmoire de plusieurs pages continues en mmoire physique. order: log2(nombre_de_pages).

Librer des pages


void
free_page(unsigned long addr); void free_pages(unsigned long addr, unsigned long order); Utiliser le mme ordre que lors de l'allocation.

75

interne Groupe France Tlcom

Mapper des adresses physiques


vmalloc et ioremap peuvent tre utiliss pour obtenir des zones mmoire continues dans l'espace d'adresse virtuel (mme si les pages peuvent ne pas tre continues en mmoire physique).

void*vmalloc(unsignedlongsize); voidvfree(void*addr);

void*ioremap(unsignedlongphys_addr,
unsignedlongsize); Ne fait pas d'allocation. Fait correspondre le segment donn en mmoire physique dans l'espace d'adressage virtuel.

voidiounmap(void*address);

76

interne Groupe France Tlcom

Utilitaires pour la mmoire

void*memset(void*s,intvaleur,size_ttaille);
Remplit une rgion mmoire avec la valeur donne.

void*memcpy(void*dest,
constvoid*src, size_tcount); Copie une zone mmoire vers une autre. Utiliser memmove avec des zones qui se chevauchent.

De nombreuses fonctions quivalentes celles de la glibc sont


dfinies dans include/linux/string.h

77

interne Groupe France Tlcom

Choisir un intervalle d'E/S

Les limites de la mmoire et des ports d'E/S peuvent tre passs comme paramtres de module. Un moyen facile de dfinir ces paramtre est au travers de /etc/modprobe.conf Les modules peuvent aussi essayer de trouver des zones libres par eux-mmes (en faisant plusieurs appels request_region).

78

interne Groupe France Tlcom

Diffrences avec la mmoire standard

criture et lecture sur la mmoire peuvent tre mis en cache. Le compilateur peut choisir d'crire la valeur dans un registre du processeur, et ne jamais l'crire dans la mmoire principale. Le compilateur peut dcider d'optimiser ou rordonner les instructions de lecture / criture.

79

interne Groupe France Tlcom

Eviter les problmes d'accs aux E/S

Le cache sur la mmoire et les ports d'E/S est dsactiv, soit par le hardware ou par le code d'init Linux. Linux fournit les Barrires Mmoire pour empcher le compilateur de rordonnancer les accs: Indpendant
#include<asm/kernel.h> voidbarrier(void);

Dpendant de l'architecture
#include<asm/system.h> voidrmb(void); voidwmb(void); voidmb(void);

80

interne Groupe France Tlcom

Mmoire mappe directement

Dans certaines architectures (principalement MIPS), la mmoire


d'E/S peut tre directement mappe dans l'espace d'adressage physique.

Dans ce cas, les pointeurs d'E/S ne doivent pas tre drfrencs. Pour viter les problmes de portabilit travers les architectures,
les fonctions suivantes peuvent tre utilises : unsignedread[b|w|l](address); voidwriteb[b|w|l](unsignedvalue,address); voidmemset_io(address,value,count); voidmemcpy_fromio(dest,source,num); voidmemcpy_toio(dest,source,num);

81

interne Groupe France Tlcom

Mapper la mmoire d'E/S en mmoire virtuelle

Pour accder la mmoire d'E/S, les pilotes ont besoin d'une


adresse virtuelle que le processeur peut grer.

Les fonctions ioremap permettent cela:


#include<asm/io.h> void*ioremap(unsignedlongphys_addr, unsignedlongsize); void*ioremap_nocache(unsignedlongphys_addr, unsignedlong size); voidiounmap(void*address);

Attention: vrifiez que ioremap ne retourne pas NULL !

82

interne Groupe France Tlcom

mmap

Rpond aux requtes de la fonction mmap de la glibc:


void*mmap(void*start,size_tlength,intprot, intflags,intfd,off_toffset); intmunmap(void*start,size_tlength);

Permet aux programmes utilisateurs d'accder directement la mmoire du priphrique. Utilis par des programmes comme le serveur X-Window. Plus rapide que les autres mthodes (comme crire dans le fichier /dev correspondant) pour les applications utilisateur fort besoin en bande passante.

83

interne Groupe France Tlcom

Zones de Mmoire Virtuelle


Zone de Mmoire Virtuelle (Virtual Memory Areas): zone contigu dans la mmoire virtuelle d'un processus, avec les mmes permissions.
>cat/proc/1/maps(processus init) Dbut fin perm dcalage majeur:mineur inode Nom du fichier mapp 007710000077f000rxp0000000003:051165839/lib/libselinux.so.1 0077f00000781000rwp0000d00003:051165839/lib/libselinux.so.1 0097d00000992000rxp0000000003:051158767/lib/ld2.3.3.so 0099200000993000rp0001400003:051158767/lib/ld2.3.3.so 0099300000994000rwp0001500003:051158767/lib/ld2.3.3.so 0099600000aac000rxp0000000003:051158770/lib/tls/libc2.3.3.so 00aac00000aad000rp0011600003:051158770/lib/tls/libc2.3.3.so 00aad00000ab0000rwp0011700003:051158770/lib/tls/libc2.3.3.so 00ab000000ab2000rwp00ab000000:000 0804800008050000rxp0000000003:05571452/sbin/initprogramme 0805000008051000rwp0000800003:05571452/sbin/initdonnes, pile 08b4300008b64000rwp08b4300000:000 f6fdf000f6fe0000rwpf6fdf00000:000 fefd4000ff000000rwpfefd400000:000 ffffe000fffff000p0000000000:000

84

interne Groupe France Tlcom

Zones de Mmoire Virtuelle


Exemple du serveur X (extrait)
Dbut fin perm dcalage majeur:mineur inode Nom du fichier mapp 08047000081be000rxp0000000003:05310295/usr/X11R6/bin/Xorg 081be000081f0000rwp0017600003:05310295/usr/X11R6/bin/Xorg ... f4e08000f4f09000rwse000000003:05655295/dev/dri/card0 f4f09000f4f0b000rws4281a00003:05655295/dev/dri/card0 f4f0b000f6f0b000rwse800000003:05652822/dev/mem f6f0b000f6f8b000rwsfcff000003:05652822/dev/mem

85

interne Groupe France Tlcom

mmap simple
Pour autoriser les oprations mmap(), le pilote a juste besoin de crer des pages de mmoire mappant une zone physique. Cela peut tre fait avec la fonction suivante (linux/mm.h) appeler dans une fonction driver_mmap: intremap_page_range( structvm_area_struct*vma, unsignedlongfrom,/* Virtual */ unsignedlongto,/* Physical */ unsignedlongsize,pgprot_tprot); Cette fonction est alors ajouter la structure file_operations du pilote. Exemple: drivers/char/mem.c

86

interne Groupe France Tlcom

Gestion des entres/sorties

87

interne Groupe France Tlcom

Demander des ports d'E/S


/proc/ioports example 0000001f:dma1 00200021:pic1 00400043:timer0 00500053:timer1 0060006f:keyboard 00700077:rtc 0080008f:dmapagereg 00a000a1:pic2 00c000df:dma2 00f000ff:fpu 0100013f:pcmcia_socket0 01700177:ide1 01f001f7:ide0 03760376:ide1 0378037a:parport0 03c003df:vga+ 03f603f6:ide0 03f803ff:serial 0800087f:0000:00:1f.0 08000803:PM1a_EVT_BLK 08040805:PM1a_CNT_BLK 0808080b:PM_TMR 08200820:PM2_CNT_BLK 0828082f:GPE0_BLK ... 88

structresource*request_region(
unsignedlongstart, unsignedlonglen, char*name); Essaie de rserver la rgion donne et retourne NULL en cas d'chec. Exemple: request_region(0x0170,8,"ide1");

voidrelease_region(
unsignedlongstart, unsignedlonglen);

Regarder include/linux/ioport.h et
kernel/resource.c

interne Groupe France Tlcom

Lire / crire sur les ports d'E/S


L'implmentation des fonctions suivantes et le type unsigned peuvent varier suivant la plate-forme ! octets unsignedinb(unsignedport); voidoutb(unsignedcharbyte,unsignedport); mots unsignedinw(unsignedport); voidoutw(unsignedshortword,unsignedport); "long" integers unsignedinl(unsignedport); voidoutl(unsignedlongword,unsignedport);

89

interne Groupe France Tlcom

Lire / crire une chane sur les ports d'E/S


Plus efficace que la boucle C correspondante, si le processeur supporte de telles oprations : byte strings
voidinsb(unsignedport,void*addr,unsignedlongcount); voidoutsb(unsignedport,void*addr,unsignedlongcount);

word strings
voidinsw(unsignedport,void*addr,unsignedlongcount); voidoutsw(unsignedport,void*addr,unsignedlongcount);

long strings
voidinbsl(unsignedport,void*addr,unsignedlongcount); voidoutsl(unsignedport,void*addr,unsignedlongcount);

90

interne Groupe France Tlcom

Demander de la mmoire d'E/S


/proc/iomem 000000000009efff:SystemRAM 0009f0000009ffff:reserved 000a0000000bffff:VideoRAMarea 000c0000000cffff:VideoROM 000f0000000fffff:SystemROM 001000003ffadfff:SystemRAM 001000000030afff:Kernelcode 0030b000003b4bff:Kerneldata 3ffae0003fffffff:reserved 40000000400003ff:0000:00:1f.1 4000100040001fff:0000:02:01.0 4000100040001fff:yenta_socket 4000200040002fff:0000:02:01.1 4000200040002fff:yenta_socket 40400000407fffff:PCICardBus#03 4080000040bfffff:PCICardBus#03 40c0000040ffffff:PCICardBus#07 41000000413fffff:PCICardBus#07 a0000000a0000fff:pcmcia_socket0 a0001000a0001fff:pcmcia_socket1 e0000000e7ffffff:0000:00:00.0 e8000000efffffff:PCIBus#01 e8000000efffffff:0000:01:00.0 ...
91

Fonctions quivalentes avec la mme


interface

structresource*request_memregion(
unsignedlongstart, unsignedlonglen, char*name);

voidrelease_mem_region(
unsignedlongstart, unsignedlonglen);

interne Groupe France Tlcom

NS (Network Stack)

92

interne Groupe France Tlcom

Pile rseau

La pile rseau s'interface avec le module VFS et le Process Manager

Pour plus d'information sur la pile rseau, veuillez vous reportez au document "Etude dtaill de la pile rseau sous Linux".

93

interne Groupe France Tlcom

SCI (System Call Interface)

94

interne Groupe France Tlcom

API des primitives systme

Les primitives systmes du noyau son accessible via une API POSIX L'appel ces fonctions se faisant via la librairie C standard

95

interne Groupe France Tlcom

4 METHODOLOGIES DE DEVELOPPEMENT

Pourquoi une mthodologie ? Mthodologie 1 : travail en local D/chargement de modules

Mthodologie 2 : travail avec un second noyau via UML


Mthodologie 3 : simulation via un simulateur Mthodologie 4 : via un second systme

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Pourquoi une mthodologie ?

Le noyau GNU Linux est le cur du systme d'exploitation. Travailler directement au cur du noyau peut le rendre instable et engendrer un KERNEL PANIC, le rendant donc inutilisable Avant toute installation d'un nouveau noyau Il est conseill d'en avoir un autre de rfrence enregistr au niveau du BOOT loader connu pour ne pas poser de problme lors du dmarrage. Dvelopper et surtout tester un nouveau noyau Linux s'accompagne souvent d'un Ensemble de mthodes trs utiles.

Un kernel panic du noyau GNU linux

97

interne Groupe France Tlcom

Mthodologie 1: travail en local

But : cela revient travailler en local sur un driver et le (d)charger manuellement sur le noyau en courant. Avantage : facile mettre en place et utiliser. Inconvnient : si le noyau devient instable, il peut tre ncessaire de rebooter. A prconiser pour de petit drivers mais dconseiller vivement pour des drivers complexe (rseau ou vfs par exmple). C'est envisageable pour des modules mais s'il est ncessaire de modifier le cur de mme du noyau alors cette technique est viter.

Debug / traces : sudo tail -f /proc/kmsg sudo tail -f /var/log/messages dmesg [ -c ] [ -n niveau ] [ -s taille ] syslogd

Pour information, le chargement d'un driver dans le noyau en dynamique revient au chargement d'une librairie dynamique. Il y a fusion des symboles du modules avec ceux du noyau.

98

interne Groupe France Tlcom

(D)chargement de drivers Dans le listing suivant, snd_pcm_oss n'as pas de


Exemple de listing des modules chargs : $ lsmod () snd_pcm_oss snd_mixer_oss () dpendances mais par contre snd_mixer_oss a le module snd_pcm_oss comme dpendance ce qui veut dire qu'il est possible de charger le module snd_pcm_oss de faon unitaire et directement alors que le module snd_mixer_oss ncessitera que le module snd_pcm_oss soit charg au pralable. Pour info lsmod met en forme les informations gnrs dans /proc/modules : OK : OK si snd_pcm_oss dj charg sinon NOK : OK : OK chargera snd_pcm_oss si pas charg

40384 0 16096 2 snd_pcm_oss

En rsum : insmod snd_pcm_oss insmod snd_mixer_oss modprobe snd_pcm_oss modprobe snd_mixer_oss

Le raisonnement est le mme pour le dchargement. Seule les commandes changent. rmmod <modulename> remplace insmod et modprobe r <modulename> remplace modprobe. Modprobe r, dchargera aussi les autres modules dpendant si non utiliss. modinfo <modulename> donne les informations sur un module comme l'auteur, sa licence, ses paramtres, etc sudo depmod : permet de recrer le cache de la liste des modules (mcanisme similaire ldconfig). A noter qu'il est possible de rajouter le nom des modules charger lors d'un boot dans le fichier de configuration /etc/modules.
99

interne Groupe France Tlcom

(D)chargement de drivers
insmod ou modprobe Lors du chargement dynamique d'un module, cela se passe comme pour le chargement d'une librairie dynamique c'est--dire que le module est link au noyau. Les symboles (primitives) du module sont rajout et peuvent tre utiliss dans d'autres modules ou dans le noyau lui-mme.

rmmod ou modprobe -r

100

interne Groupe France Tlcom

Mthodologie 2 : travail avec un second noyau via UML User Mode Linux ou UML est un noyau Linux compil qui peut tre excut dans
l'espace utilisateur comme un simple programme. Il permet donc d'avoir plusieurs systmes d'exploitation virtuels (principe de virtualisation) sur une seule machine physique hte excutant Linux. Avantages : Si un User Mode Linux plante, le systme hte n'est pas affect. Un utilisateur sera root sur un User Mode Linux, mais pas sur le systme hte. Au niveau dveloppement, gdb peut servir dbuguer le noyau de dev puisqu'il est considr comme un processus normal. Il permet aussi de tester diffrents paramtres noyaux sans se soucier des consquences. Il permet de tester diffrentes configurations ou compilations du noyau sans avoir l'installer et redmarrer la machine. Il permet de mettre en place un rseau compltement virtuel de machines Linux, pouvant communiquer entre elles. Les tests de topologies lourdes d'un point de vue physique peuvent donc tre mens aisment ici. Inconvnients : Trs lent, plutt conu pour des tests fonctionnels que pour la performance Ncessite de patcher le noyau

Noyau GNU Linux courant


UML

Noyau exprimental

http://user-mode-linux.sourceforge.net/ ESPACE UTILISATEUR http://www.rstack.org/oudot/20022003/7/7_rapport.pdf Diagramme d'une architecture UML http://www.ibm.com/developerworks/edu/l-dw-linuxuml-i.html http://www.metz.supelec.fr/metz/personnel/galtier/PagesPerso/TutorielUML/UML_avec_briques_existantes/index.html
101

interne Groupe France Tlcom

Kernel Mode Linux (KML)


Cette technique rciproque de UML, permet d'excuter dans le noyau un processus habituellement prvu pour l'espace user. Tout comme pour UML, cela ncessite de patcher le noyau et d'activer la fonctionnalit lors de la Compilation du noyau. Les architectures supportes sont : IA-32 et AMD64. Actuellement, les binaires ne peuvent pas modifier les registres suivants : CS, DS, SS or FS. Ce systme peut tre cependant intressant de faon diminuer la latence :
Latency of System Calls (Unit: CPU cycles) : Original Linux (using sysenter) Kernel Mode Linux Getpid 432 12 Gettimeofday 820 404 http://www.linuxjournal.com/article/6516 http://web.yl.is.s.u-tokyo.ac.jp/~tosh/kml/ http://web.yl.is.s.u-tokyo.ac.jp/~tosh/kml/tosh_master_kml_e.ps http://en.wikipedia.org/wiki/Linux_kernel http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/Kernel-HOWTO.pdf
102

interne Groupe France Tlcom

Mthodologie 3 : simulation via un simulateur


Plusieurs architectures existent : QEMU, VMWARE, BOCHS, VirtualBox et bien d'autres permettent de gnrer une Image bootable permettant d'avoir un systme d'exploitation l'intrieur d'un autre. C'est une autre forme de virtualisation qui peut garantir une scurit au niveau du systme en cours de dveloppement. Avantages : Trs pratique pour des dveloppment sur le noyau mme. Pas besoin de patcher le noyau comme avec UML. Inconvnients : Dpend de la puissance de la machine hte. Peut ncessiter de rgnrer l'image chaque fois que l'on souhaite la tester.
# Cration du rootfs mkdir iso # Cration de l'image ISO mkisofs -o rootfs-dev.iso -J -R ./iso # Cela peut tre une recopie d'un mdia dd if=/dev/dvd of=dvd.iso # for dvd dd if=/dev/cdrom of=cd.iso # for cdrom dd if=/dev/scd0 of=cd.iso # if cdrom is scsi # Simulation qemu -boot d -cdrom ./rootfs-dev.iso

# Montage http://fabrice.bellard.free.fr/qemu/ sudo modprobe loop http://www.vmware.com/fr/ sudo mount -o loop rootfs-dev.iso /mnt/disk http://www.virtualbox.org/ http://packages.debian.org/mkinitrd-cdhttp://packages.debian.org/sid/mkinitrd-cd # Dmontage http://www.mayrhofer.eu.org/mkinitrd-cd sudo umount mnt/disk http://bochs.sourceforge.net/

103

interne Groupe France Tlcom

Mthodologie 4 : via un second systme


De loin la technique la plus adapte car permet de dvelopper au coeur du noyau ou bien des modules complexes. Cette technique est de plus adapte pour un ussage embarqu. Avantages : Trs pratique pour des dveloppement sur le noyau mme. Permet de dbuguer (via le patch kdb et l'utilitaire kgdb) via la liaison srie ou le rseau le noyau courant du second systme en pouvant poser un point d'arrt. Inconvnients : Ncessite de disposer d'une seconde machine.
Activation de KDB sur le systme de dev : echo "1" >/proc/sys/kernel/kdb http://kgdb.linsyssoft.com/ http://www.mulix.org/lectures/kernel_oopsing/kernel_oopsing.pdf http://www.alcove.com/IMG/pdf/kernel_debugging.pdf http://www.ibm.com/developerworks/linux/library/l-kdbug/ http://www.ibm.com/developerworks/linux/library/l-debug/ Liaison srie Liaison ethernet

Poste servant aux dveloppements

seconde plateforme de dveloppement

104

interne Groupe France Tlcom

En remplacement d'un port srie de dbug


Sur la plate-forme de dveloppement:

Pas de problme. Vous pouvez utiliser un convertisseur USB<-> srie. Bien support par Linux. Ce priphrique apparat en tant que /dev/ttyUSB0. Vrifiez si vous avez un port IrDA. C'est aussi un port srie. Si vous avez une interface Ethernet, essayez de l'utiliser.
Vous pouvez aussi connecter en JTAG directement les broches srie du processeur (vrifiez d'abord les spcifications lectriques!)
http://www.jtag.com/?gclid=CJrAjLLT7pICFQgNuwodQBgD4w http://www.linux-mips.org/wiki/JTAG http://www.coreboot.org/JTAG/BSDL_Guide http://www.intel.com/design/flcomp/applnots/29218602.PDF http://packages.debian.org/testing/embedded/openwince-jtag http://wiki.openwrt.org/OpenWrtDocs/Customizing/Hardware/JTAG_Cable http://irda.sourceforge.net/ http://www.ibiblio.org/pub/Linux/docs/howto/translations/fr/pdf/Infrared-HOWTO.pdf http://www.hpl.hp.com/personal/Jean_Tourrilhes/IrDA/ http://www.linux-usb.org/

Sur la cible:

105

interne Groupe France Tlcom

5 DEVELOPPEMENT DANS LE NOYAU

Structure de l'arborescence des sources du noyau Linux


Ajout d'un nouveau rpertoire dans le noyau Signaler un bogue Dveloppement de modules Kthreads : pthread versus kernel Synchronisation Debugging

Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux

Structure des sources Linux


arch/ COPYING CREDITS crypto/ Documentation/ oublier! drivers/ etc.) fs/ include/ include/asm<arch> include/linux init/ ipc/ processus
107

Code dpendant de l'architecture Conditions de copie de Linux (GNU GPL) Contributeurs principaux de Linux Bibliothques de cryptographie Documentation du noyau. A ne pas Pilotes de priphriques (drivers/usb/, Systmes de fichier (fs/ext3/, etc.) Enttes du noyau Enttes dpendant de l'architecture Enttes du coeur du noyau Linux Initialisation de Linux (contient main.c) Code utilis pour la communication entre

interne Groupe France Tlcom

Structure des sources Linux (suite)


kernel/ lib/ MAINTAINERS utile ! Makefile mm/ galement !) net/ README REPORTINGBUGS scripts/ security/
(selinux...)

Coeur du noyau Linux (trs petit!) Bibliothques diverses (zlib, crc32...) Responsables de parties du noyau. Trs Makefile principal (dfinit arch et version) Code de la gestion mmoire (petit Support rseau (pas les pilotes) Introduction et instructions de compilation Instructions pour le rapport de bogues Scripts utiliss en interne ou en externe
Implmentations du modle de scurit

sound/ usr/ initramfs_data.S


108

Support du son et pilotes Utilitaires: gen_init_cpio et

interne Groupe France Tlcom

Nouveau rpertoire dans le noyau


Pour ajouter un rpertoire openstb_drivers/ aux sources du noyau:

Dplacer le rpertoire openstb_drivers/ l'endroit appropri dans les sources du noyau Crer un fichier openstb_driver/Kconfig Crer un fichier openstb_driver/Makefile bas sur les variables Kconfig Dans le fichier Kconfig du rpertoire parent, ajouter: source openstb_driver/Kconfig Dans le fichier Makefile du rpertoire parent, ajouter: obj-$(CONFIG_OPENSTB) += openstb_driver/ (juste 1 condition) or obj-y += openstb_driver/ (plusieurs conditions) Lancer make xconfig et utiliser vos nouvelles options ! Lancer make et vos nouveaux fichiers sont compils ! Regardez Documentation/kbuild/*.txt pour plus de dtails

109

interne Groupe France Tlcom

Signaler des bogues dans le noyau Linux

Premirement, assurez vous d'utiliser la dernire version Assurez vous d'avoir creus le problme autant que possible: voir
Documentation/BUGHUNTING

Assurez vous que le bogue n'a pas encore t signal. Vrifiez en


particulier la base de donne officielle des bogues Linux( http://bugzilla.kernel.org/).

Si le sous-systme pour lequel vous reportez un bogue a une liste de


diffusion, utiliser la. Sinon, contactez le mainteneur officiel (voir le fichier MAINTAINERS). Donnez toujours le plus de dtails possible.

Ou remplissez un nouveau bogue dans


http://bugzilla.kernel.org/

110

interne Groupe France Tlcom

Dveloppement de modules noyau


Les modules: ajoutent une fonctionnalit donne au noyau (pilotes, support systme de fichier, etc...) ; Ils sont (d)chargs tout moment, quand leur fonctionnalit est requise (ou plus). Une fois chargs, ils ont accs tout le noyau. Aucune protection particulire ; Ils sont utiles pour garder une image du noyau une taille minimum (essentiel pour les distributions GNU/Linux pour PCs) ; Ils permettent de supporter l'incompatibilit entre pilotes (on charge soit l'un ou soit l'autre, mais pas les 2) ; Ils permettent de fournir des pilotes binaires (mauvaise ide), utilisables sans avoir recompiler le noyau ; Ils permettent de dvelopper des pilotes sans redmarrer: chargement, test, dchargement, recompilation, chargement ; Ils peuvent aussi tre compils statiquement dans le noyau.

111

interne Groupe France Tlcom

Type de drivers 1 : pilotes de caractres



Communication grce un flux squentiel de caractres individuels Les pilotes caractre peuvent tre identifis par leur type c (ls -l): crw-rw---- 1 root uucp 4, 64 Feb 23 2004 /dev/ttyS0 crw--w---- 1 jdoe tty 136, 1 Sep 13 06:51 /dev/pts/1 crw------- 1 root root 13, 32 Feb 23 2004 /dev/input/mouse0 crw-rw-rw- 1 root root 1, 3 Feb 23 2004 /dev/null

Exemples: clavier, souris, port parallle, IrDA, Bluetooth, consoles, terminaux.

Dfinir vos oprations sur fichier (fops) Dfinir votre fonction d'init. du module et appeler register_chrdev(): Donner un numro majeur, ou 0 (automatique) Donner vos fops Dfinir la fonction de sortie du module, et y appeler la fonction unregister_chrdev() Charger votre module Trouver le numro majeur (si ncessaire) et crer l'entre dans /dev/ Utiliser le pilote !!
http://pficheux.free.fr/articles/lmf/drivers/ http://broux.developpez.com/articles/c/driver-c-linux/ http://ftp.traduc.org/doc-vf/gazette-linux/html/2006/122/lg122-D.html

112

interne Groupe France Tlcom

Type de drivers 2 : pilotes de blocs

Accs par blocs de donnes de taille fixe. On peut accder aux


blocs dans n'importe quel ordre.

Les pilotes blocs peuvent tre identifis par leur type b (lsl) :
brwrw1rootdisk3,1Feb232004/dev/hda1 brwrw1jdoefloppy2,0Feb232004fd0 brwrw1rootdisk7,0Feb232004loop0 brwrw1rootdisk1,1Feb232004ram1 brw1rootroot8,1Feb232004sda1

Exemples: disques durs, disques mmoires, priphriques de


loopback (images de systmes de fichiers)...

113

interne Groupe France Tlcom

Autres types de pilotes


Ils n'ont aucune entre correspondante dans /dev dans laquelle vous pouvez lire ou crire avec une commande Unix standard :

Les pilotes rseaux Ils sont reprsents par un priphrique rseau comme ppp0, eth1, usbnet, irda0 (liste: ifconfiga) Les autres pilotes Souvent, ce sont des pilotes intermdiaires servant d'interface avec d'autres.

114

interne Groupe France Tlcom

Exemple de drivers
#include <linux/kernel.h> #include <linux/module.h> #include <linux/proc_fs.h> /* printk level /* kernel version, ... /* all the proc stuff /* For current */ */ */ */

Exemple de module affichant l'quivalent d'une commande ifconfig Dpendance avec d'autres modules : aucun Chargement : sudo insmod modnet Dchargement : Sudo insmod modnet

#include <linux/sched.h> #include <linux/tty.h> #include <linux/fs.h> #include <linux/errno.h>

/* For the tty declarations */

/* Main data for the driver */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("FT R&D"); MODULE_DESCRIPTION("Embedded ifconfig for the LiveBox");

/* Global definition */ #define PROC_NAME_ENTRY "ifconfig"

#define FLAGS_PROC_ENTRY S_IFREG|S_IWUSR

/* Global variables */ extern struct net_device *dev_get_by_index(int idx); struct proc_dir_entry *proc_ifcfg;

115

interne Groupe France Tlcom

(Suite)
int init_module(void) { printk("LiveBox SDK - embedded ifconfig"); proc_ifcfg = create_proc_entry(PROC_NAME_ENTRY, FLAGS_PROC_ENTRY, &proc_root); proc_ifcfg->read_proc = list_netdev; printk("Module 'modnet' well loaded and ready to use."); printf("For reading the data : cat /proc/ifconfig");

printk("For unloading the module : rmmod modnet"); return(0); }

/* Dchargement du module */ void cleanup_module(void) { remove_proc_entry(PROC_NAME_ENTRY, &proc_root); printk("Module 'modnet' unloaded."); }

/* END */

116

interne Groupe France Tlcom

Exemple d'architecture de drivers tty

117

interne Groupe France Tlcom

Exemple de module hello world


/* helloworld.c */ #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");

http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf

http://www.tldp.org/LDP/lki/lki.pdf http://www.tldp.org/LDP/lpg/index.html http://www.tldp.org/LDP/khg/HyperNews/get/khg.html http://tldp.org/LDP/lkmpg/2.6/html/index.html.org/LDP/tlk/tlk.html http://tldp.org/LDP/lkmpg/2.4/html/index.html


118

interne Groupe France Tlcom

De/Chargement et excution du module

Chargement dans le noyau :


insmod helloworld modprobe helloworld

Rsultat au chargement :
Hello, world

Dchargement du noyau :
rmmod helloworld modprobe r helloworld

Rsultat au dchargement :
Goodbye, cruel world

119

interne Groupe France Tlcom

Compiler un module

Le Makefile ci-dessous est rutilisable pour tout module Linux


2.6.

Lancez juste make pour construire le fichier hello.ko Attention: assurez vous qu'il y ait une [Tabulation] au dbut de
la ligne $(MAKE) (syntaxe requise par make)
#Makefileforthehellomodule objm:=hello.o KDIR:=/lib/modules/$(shellunamer)/build PWD:=$(shellpwd) default: $(MAKE)C$(KDIR)SUBDIRS=$(PWD)modules

Tabulation (pas d'espaces)

Il est noter que les modules sont seulement compils et pas links. Le linkage s'effectuant lors du chargement du drivers dans le noyau Linux. Anciennement (en 2.4), l'extension des modules taient .o alors qu'en 2.6 c'est Dsormais .ko
120

interne Groupe France Tlcom

Le module hello avec des paramtres


/* hello_param.c */ #include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> MODULE_LICENSE("GPL"); static char *whom = "world"; module_param(whom, charp, 0); static int howmany = 1; module_param(howmany, int, 0); static int hello_init(void) { int i; for (i = 0; i < howmany; i++) printk(KERN_ALERT "(%d) Hello, %s\n", i, whom); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel %s\n", whom); } module_init(hello_init); module_exit(hello_exit);

Second exemple de module avec passage d'un paramtre. Le dtail de ce paramtre apparaitra via la commande modinfo.

121

interne Groupe France Tlcom

Utiliser le module hello_param



Charger le module. Par exemple : insmod ./hello_param.ko howmany=2 whom=universe Vous verrez cela dans /var/log/messages: Sep 13 23:04:30 localhost kernel: (0) Hello, universe Sep 13 23:04:30 localhost kernel: (1) Hello, universe

Dcharger le module: rmmod hello_param Vous verrez : Sep 13 23:04:38 localhost kernel: Goodbye, cruel universe Dclarer des paramtres de module :

module_param(nom, type, perm); nom: nom du paramtre type: soit byte, short, ushort, int, uint, long, ulong, charp, bool ou invbool (vrifi la compilation !) perm: permissions pour l'entre correspondante dans /sys/module/<module_name>/<param>. On peut utiliser 0. module_param_named(nom, valeur, type, perm); Rend la variable nom disponible l'extrieur du module et lui affecte valeur l'intrieur. module_param_string(nom, chaine, taille, perm); Cre une variable nom de type charp, pr-remplie avec la chane de longueur taille, typiquement sizeof(string) module_param_array(name, type, num, perm); Pour dclarer un tableau de paramtres

122

interne Groupe France Tlcom

Cration des fichiers de priphriques


Les fichiers de priphriques ne sont pas crs (par dfaut) lorsqu'un pilote est charg. Ils doivent tre crs par avance: mknod /dev/<device> [c|b] <major> <minor> Exemples: mknod /dev/ttyS0 c 4 64 mknod /dev/hda1 b 3 1

Nombres majeurs et nombres mineurs


Comme vous pouvez le voir dans l'exemple prcdent, les priphriques ont 2 numros qui leurs sont associs:

Premier numro: nombre majeur Associ de manire unique chaque pilote Second numro: nombre mineur Associ de manire unique chaque priphrique / entre dans /dev

Pour trouver quel pilote correspond un priphrique, regardez Documentation/devices.txt

123

interne Groupe France Tlcom

Enregistrement des priphriques

Tout d'abord il faut crer l'(les)entre(s) correspondante(s) dans /dev Initialisation du pilote: enregistrement avec un numro majeur Enregistrement (linux/fs.h)
int register_chrdev( unsigned it major, const char *name, struct file_operations *fops);

Si le paramtre major est gal zro, alors son enregistrement est automatique (appel alloc_chrdev_region).

Libration du priphrique
int unregister_chrdev( unsigned it major, const char *name);

Si ces fonctions chouent, elles retournent une valeur strictement < 0.

124

interne Groupe France Tlcom

Priphriques enregistrs

Les priphriques enregistrs sont visibles dans /proc/devices avec leur numro majeur et leur nom:
Blockdevices: 1ramdisk 3ide0 8sd 9md 22ide1 65sd 66sd 67sd 68sd 69sd ...

Characterdevices: 1mem 4/dev/vc/0 4tty 4ttyS 5/dev/tty 5/dev/console 5/dev/ptmx 6lp 7vcs 10misc 13input 14sound ...

125

interne Groupe France Tlcom

Trouver un numro majeur libre

De moins en moins de numros majeurs sont disponibles Il n'est pas recommand d'en prendre un arbitrairement, car il peut rentrer
en conflit avec un autre pilote (standard ou spcifique)

Solution: laisser register_chrdev en trouver un libre dynamiquement pour


vous ! major=register_chrdev(0,"foo",&name_fops);

Problme: vous ne pouvez pas crer d'entres /dev par avance !


Exemple de script de chargement de module (se sert de /proc/devices):
module=foo; device=foo insmod $module.ko major=`awk "\\$2==\"$module\" {print \\$1}" /proc/devices` mknod /dev/foo0 c $major 0

126

interne Groupe France Tlcom

La structure device
Dclaration :

La structure de donne de base est struct device, dfinie dans include/linux/device.h En pratique, vous utiliserez plutt une structure correspondant au bus auquel votre priphrique est attach: struct pci_dev, struct usb_device...

Enregistrement

Dpend toujours du type de priphrique, des fonctions spcifiques (de)d'(ds)enregistrement sont fournies

Rfrences pour le Device Model


La documentation dans les sources du noyau est trs utile et trs claire !

Documentation/driver-model/ binding.txt class.txt driver.txt overview.txt device.txt interface.txt platform.txt porting.txt bus.txt

Documentation/filesystems/sysfs.txt

127

interne Groupe France Tlcom

Attributs de priphriques
Les attributs du priphriques peuvent tre lus/crits depuis l'espace utilisateur :
struct device_attribute { struct attribute attr; ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off); ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off); }; #define DEVICE_ATTR(name,mode,show,store) Ajouter / enlever un fichier : int device_create_file(struct device *device, struct device_attribute * entry); void device_remove_file(struct device * dev, struct device_attribute * attr);

Exemple :
/* Cr un fichier nomm "power" avec un mode 0644 (-rw-r--r--) */ DEVICE_ATTR(power,0644,show_power,store_power); device_create_file(dev,&dev_attr_power); device_remove_file(dev,&dev_attr_power);

128

interne Groupe France Tlcom

La structure device_driver
Dclaration
structdevice_driver { /*Omittedafewinternals*/ char *name; structbus_type *bus; int(*probe) (structdevice*dev); int(*remove) (structdevice*dev); void(*shutdown)(structdevice*dev); int(*suspend)(structdevice*dev,u32state,u32level); int(*resume) (structdevice*dev,u32level); };

Enregistrement
externintdriver_register(structdevice_driver*drv); externvoiddriver_unregister(structdevice_driver*drv);

Attributs
Disponibles de la mme manire

129

interne Groupe France Tlcom

License des modules


La liste des licences est dtaille dans include/linux/module.h :

GPL
GNU Public License v2 ou suprieure

Dual BSD/GPL Choix entre GNU Public License v2 et BSD Dual MPL/GPL Choix entre GNU Public License v2 et Mozilla Propritaire Produits non libres

GPL v2 GNU Public License v2 GPL and additional rights

Utilit des licences de module

Utilises par les dveloppeurs du noyau pour identifier des problmes venant de pilotes propritaires, qu'ils n'essaierons pas de rsoudre Permettent aux utilisateurs de vrifier que leur systme est 100% libre Permettent aux distributeurs GNU/Linux de vrifier la conformit leur politique de licence

130

interne Groupe France Tlcom

Rgles de codage des modules

Includes C: vous ne pouvez pas utiliser les fonctions de la bibliothque C standard (printf(), strcat(), etc.). La bibliothque C est implmente au dessus du noyau et non l'inverse. Linux a quelques fonctions C utiles comme printk(), qui possde une interface similaire printf(). Donc, seul les fichiers d'enttes du noyau sont autoriss. N'utilisez jamais de nombres virgule flottante dans le code du noyau. Votre code peut tre excuter sur un processeur sans unit de calcul virgule flottante (comme sur ARM). L'mulation par le noyau est possible mais trs lente. Dfinissez tous vos symboles en local/statique, hormis ceux qui sont exports (afin d'viter la pollution de l'espace de nommage). Consultez: Documentation/CodingStyle. Il est toujours bon de connatre, voir d'appliquer, les rgles de codage GNU: http://www.gnu.org/prep/standards.html

131

interne Groupe France Tlcom

Portabilit des drivers d'une architecture une autre Dfinit dans linux/types.h Pour des variable pouvant tre visible du userspace
(ex: ioctl) il est ncessaire d'utiliser cette notation : Dfinition des types gnriques interne au noyau :
u8 unsigned byte (8 bits) u16 unsigned word (16 bits) u32 unsigned 32-bit value u64 unsigned 64-bit value s8 signed byte (8 bits) s16 signed word (16 bits) s32 signed 32-bit value s64 signed 64-bit value

__u8 unsigned byte (8 bits) __u16 unsigned word (16 bits) __u32 unsigned 32-bit value __u64 unsigned 64-bit value __s8 signed byte (8 bits) __s16 signed word (16 bits) __s32 signed 32-bit value __s64 signed 64-bit value

Exemple d'utilisation, lors de l'envoie d'un Message de contrle un device USB :


struct usbdevfs_ctrltransfer { __u8 requesttype; __u8 request; __u16 value; __u16 index; __u16 length; __u32 timeout; /* in milliseconds */ void *data; }; #define USBDEVFS_CONTROL_IOWR('U', 0, struct usbdevfs_ctrltransfer)
interne Groupe France Tlcom

Exemple de fonction issue du bus i2c :


s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value); s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command); s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value);
132

http://www.xml.com/ldd/chapter/book/ch10.html

Passer des paramtres aux modules

Avec insmod ou modprobe: Avec modprobe en changeant le fichier /etc/modprobe.conf: Avec la ligne de commande du noyau, lorsque le module est li statiquement au noyau:

insmod./hello_param.kohowmany=2whom=universe

optionshello_paramhowmany=2whom=universe

optionshello_param.howmany=2\ hello_param.whom=universe

133

interne Groupe France Tlcom

Dpendances de modules

Les dpendances des modules n'ont pas tre

spcifies explicitement par le crateur du module. compilation du noyau, grce aux symboles exports par le module: module2 dpend de module1 si module2 utilise un symbole export par module1. /lib/modules/<version>/modules.dep

Elles sont dduites automatiquement lors de la

Les dpendances des modules sont stockes dans: Ce fichier est mis jour (en tant que root) avec:
depmoda[<version>]

134

interne Groupe France Tlcom

Kthreads : pthread versus kernel

135

interne Groupe France Tlcom

Kthreads

start_kthread Cre un kthread dans le noyau (quivalent de pthread_create). Peut tre appel depuis n'importe quel contexte mais pas par une interruption. stop_kthread Arrte un kthread. Peut tre appele depuis n'importe quel contexte mais pas depuis le kthread lui-mme. La fonction est blocante. init_kthread Configure l'environnement pour un nouveau kthread. Cette fonction peut tre appele en dehors d'un kthread. exit_kthread ncessite d'tre appel par thread lui-mme la fin de son excution

http://lemmestart.blogspot.com/2007/05/linux-kernel-threads-in-device-drivers_14.html http://kernelnewbies.org/Simple_UDP_Server http://www.freeos.com/articles/4051/ http://www.freesoftwaremagazine.com/articles/drivers_linux http://www.scs.ch/~frey/linux/kernelthreads.html http://kernelnewbies.org/Simple_UDP_Server


136

interne Groupe France Tlcom

Synchronisation

137

interne Groupe France Tlcom

Mthodes de synchronisation
Il existe plusieurs mthodes de synchronisation adapts au noyau linux:

Smaphore : se met en standby tant que le smaphore n'est pas libr (<include/asm/semaphore.h>)
struct semaphore mr_sem; sema_init(&mr_sem, 1); /* usage count is 1 */ if (down_interruptible(&mr_sem)) /* semaphore not acquired; received a signal ... */ /* critical region (semaphore acquired) ... */ up(&mr_sem);

Mutex : verrou utilis pour les accs concurrents. Verrou Read-Write : <include/asm/spinlock.h>) :
br_read_lock(BR_MR_LOCK); /* critical region (read only) ... */ br_read_unlock(BR_MR_LOCK);

Spin lock : boucle tant que le spin n'est pas libr (<include/asm/spinlock.h>) :
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; unsigned long flags; spin_lock_irqsave(&mr_lock, flags); /* critical section ... */ spin_unlock_irqrestore(&mr_lock, flags); lock_kernel(); /* critical region ... */ unlock_kernel();

http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html
138

interne Groupe France Tlcom

Dbugging

139

interne Groupe France Tlcom

Dboguer avec printk

Technique universelle de dbogage car facile utiliser. Affich ou non dans la console ou /var/log/messages suivant
la priorit :
$ dmesg $ tail f /var/log/messages

Priorits disponibles (include/linux/kernel.h):


#defineKERN_EMERG"<0>"/*systmeinutilisable*/ #defineKERN_ALERT"<1>"/*uneactiondoittreprisedesuite*/ #defineKERN_CRIT"<2>"/*conditionscritiques*/ #defineKERN_ERR"<3>"/*conditionsd'erreur*/ #defineKERN_WARNING"<4>"/*conditionsdewarning*/ #defineKERN_NOTICE"<5>"/*conditionnormalemaissignificative*/ #defineKERN_INFO"<6>"/*information*/ #defineKERN_DEBUG"<7>"/*messagesdedbogage*/

http://ltp.sourceforge.net/documentation/technical_papers/UsingCodeCoverage.pdf

140

interne Groupe France Tlcom

ksymoops

Aide dcrypter les messages oops, en convertissant les adresses et le code en informations utiles Facile utiliser: copiez/collez juste le texte oops dans un fichier Exemple d'une ligne de commande:

ksymoopsnoksymsmSystem.mapvvmlinux oops.txt

Regardez Documentation/oopstracing.txt et man ksymoops pour plus de dtails.

La table des symboles peut tre consulte dans le pseudo-systme de fichiers : /proc/ksyms (Linux 2.4) ou bien /proc/kallsyms (Linux 2.6). http://tldp.org/HOWTO/ModuleHOWTO/index.html
141

interne Groupe France Tlcom

Dboguer avec Kprobes d'IBM

Moyen simple d'insrer des points d'arrt dans les routines du noyau Contrairement au dbogage avec printk, vous n'avez pas besoin

de recompiler ni de redmarrer votre noyau. Vous avez juste besoin de compiler et charger un module ddi pour dclarer l'adresse de la routine que vous voulez tester. de globales.

Non disruptif, bas sur le gestionnaire d'interruption du noyau Kprobes permet mme de modifier des registres et des structures
donnes
Voir http://www-106.ibm.com/developerworks/library/l-kprobes.html pour une prsentation plus complte.

142

interne Groupe France Tlcom

Astuce de dbogage du noyau

Si votre noyau ne dmarre pas encore, il est recommand d'activer le Low Level debugging (dans la section Kernel Hacking des options du noyau, valable uniquement sur ARM)

CONFIG_DEBUG_LL=y

Codes d'erreur de Linux


Essayez de reporter les erreurs avec des numros aussi prcis que possible ! Heureusement, les noms de macros sont explicites et vous pouvez vous en rappeler rapidement.
Codes

d'erreur gnriques: include/asm-generic/errno-base.h


Codes

d'erreur spcifiques une plate-forme: include/asm/errno.h

143

interne Groupe France Tlcom

6 INTERRUPTIONS

Les interruptions, pour quoi faire ? Enregistrer un gestionnaire d'interruption Quand enregistrer le gestionnaire Dtection du canal d'interruption Le travail du gestionnaire d'interruption Prototype d'un gestionnaire d'interruption Traitement parties haute et basse Rsum

144

interne Groupe France Tlcom

Les interruptions, pour quoi faire ?

Les interruptions internes au processeur sont par exemple utilises pour l'ordonnancement, ncessaire au multi-tche.

Les interruptions externes sont utiles car la plupart des priphriques internes ou externes sont plus lents que le processeur. Dans ce cas, mieux vaut ne pas laisser le processeur en attente active sur des donnes. Lorsque le priphrique est nouveau prs, il envoie une interruption pour demander l'attention du processeur.

145

interne Groupe France Tlcom

Enregistrer un gestionnaire d'interruption


Dfini dans include/linux/interrupt.h
int request_irq( unsigned int irq, /* canal irq demand */ irqreturn_t (*handler) (int, void *, struct pt_regs *), /* gestionnaire d'inter. */ unsigned long irq_flags, /* masque d'options */ const char* devname, /* nom enregistr */ void* dev_id) /* utilis lorsque l'irq est partage */ void free_irq( unsigned int irq, void *dev_id);

Bits pouvant tre dfinis dans irq_flags (combinables)

SA_INTERRUPT
Gestionnaire d'interruption "rapide". Fonctionne avec les interruptions dsactives. Utilit limite des cas spcifiques (tels que les interruptions timer).

SA_SHIRQ Le canal d'interruption peut tre partag par plusieurs priphriques. SA_SAMPLE_RANDOM Les interruptions peuvent tre utilises pour contribuer l'entropie du systme (/dev/random et /dev/urandom), afin de gnrer de bons nombres alatoires. Ne l'utilisez pas si votre priphrique a un comportement prdictif !

146

interne Groupe France Tlcom

Quand enregistrer le gestionnaire


Soit l'initialisation du pilote : consomme beaucoup de canaux IRQ ! Ou bien l'ouverture du fichier de priphriques: permet de sauver des canaux IRQ libres. Besoin de compter le nombre de fois o le priphrique est ouvert, pour tre capable de librer les canaux IRQ lorsque le priphrique n'est plus utilis. Information sur les gestionnaires installs :
/proc/interrupts 0: 1: 2: 3: 7: 8: 9: 11: 12: 14: 15: NMI: ERR: 5616905 9828 0 1014243 184 1 2 566583 5466 121043 200888 0 0 CPU0 XT-PIC timer # Nom enregistr XT-PIC i8042 XT-PIC cascade XT-PIC orinoco_cs XT-PIC Intel 82801DB-ICH4 XT-PIC rtc XT-PIC acpi XT-PIC ehci_hcd, uhci_hcd,... XT-PIC i8042 XT-PIC ide0 XT-PIC ide1 # Interruptions non masquables

Nombre total d'interruptions :

cat/proc/stat|grepintr intr819076760929671037701102775520196... Nombre total d'interruptions Total IRQ1 IRQ2 IRQ3 ...
interne Groupe France Tlcom

147

Dtection du canal d'interruption


Certains priphriques annoncent leur canal IRQ dans un registre. Certains priphriques ont toujours le mme comportement: vous pouvez dduire leur canal IRQ. Dtection manuelle :

Enregistrez votre gestionnaire d'inter. pour tous les canaux possibles Demander une interruption Dans le gestionnaire appel, enregistrer le numro d'IRQ dans une variable globale Ressayez si aucune interruption n'a t reue Dsenregistrez les gestionnaires non utiliss

Outils de dtection du noyau :


mask = probe_irq_on(); Activez les interruptions sur le priphrique Dsactivez les interruptions sur le priphrique irq = probe_irq_off(mask);

> 0: numro d'IRQ unique trouv = 0: pas d'interruption. Essayez nouveau ! < 0: plusieurs interruptions reues. Essayez nouveau !

148

interne Groupe France Tlcom

Le travail du gestionnaire d'interruption


Acquitter l'interruption au priphrique (sinon plus aucune autre interruption ne sera gnre) Lire/crire des donne du/sur le priphrique Rveiller tout processus attendant la fin de l'opration de lecture/criture: wake_up_interruptible(&module_queue);

Contraintes du gestionnaire d'interruptions :

Ne s'excute pas dans le contexte utilisateur: Ne peut pas transfrer des donns de ou vers l'espace utilisateur Ne peut pas excuter d'actions pouvant s'endormir: Besoin d'allouer de la mmoire avec GFP_ATOMIC Ne peut pas appeler schedule() Doit terminer son travail suffisamment rapidement: il ne peut pas bloquer les interruptions trop longtemps.

149

interne Groupe France Tlcom

Prototype d'un gestionnaire d'interruption


irqreturn_t (*handler) ( int, void *dev_id, /* Numro d'irq */ /* Pointeur utilis pour garder la trace du device correspondant. Utile quand plusieurs priphriques sont grs par le mme module */ /* snapshot des registres du cpu, rarement ncessaire */

struct pt_regs *regs );

Valeur retourne:

IRQ_HANDLED: interruption reconnue et gre IRQ_NONE: pas sur un priphrique gr par le module. Permet
de partager des canaux d'interruption et/ou de reporter de fausses interruptions au noyau.

150

interne Groupe France Tlcom

Traitement parties haute et basse

Partie haute: le gestionnaire doit se terminer le plus vite que possible. Une fois qu'il a acquitt l'interruption, il planifie le reste du travail grant les donnes et prenant du temps, pour une excution future. Partie basse: termine le reste du travail du gestionnaire. Traite les donnes, et ensuite rveille tout les processus utilisateur en attente. Implment au mieux par les tasklets. Dclarer la tasklet dans le fichier source du module:
DECLARE_TASKLET (module_tasklet, /* nom */ module_do_tasklet, /* fonction */ 0 /* donnes */ );

Planifier la tasklet dans la partie haute du gestionnaire:


tasklet_schedule(&module_do_tasklet);

151

interne Groupe France Tlcom

Rsum de la gestion des interruptions

Trouver un numro
priphrique

d'interruption (si possible)

Une fois que le gestionnaire


d'interruption est appel, acquitter l'interruption.

Activer les interruptions sur le Dtecter le numro


d'interruption utilis par le priphrique, en scrutant les diffrents possibilits, si ncessaire. d'interruption avec le numro d'IRQ identifi.

Dans le gestionnaire, planifier la


tasklet grant les donnes donnes

Dans la tasklet, grer les Dans la tasklet, rveiller les


le priphrique est ferm. processus utilisateur en attente

Enregistrer le gestionnaire

Dsenregistrer le gestionnaire si

152

interne Groupe France Tlcom

7 DIRECT MEMORY ACCESS

Caractristiques du DMA Utilisation de la DMA Exemple d'activation du DMA API gnrique DMA

153

interne Groupe France Tlcom

Caractristiques du DMA

A t cr au dpart pour rendre la gestion de l'alimentation plus simple. Va maintenant bien au del Utilis pour reprsenter l'architecture et l'tat du systme A une reprsentation dans l'espace utilisateur: sysfs Dsormais c'est l'interface prfre avec l'espace utilisateur (au lieu de /proc) Facile implmenter grce l'interface device: include/linux/device.h

Permet de voir le systme depuis diffrents points de vue :

Depuis les priphriques existant dans le systme: leur tat d'alimentation, le bus auquel ils sont attachs, et le pilote qui en est responsable. Depuis la structure du bus systme: quel bus est connect quel bus (par exemple contrleur de bus USB sur le bus PCI), les priphriques existant et ceux potentiellement accepts (avec leur pilotes) Depuis les pilotes disponibles: quels priphriques et quel types de bus sont supports. Depuis diffrentes "classes" de priphriques: "input", "net", "sound"... Priphriques existant pour chaque classe. Permet de trouver tous les priphriques d'entre sans savoir o ils sont connects physiquement.

154

interne Groupe France Tlcom

Utilisation de la DMA
Synchrone de lecture d'un pilote. Celui-ci alloue un tampon DMA et demande au matriel de copier ces donnes. Le processus est plac en veille. une interruption la fin de la copie.
Asynchrone matriel envoie une interruption pour Un processus utilisateur appelle la mthode Le annoncer de nouvelles donnes.

Le gestionnaire alloue un tampon DMA et dit au matriel o transfrer les donnes. Le matriel cris les donnes et lve une nouvelle interruption. Le gestionnaire rcupre les nouvelles donnes et rveille les processus ncessaires.

Le matriel copie les donnes et provoque Le gestionnaire rcupre les donnes du


Contraintes mmoire :
tampon et rveille le processus en attente.


155

Besoin d'utiliser de la mmoire contigu dans l'espace physique Peut utiliser n'importe quelle mmoire alloue par kmalloc ou __get_free_pages E/S bloc ou rseau: possibilit d'utiliser des tampons spcialiss, conus pour tre compatibles avec la DMA. Ne peut pas utiliser la mmoire vmalloc (il faudrait configurer la DMA pour chaque page) Utiliser la DMA ne supprime pas le besoin de barrires mmoire. Autrement, votre compilateur peut mlanger l'ordre des lectures et des critures.
interne Groupe France Tlcom

Exemple d'activation du DMA


Sur la plupart des distributions "tout-public" (mandriva, suse,...) le DMA est activ par dfaut. Le DMA permet de rduire les temps daccs au disque dur. Vrifiez auparavant que votre disque dur nutilise pas dj le DMA. Pour cela tapez la commande suivante dans la console (dans ce cas, hda correspond au premier disque dur de la premire nappe) : hdparm /dev/hda Vous obtiendrez quelquechose comme cela : /dev/hda: multcount IO_support unmaskirq using_dma keepsettings readonly readahead geometry 0

= 0 (off) = 1 (32-bit) = 1 (on) = 1 (on) = 0 (off) = 0 (off) = 256 (on) = 58140/16/63, sectors = 58605120, start = = 1 (on)

Si vous utilisez le DMA, vous obtiendez (comme ci dessus) : using_dma Ce qui signifie que le DMA est dja activ.

En outre, si vous obtenez using_dma = 0 (off), alors vous pouvez continuez cet article... :) Pour lactivez, il suffit de taper cette commande : hdparm -d1 /dev/hda Normalement, cela suffit activez le DMA.

156

interne Groupe France Tlcom

Exemple d'activation du DMA (suite)


Si vous obtenez une erreur de ce genre cest que le mode DMA nest pas compil dans le noyau : setting using_dma to 1 (on) HDIO_SET_DMA failed: Operation not permitted using_dma = 0 (off) Il va donc vous falloir procder une recompilation du noyau : CONFIG_BLK_DEV_IDEDMA=y CONFIG_IDEDMA_PCI_AUTO=y CONFIG_BLK_DEV_XXXXXX=y o XXXXXX est le chipset prsent sur votre carte mre. Recompilez donc le noyau avec les modifications que vous venez dappliquer, et redmarrez. Une fois que la machine est redmarre, tapez la commande : hdparm /dev/hda puis vrifiez que la ligne using_dma est bien a 1(on) = 1 (on)

Et voil, vous avez le DMA actif, ce qui va vous permettre davoir un systme nettement plus rapide car moins de transfert sur les bus et entre autre moins de sollicitation du CPU.

157

interne Groupe France Tlcom

API gnrique DMA

La plupart des sous-systmes fournissent leur propre API DMA. Suffisant pour la plupart des besoins. Documentation/DMA-API.txt Description de l'API DMA gnrique Linux, en parallle avec l'API PCI DMA correspondante. Un document utile montrer lors de ce cours !

Mappages DMA permanents ou de flux :

Mappages permanents (consistants) Allous pour toute la dure de chargement du module. Mappages de flux Configurs chaque transfert. Cela permet de garder libres des registres matriels pour la DMA. Certaines optimisation sont aussi disponibles.

158

interne Groupe France Tlcom

8 HOOKING DE PRIMITIVES

Ancienne technique l'ancien paradis des rootKits Table des symboles des primitives

159

interne Groupe France Tlcom

Ancienne technique l'ancien paradis des rootKits


#include <linux/syscall.h> #include <asm/unistd.h> return(1); } } } return(0); } int __init init_exportmodule (void) { if (!locate_sys_call_table()) { // Retourne une erreur } //.....sys_call_table[] fonctionne!! }

static void **sys_call_table;

extern void *system_utsname; static int locate_sys_call_table(void) { unsigned long *begin; int i; begin=(unsigned long *) &system_utsname; for (i=0;i<1024;i++) { if (*(begin+i)==(unsigned long) sys_socketcall) { sys_call_table=(void *) (begin+i-__NR_socketcall); //are you sure? if (sys_call_table[__NR_exit]==(void *) sys_exit) { printk("success: located sys_call_table: %X\n",(unsigned \ int) sys_call_table);

La technique consiste rechercher la table des symboles de faon pouvoir redfinir, Intercepter, masquer, espionner Une primitive du noyau.

160

interne Groupe France Tlcom

Schma de synthse
libc

L'appel d'une primitive du noyau Linux se fait via la librairie libc.so.6

Interface User/Kernel
161

interne Groupe France Tlcom

Tout passe par les appels systme (syscalls)

droulement d'une session de login


162

interne Groupe France Tlcom

Table des symboles des primitives


Anciennement (avec un noyau 2.4), lorsqu'il fallait retrouver une primitive dans le noyau, il suffisait d'utiliser le tableau suivant (issue de System.map) :

sys_call_table[__NR_open] = (void *) my_func_ptr;


Cependant, du fait de l'utilisation de cette variable par les RootKit, cette dernire n'est plus exporte. Dsormais, la fonction system_call effectue un accs direct sys_call_table[] (arch/i386/kernel/entry.S:240) :

call *sys_call_table(,%eax,4)
Sur une machine x86 cela est traduit de la faon suivante :

0xff 0x14 0x85 <addr4> <addr3> <addr2> <addr1>


Where the 4 addr bytes form the address of sys_call_table[].

163

interne Groupe France Tlcom

Table des symboles des primitives


System_call n'tant pas export non plus, elle est dfinie quand mme comme au niveau systme (arch/i386/kernel/traps.c:1195) :

set_system_gate(SYSCALL_VECTOR,&system_call);
Sur la plateforme x86, cela signifie que cette adresse est stocke dans une table de descripteur d'interruption (IDT : Interrupt Descriptor Table). L'emplacement de cette table peut tre connue via le registre IDT (IDTR) et finalement cette IDTR peut son tour tre retrouve par l'instruction SIDT.

Rsum :
1) Rcuprer l'IDTR utilisant SIDT 2) Extraire l'adresse de l'IDT partir de l'IDTR 3) Rcuprer l'adresse de system_call partir de la 0x80ime entre de la table IDT.

164

interne Groupe France Tlcom

Code valide avec le noyau 2.6.x


Listing d'une fonction de recherche de la table de symbole :

// ----------------------------------------------------------------------------// Sys Call Table Address finder function // ----------------------------------------------------------------------------unsigned long **find_sys_call_table(void) { unsigned long **sctable; unsigned long ptr; extern int loops_per_jiffy; sctable = NULL; for (ptr = (unsigned long)&unlock_kernel; ptr < (unsigned long)&loops_per_jiffy; ptr += sizeof(void *)) { unsigned long *p; p = (unsigned long *)ptr; if (p[__NR_close] == (unsigned long) sys_close) { sctable = (unsigned long **)p; return &sctable[0]; } } return NULL; }

http://www.subversity.net/linux/finding-sys_call_table http://kerneltrap.org/node/6416
165

interne Groupe France Tlcom

9 HOTPLUG ET UDEV

Hotplug
Aperu Architecture Exemple de flux Fichiers utiliss

Udev
Caractristiques de udev Problmes et limitations Fichiers de configuration Boite outils Exemple de configuration Capacit de nommage Schma d'architecture

166

interne Groupe France Tlcom

Aperu du hotplug

Introduit dans le noyau Linux 2.4. USB a t le pionnier. Mcanismes noyau pour notifier les programmes de l'espace
utilisateur qu'un priphrique a t insr ou enlev.

Des scripts dans l'espace utilisateur prennent ensuite soin


sysfs.

d'identifier le matriel et d'insrer/enlever les modules requis.

Linux 2.6: l'identification des priphriques est simplifie grce Rend possible le chargement de micrologiciel (firmware). Permet d'avoir des pilotes en mode utilisateur (par exemple
libsane).

Configuration dans le noyau : CONFIG_HOTPLUG=y (section "General


setup") Page du projet et documentation : http://linux-hotplug.sourceforge.net/
Liste de diffusion : http://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

167

interne Groupe France Tlcom

Architecture d'hotplug

168

interne Groupe France Tlcom

Exemple de flux hotplug


Support hotplugdunoyau /sysmisjour /sbin/hotplugusb
ACTION=add|remove DEVPATH=<sysfs_path>

ACTION=add|remove DEVPATH=<sysfs_path> SEQNUM=<num>

usb.agent
KERNEL

Identifielep riphrique (D)chargelesmodules correspondantoulepilote enmodeutilisateur

Variables d'environment

Appelle/notifie lesautresprogrammes
UserSpace

169

interne Groupe France Tlcom

Caractristiques de udev :
Tire partie la fois de hotplug et de sysfs :

Entirement dans l'espace utilisateur Cr automatiquement les entres pour les priphriques (par dfaut dans /udev) Appel par /sbin/hotplug, utilise les informations de sysfs (notamment les nombres Majeur/Mineur) Ne requiert aucun changement dans le code du pilote Petite taille

Le fichier de configuration de udev (/etc/udev/udev.conf)

Facile diter et configurer Rpertoire des fichiers de priphriques (/udev) Base de donnes udev (/dev/.udev.tdb) Rgles udev (/etc/udev/rules.d/)
Permissions udev (/etc/udev/permissions.d/)

mode par dfaut (0600), utilisateur par dfaut (root) et groupe (root), si pas trouvs dans les permissions de udev. Activation des traces (log) (yes) Les messages de dboguage sont dans /var/log/messages
interne Groupe France Tlcom

170

Fichiers utilis par hotplug

/lib/modules/*/modules.*map sortie de depmod /proc/sys/kernel/hotplug specifie le chemin du programme hotplug /sbin/hotplug programme hotplug (par dfaut) /etc/hotplug/* fichiers hotplug

/etc/hotplug/NAME* fichiers spcifiques aux sous-systmes, pour les agents /etc/hotplug/NAME/DRIVER scripts de configuration des pilotes, invoqus par les agents /etc/hotplug/usb/DRIVER.usermap donnes pour depmod pour les pilotes en mode utilisateur /etc/hotplug/NAME.agent Agents spcifiques des sous-systmes de hotplug.

171

interne Groupe France Tlcom

Problmes et limitations de /dev



Sur Red Hat 9, il y avait 18 000 entres dans le rpertoire /dev !!! A l'installation du systme, toutes les entres possibles des priphriques doivent tre cres. Besoin d'une autorit pour assigner les major numbers http://lanana.org/: Linux Assigned Names and Numbers Authority Pas assez de nombres dans 2.4, la limite a t tendue dans 2.6 L'espace utilisateur ne sait pas quels priphriques sont prsents dans le systme. L'espace utilisateur ne sait pas associer une entre dans /dev avec le priphrique auquel elle se rapporte

La solution devfs et ses limitations :

Montre seulement les priphriques prsents Mais utilise des noms diffrents ceux de /dev, ce qui pose des problmes dans les scripts. Mais aucune flexibilit dans le nom des devices (par rapport /dev/) i.e. le 1er disque IDE s'appelle soit /dev/hda, soit /dev/ide/hd/c0b0t0u0.

Mais ne permet pas l'allocation dynamique des nombres majeur et mineur. Mais requiert de stocker la politique de nommage des priphriques dans la mmoire du noyau. Ne peut pas tre swappe!

172

interne Groupe France Tlcom

Bote outils de udev


Composants principaux :

udevsend (8KB dans FC 3) Gre les vnements de /sbin/hotplug, et les envoie udevd udevd (12KB dans FC 3) Rordonne les vnements de hotplug, avant d'appeler les instance de udev pour chacun d'eux. udev (68KB dans FC 3) Cr ou efface les fichiers priphriques et ensuite excute les programmes dans /etc/dev.d/ udevinfo (48KB dans FC 3) Permet aux utilisateurs d'interroger la base de donnes de udev udevstart (fonctionnalit apporte par udev) Rempli le rpertoire initial des priphriques avec des entres valides trouves dans l'arbre de priphriques de sysfs. udevtest <chemin_dev_sysfs> (64KB dans FC 3) Simule une excution de udev pour tester les rgles configures

Autres utilitaires :

173

interne Groupe France Tlcom

Exemple de configuration
Fichier de rgles pour udev :
# Si /sbin/scsi_id retourne "OEM 0815", le priphrique sera appel disk1 BUS="scsi", PROGRAM="/sbin/scsi_id", RESULT="OEM 0815", NAME="disk1" # Imprimante USB appele lp_color BUS="usb", SYSFS{serial}="W09090207101241330", NAME="lp_color" # Un disque SCSI avec un numro de vendeur/modle spcifique devient boot BUS="scsi", SYSFS{vendor}="IBM", SYSFS{model}="ST336", NAME="boot%n" # La carte son avec l'id 00:0b.0 sur le bus PCI sera appele dsp BUS="pci", ID="00:0b.0", NAME="dsp" # La souris USB sur le 3me port du 2nd hub sera appele mouse1 BUS="usb", PLACE="2.3", NAME="mouse1" # ttyUSB1 doit tjrs tre appel pda et avoir 2 autres liens symboliques KERNEL="ttyUSB1", NAME="pda", SYMLINK="palmtop handheld" # Webcams USB multiples avec des liens appels webcam0, webcam1, ... BUS="usb", SYSFS{model}="XV3", NAME="video%n", SYMLINK="webcam%n"

Fichier de permissions udev :

#name:user:group:mode input/*:root:root:644 ttyUSB1:0:8:0660 video*:root:video:0660 dsp1:::0666


interne Groupe France Tlcom

174

Capacits de nommage de udev


Le nom des fichiers de priphriques peut tre dfini :

depuis un label ou un numro de srie depuis un numro de priphrique sur le bus depuis une position dans la topologie du bus depuis un nom du noyau

udev peut aussi cr des liens symboliques vers d'autres fichiers priphriques

Les point de montage dans /etc/dev.d/


Aprs la cration, destruction, renommage des noeuds de priphriques, udev peut appeler des programmes dans l'ordre suivant de priorit:

/etc/dev.d/$(DEVNAME)/*.dev /etc/dev.d/$(SUBSYSTEM)/*.dev /etc/dev.d/default/*.dev


Les programmes de chaque rpertoire sont tris par ordre alphabtique. Cela permet de notifier les applications utilisateurs de changements au niveau des priphriques.
Sources : http://kernel.org/pub/linux/utils/kernel/hotplug/ Liste de diffusion : linux-hotplug-devel@lists.sourceforge.net Prsentation de udev de Greg Kroah-Hartman : ttp://www.kroah.com/linux/talks/oscon_2004_udev/ Documentation udev de Greg Kroah-Hartman : http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf

175

interne Groupe France Tlcom

Schma d'architecture de udev


Support hotplugdunoyau /sys misjour

/sbin/hotplug

*envoiedeparamtrespar
variablesd'environnement

*
udevsend

udevd

udev Programmesutilisateur

Lecturefichiersdeconfig Associepriph.etrgles

Programmes /etc/dev.d/

Cr/effacelesdevices

*
176

interne Groupe France Tlcom

10 /PROC ET /SYS

Quelques exemple de donnes dans le ramfs kernel Le pseudo systme de fichiers sysfs

/PROC & /SYS = la base de registre du noyau (en plus secured bien sur)

177

interne Groupe France Tlcom

Quelques exemple de donnes dans le ramfs kernel


Profs est un systme de pseudo-systme de fichiers utilis pare le kernel. Ce dernier est accessible en lecture et/ou criture selon les donnes. Il permet Une certain interaction entre l'espace utilisateur et l'espace noyau. En effet, une modification d'un paramtre doit tre prise en compte par le noyau En dynamique. Informations gnrales sur le systme :

/proc/cpuinfo: informations sur le(s) processeur(s) /proc/meminfo: tat de la mmoire /proc/version: information sur la version et la compil. /proc/cmdline: ligne de commande du noyau

Pour chaque processus il y a une entre par PID :

/proc/<pid>/environ: environnement d'excution /proc/<pid>/cmdline: ligne de cmd du processus

178

interne Groupe France Tlcom

Le pseudo systme de fichiers sysfs


Reprsentation dans l'espace utilisateur du Modle de priphrique. Configurer par : CONFIG_SYSFS=y (Filesystems -> Pseudo filesystems) Mont de la faon suivante : mount -t sysfs /sys /sys

Outils sysfs :
http://linux-diag.sourceforge.net/Sysfsutils.html

libsysfs Le but de cette librairie est de fournir une interface stable et pratique pour obtenir des informations sur les priphriques systme exports travers sysfs. Utilis par udev (voir plus loin) systool Un utilitaire bti au dessus de libsysfs qui liste les priphriques par bus, classe et topologie.

179

interne Groupe France Tlcom

11 CONSEILS ET RESSOURCES

Livres de rfrence Liens Sites web incontournables Carte du noyau linux interactive DDK Linux : Drivers Development Kit

180

interne Groupe France Tlcom

Livres et revues de rfrences

181

interne Groupe France Tlcom

Liens

Carte du noyau interractive : http://www.linuxdriver.co.il/kernel_map ou http://www.makelinux.net/kernel_map http://learnlinux.tsf.org.za/courses/build/internals/internals-all.html http://howsoftwareisbuilt.com/2007/05/23/linux-kernel-modification-process/ http://mxi1.wordpress.com/category/linux-kernel/ http://www.iamexwi.unibe.ch/studenten/schlpbch/linuxScheduling/LinuxScheduling-1.html http://en.wikipedia.org/wiki/Linux_kernel http://josh.trancesoftware.com/linux/linux_cpu_scheduler.pdf http://www.ibm.com/developerworks/linux/library/l-linux-kernel/ http://www.kernelhq.org/ http://kerneltrap.org/ http://www.kernel.org/ http://kernelnewbies.org/KernelHacking http://kernelnewbies.org/Drivers http://lwn.net/Kernel/ http://lwn.net/Kernel/LDD3/ http://janitor.kernelnewbies.org/ http://old.lwn.net/2001/features/Timeline/ http://www.kroah.com/lkn/ Linux DDK : http://www.kroah.com/log/2006/05/24/#ddk http://www.kernel.org/pub/linux/kernel/people/gregkh/ddk/ http://kernelnewbies.org/ http://www.xenotime.net/linux/mentor/linux-mentoring.pdf http://www.linuxdevices.com/articles/AT5340618290.html http://www.stardust.webpages.pl/files/handbook/handbook-en-0.3-rc1.pdf http://www.opersys.com/LTT/
interne Groupe France Tlcom

182

Liens

http://www.cs.umd.edu/hcil/millionvis/Treemap_Visualization_of_the_Linux_Kernel_2_5_33.html http://www.linuxdevices.com http://web.yl.is.s.u-tokyo.ac.jp/~tosh/kml/ http://www.alcove.com/IMG/pdf/kernel_debugging.pdf http://www.ibm.com/developerworks/linux/library/l-initrd.html http://www.ibm.com/developerworks/library/l-proc.html http://www.ibm.com/developerworks/linux/library/l-linuxboot/ http://devresources.linux-foundation.org/rddunlap/doc/scale-3x-kj-v5.pdf http://www.chear.defense.gouv.fr/fr/think_tank/archives/rstd/64/rstd64p77.pdf http://www.trunix.org/programlama/c/kernel-api/index.html http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/ http://docs.huihoo.com/linux/kernel/a1/index.html http://lwn.net/Articles/13325/ http://en.wikipedia.org/wiki/Linux_Kernel_API http://kernelbook.sourceforge.net/kernel-api.pdf http://kernelbook.sourceforge.net/ http://kernelnewbies.org/KernelHacking http://www.linuxjournal.com/article/5833 http://www.cs.rochester.edu/~kshen/csc256-spring2005/assignments/xen-programming4.html http://www.linux.it/~rubini/docs/ksys/ksys.html http://www.cs.pitt.edu/~jmisurda/teaching/cs1550/2077/cs1550-2077-project2.htm http://oss.sgi.com/projects/kernprof/ http://oss.sgi.com/projects/lockmeter/ http://oss.sgi.com/projects/cpumemsets/ http://oss.sgi.com/projects/numa/ http://oss.sgi.com/projects/sgi_propack/ http://www.linuxjournal.com/article/5833 http://www.kernel.org/doc/htmldocs/

183

interne Groupe France Tlcom

Liens

http://linuxdriverproject.org/twiki/bin/view http://www.spinics.net/lists/netdev/ http://linux-mm.org/LinuxMM http://kernelnewbies.org/known_regressions http://tldp.org/ http://lea-linux.org/

184

interne Groupe France Tlcom

Carte interactive des sources du noyau GNU Linux

Carte interactive de la carte du noyau GNU Linux

http://www.linuxdriver.co.il/kernel_map
185

interne Groupe France Tlcom

Carte du noyau 2.5.33 (version de dev)

http://www.cs.umd.edu/hcil/millionvis/Treemap_Visualization_of_the_Linux_Kernel_2_5_33.html
186

interne Groupe France Tlcom

Sites web incontournables


Linux Weekly News (http://lwn.net/)

Le rsum hebdomadaire de toutes les sources d'informations pour des logiciels libres et Linux Discussions techniques sur le noyau Abonnez-vous pour financer les diteurs ($5 / mois) Articles disponibles pour les non abonns au bout d'une semaine.

KernelTrap (http://kerneltrap.org/)

Forum pour les dveloppeurs noyau Actualits, articles, discussions, sondages, entretiens. Parfait si un rsum ne vous suffit pas. FAQ de la liste de diffusion du noyau Linux (ttp://www.tux.org/lkml/ A lire avant de poser une question la liste de diffusion !

Kernel Newbies (http://kernelnewbies.org/) Glossaires, articles, prsentations, HOWTOs, lectures recommandes, utilitaires pour les personnes devenant familires avec le dveloppement noyau.

187

interne Groupe France Tlcom

La communaut autour du noyau

Les moyens de communication :


La Linux Kernel Mailing List (LKML), Des mailing lists par sous-systme et projet, Les archives sur http://vger.kernel.org/vger-lists.html, Des canaux IRC (voir les sites d'introduction plus bas) ;

L'introduction au dveloppement noyau :


Kernel Mentors (http://kernelnewbies.org/KernelMentors), Kernel Janitors (http://www.kerneljanitors.org/), Kernel Newbies (http://kernelnewbies.org/) ;

Les outils :
Un gestionnaire de code pour dveloppement distribu (GIT), Un suivi des rgressions (http://kernelnewbies.org/known_regressions), Bugzilla (diversement utilis et apprci).

188

interne Groupe France Tlcom

Kit de dveloppement officiel pour le noyau et les drivers pour GNU Linux

LSB Driver Development Kit (DDK) (make LSB-compliant printer and scanner driver packages)

In coordination with the FreedomHEC conference in Seattle, WA, USA.


http://www.linuxfoundation.org/en/OpenPrinting/WritingAndPackagingP rinterDrivers http://ldn.linuxfoundation.org/how-participate-linuxcommunity

http://www.kroah.com/log/2006/05/24/#ddk http://www.kernel.org/pub/linux/kernel/people/gregkh/ddk/ http://www.kernel.org/pub/linux/kernel/people/gregkh/ddk/ddk-2.6.16.18.iso.bz2


189

interne Groupe France Tlcom

DES QUESTIONS ?

190

interne Groupe France Tlcom

Une petite dernire photo de l'quipe avant de se quitter


191

interne Groupe France Tlcom

Vous aimerez peut-être aussi