TP/TD Noyau Linux Cours Préliminaires Hello World

Transcription

TP/TD Noyau Linux Cours Préliminaires Hello World
ASR2 - L3 Informatique - ENS Lyon
Année 2013-2014
A. Benoit, A.Isoard, A.Lefray et D. Zaidouni
TP/TD Noyau Linux
Cours
Learn !
Pour ce TP nous allons utiliser VirtualBox.
VirtualBox est un logiciel libre de virtualisation de machines x86 développé par Sun, il permet
d’exécuter un ou plusieurs systèmes d’exploitation (et leurs applications) de manière isolée sur une
même machine physique. VirtualBox fonctionne sous les systèmes d’exploitation Linux, OS X, Solaris
et Windows. Les OS invités partagent ainsi les ressources de la machine physique. VirtualBox une «
machine virtuelle ». Les OS invités n’ont pas « conscience » de VirtualBox, ils n’ont pas besoin d’être «
portés » (adaptés) pour fonctionner sur VirtualBox. Il en existe d’autres logiciels similaires : VMware,
Qemu, VirtualPC, ...
Au cours de ce TP, vous aurez besoin de maitriser les commandes suivantes :
— lsmod : liste les modules chargés dans le noyau
— insmod : charge un module dans le noyau
— rmmod : décharge un module dans le noyau
— modinfo : affiche les infos d’un module
— dmesg : affiche les messages noyau (/var/log/messages)
Préliminaires
Avec VirtualBox, lancer une machine virtuelle à partir de l’image ASR2_Lucid présente dans le
répertoire /tmp/.
Si la VM n’existe pas encore, créer une nouvelle (Type Linux, Version Ubuntu, 512 Mo) en spécifiant
ASR2_Lucid.vdi comme disque dur (Hard Drive).
Une fois lancée, le login et password sont tout deux asr2. Enfin, passer root avec la commande sudo
su.
Vous mettrez vos codes dans le dossier /home/asr2/KernelMod, un makefile est déjà prêt.
Hello World
1. Afficher la liste des modules.
2. Réaliser un module noyau hello-1 affichant "Hello World" à son chargement et "Goodbye, World"
à son déchargement (affichage kernel).
Pour cela vous aurez besoin des librairies suivantes :
— <linux/module.h>
— <linux/kernel.h>
— <linux/init.h>
Un module noyau doit déclarer une fonction d’initialisation et de terminaison via les fonctions
module_init, module_exit.
Les prototypes sont les suivants :
— static int __init mafonction_init(void)
— static void __exit mafonction_exit(void)
1
On remarquera que toutes les fonctions noyaux sont nécessairement statiques.
3. Ajouter votre module dans le Makefile (commenter la première ligne existante si nécessaire), puis
compiler avec make.
4. Charger le module
5. Afficher la liste des modules pour s’assurer du succès du chargement.
6. Afficher les messages systèmes.
7. Décharger le module.
8. Afficher la liste des modules pour s’assurer du succès du déchargement.
Copyrights
Un module noyau peut renseigner des informations d’auteur, licence, etc. grâce aux macros suivantes :
— MODULE_AUTHOR
— MODULE_DESCRIPTION
— MODULE_LICENSE
1. Réaliser un module noyau hello-2 ayant le même comportement que hello-1 mais déclarant correctement les infos Auteur, Description et Licence.
SpyDir
Pour cet exercice, reprendre le code squelette patchsyscall.c qui récupère dynamiquement le pointeur
vers la table des appels systèmes.
Chaque entrée de cette table pointe vers la fonction en charge de traiter l’appel système. La liste
des appels peut être trouvée dans /usr/include/asm-i386/unistd.h. Ainsi, la fonction traitant l’appel à
fork est adressée à syscall_table[__NR_fork]
1. Que signifie la macro asmlinkage ?
Solution:
C’est une macro pour le compilateur (gcc). Les arguments doivent être pris sur la pile du CPU
et non les registres.
2. Quelle commande permet de changer de répertoire ?
Solution:
chdir
3. Réaliser un module noyau spydir affichant "VU" à chaque ouverture de répertoire (affichage kernel).
4. Quel problème de sécurité pose l’export global du pointeur vers la table des appels systèmes ?
5. (Bonus) Réaliser un module noyau hidefile masquant un fichier hackme à la commande ls. Pour
cela, vous aurez besoin de comprendre les implémentations des fonctions systèmes et de savoir
parcourir les structures de données noyaux (disponible en ligne à http ://lxr.linux.no/#linuxbk+v2.6.11.5/ ).
2