Académique Documents
Professionnel Documents
Culture Documents
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.
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
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.
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
" Un travail de longue dure par une quipe de Geeks / Nerds / professionnels passionns. "
http://opensource.mit.edu/papers/dafermoslinux.pdf http://catb.org/~esr/writings/cathedral-bazaar/
Cycle de dveloppement
10
http://www.kernel.org/pub/linux/kernel/people/gregkh/kernel_history/developer_graph-2.6.18.pdf
11
12
Le processus de dveloppement
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 ) ;
13
Le processus de dveloppement
14
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
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
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.
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
19
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
20
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
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
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
Paquets ncessaires pour la gnration Rcupration des sources du noyau Vrification de l'intgrit des sources Application des patchs
Compilation et installation
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)
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
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
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
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
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
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
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
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
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)
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
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
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.
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
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
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
37
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
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
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 !
39
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
/lib/modules/<version>/ build/
modules.dep modules.symbols
41
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
Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux
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
http://syslinux.zytor.com/iso.php
46
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 \
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
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
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
50
51
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
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
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
54
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
56
57
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
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
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
61
http://fuse.sourceforge.net/ http://fuse.sourceforge.net/wiki/index.php/FileSystems
62
PM (Process Management)
63
PM : Process Management
Cration
STOPPE
Signal
Signal
PRET
Ordonnancement
Entre/ Sortie
64
65
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()
interruptible_sleep_on() sleep_on_timeout()
Peut tre interrompu par un signal Utilisez seulement les commandes interruptibles !
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
MM (Memory Management)
68
Organisation de la mmoire
ZONE_NORMAL :
4 GB
3 GB
1 GB
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
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.
70
kmalloc et kfree
Exemple:
71
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
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
__GFP_DMA
Allocation dans la zone DMA
__GFP_REPEAT
Demande d'essayer plusieurs fois. Peut se bloquer, mais moins probable.
__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
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).
75
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
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.
77
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
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
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
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
82
mmap
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
84
85
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
87
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
89
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
structresource*request_memregion(
unsignedlongstart, unsignedlonglen, char*name);
voidrelease_mem_region(
unsignedlongstart, unsignedlonglen);
NS (Network Stack)
92
Pile rseau
Pour plus d'information sur la pile rseau, veuillez vous reportez au document "Etude dtaill de la pile rseau sous Linux".
93
94
Les primitives systmes du noyau son accessible via une API POSIX L'appel ces fonctions se faisant via la librairie C standard
95
4 METHODOLOGIES DE DEVELOPPEMENT
Projet Open STB / Orange Labs - R&D Prsentation du dveloppement noyau sous GNU interne Groupe France Tlcom Linux
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.
97
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
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
(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
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 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
# 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
104
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
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
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
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
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
Premirement, assurez vous d'utiliser la dernire version Assurez vous d'avoir creus le problme autant que possible: voir
Documentation/BUGHUNTING
110
111
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
Les pilotes blocs peuvent tre identifis par leur type b (lsl) :
brwrw1rootdisk3,1Feb232004/dev/hda1 brwrw1jdoefloppy2,0Feb232004fd0 brwrw1rootdisk7,0Feb232004loop0 brwrw1rootdisk1,1Feb232004ram1 brw1rootroot8,1Feb232004sda1
113
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
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
/* Main data for the driver */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("FT R&D"); MODULE_DESCRIPTION("Embedded ifconfig for the LiveBox");
/* Global variables */ extern struct net_device *dev_get_by_index(int idx); struct proc_dir_entry *proc_ifcfg;
115
(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");
/* END */
116
117
http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf
118
Rsultat au chargement :
Hello, world
Dchargement du noyau :
rmmod helloworld modprobe r helloworld
Rsultat au dchargement :
Goodbye, cruel world
119
Compiler un module
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
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
Second exemple de module avec passage d'un paramtre. Le dtail de ce paramtre apparaitra via la commande modinfo.
121
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
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
Premier numro: nombre majeur Associ de manire unique chaque pilote Second numro: nombre mineur Associ de manire unique chaque priphrique / entre dans /dev
123
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);
124
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
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)
126
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
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
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
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
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
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
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
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
http://www.xml.com/ldd/chapter/book/ch10.html
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
Dpendances de modules
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
Les dpendances des modules sont stockes dans: Ce fichier est mis jour (en tant que root) avec:
depmoda[<version>]
134
135
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
136
Synchronisation
137
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
Dbugging
139
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
http://ltp.sourceforge.net/documentation/technical_papers/UsingCodeCoverage.pdf
140
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
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
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
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
143
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
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
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
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
cat/proc/stat|grepintr intr819076760929671037701102775520196... Nombre total d'interruptions Total IRQ1 IRQ2 IRQ3 ...
interne Groupe France Tlcom
147
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
> 0: numro d'IRQ unique trouv = 0: pas d'interruption. Essayez nouveau ! < 0: plusieurs interruptions reues. Essayez nouveau !
148
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);
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
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
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 */ );
151
Trouver un numro
priphrique
Enregistrer le gestionnaire
Dsenregistrer le gestionnaire si
152
Caractristiques du DMA Utilisation de la DMA Exemple d'activation du DMA API gnrique DMA
153
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
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
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.
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
= 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
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
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 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
8 HOOKING DE PRIMITIVES
Ancienne technique l'ancien paradis des rootKits Table des symboles des primitives
159
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
Schma de synthse
libc
Interface User/Kernel
161
call *sys_call_table(,%eax,4)
Sur une machine x86 cela est traduit de la faon suivante :
163
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
// ----------------------------------------------------------------------------// 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
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
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.
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).
167
Architecture d'hotplug
168
usb.agent
KERNEL
Variables d'environment
Appelle/notifie lesautresprogrammes
UserSpace
169
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
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
/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
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
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
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"
174
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
175
/sbin/hotplug
*envoiedeparamtrespar
variablesd'environnement
*
udevsend
udevd
udev Programmesutilisateur
Lecturefichiersdeconfig Associepriph.etrgles
Programmes /etc/dev.d/
Cr/effacelesdevices
*
176
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
/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
178
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
11 CONSEILS ET RESSOURCES
Livres de rfrence Liens Sites web incontournables Carte du noyau linux interactive DDK Linux : Drivers Development Kit
180
181
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
Liens
184
http://www.linuxdriver.co.il/kernel_map
185
http://www.cs.umd.edu/hcil/millionvis/Treemap_Visualization_of_the_Linux_Kernel_2_5_33.html
186
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
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
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)
DES QUESTIONS ?
190