J’essaie d’append un simple helloworld
système helloworld
au kernel 3.13.0-37-generic
sur un système 64 bits.
Je vais essayer de montrer ce que j’ai fait jusqu’ici pas à pas:
1- J’ai téléchargé les sources du kernel par:
sudo apt-get source linux-image-3.13.0-37-generic
Après cela, les fichiers sources du kernel extraits dans /usr/src/
2- Définir un nouvel appel système sys_hello()
:
J’ai créé un répertoire avec le nom hello
dans le répertoire source du kernel dans /usr/src/linux-3.13/
Et j’ai créé un fichier hello.c
dans le répertoire hello
avec le contenu ci-dessous:
#include asmlinkage long sys_hello(void) { printk(“Hello world\n”); return 0; }
Ensuite, j’ai créé un Makefile
dans le répertoire hello avec le contenu suivant:
obj-y := hello.o
3- Ajouter le répertoire hello au Makefile du kernel
J’ai changé la ligne suivante dans /usr/src/linux-3.13/Makefile
:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
à :
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/
4- Ajouter le nouvel appel système sys_hello()
dans la table des appels système (fichier syscall_64.tbl)
Comme j’utilise un système 64 bits, je dois modifier le fichier syscall_64.tbl
dans:
/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl
Ajout de la ligne suivante à la fin du fichier:
-Le dernier numéro de ligne était 313
314 common hello sys_hello
5- Ajouter le nouvel appel système sys_hello()
dans le fichier d’en-tête de l’appel système
vim /usr/src/linux-3.13/include/linux/syscalls.h
J’ai ajouté la ligne suivante à la fin du fichier juste avant la déclaration #endif tout en bas:
asmlinkage long sys_hello(void);
6- Comstackr ce kernel sur mon système
Pour configurer le kernel, j’ai essayé la commande suivante:
sudo make menuconfig
Après la commande ci-dessus une fenêtre pop-up est apparue et je me suis assuré que ext4
était sélectionné, puis save
.
Alors :
# cd /usr/src/linux-3.13/ # make
Il a fallu 2 ~ 3 heures.
Après ça :
# make modules_install install
Après cela, j’ai redémarré mon système.
7- Tester l’appel système (le problème est là)
Après le redémarrage, j’ai créé un fichier nommé hello.c
dans le dossier de base avec le contenu suivant:
#include #include #include #include int main() { long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl` printf(“System call sys_hello returned %ld\n”, amma); return 0; }
Alors :
# gcc hello.c # ./a.out
La sortie est la suivante:
System call sys_hello returned -1
Le problème est exactement -1
. Il doit retourner 0
pas -1
.
Il sys_hello
que sys_hello
ne soit pas ajouté à Kernel System Call.
Qu’est-ce que je fais mal?
Le problème était de l’étape 6 à la dernière étape (Comstack Kernel).
Après l’étape 5, nous devons suivre les étapes suivantes:
6- Comstackr ce kernel sur mon système
Pour configurer le kernel, j’ai essayé la commande suivante:
# make menuconfig
Après la commande ci-dessus une fenêtre pop-up est apparue et je me suis assuré que ext4 était sélectionné, puis enregistrez.
Ensuite, pour créer un fichier DEB
à partir du nouveau kernel, nous devons:
# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg
Il va créer des fichiers deb
dans /usr/src/
.
Après cela, nous devons les installer:
# dpkg -i linux*.deb
Il va installer un nouveau kernel sur votre système.
Maintenant, redémarrez votre système. Après le redémarrage du système, vous pouvez savoir si un nouveau kernel est installé ou non:
$ uname -r
Et si vous voulez connaître votre nouvel appel système ajouté au kernel ou non, tapez simplement:
$ cat /proc/kallsyms | grep
Dans mon cas :
$ cat /proc/kallsyms | grep hello
La sortie suivante indique que votre appel système a bien été ajouté au kernel:
0000000000000000 T sys_hello