Ajout d’un nouvel appel système au kernel Linux 3.13 sur un système 64 bits

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