L'ajout de nouveau Appel Système à Noyau Linux 3.13 sur système 64 bits

J'essaye d'ajouter un simple helloworld Système d'Appel à kernel 3.13.0-37-generic sur système 64 bits.

Je vais essayer de montrer ce que j'ai fait jusqu'à présent, étape par étape :

1 - j'ai téléchargé les sources du noyau par :

sudo apt-get source linux-image-3.13.0-37-generic

Après cela, les sources du noyau fichiers extraits à /usr/src/

2 - Définir un nouveau système d'appel sys_hello() :

J'ai créé un répertoire avec hello nom dans le répertoire des sources du noyau dans /usr/src/linux-3.13/

Et j'ai créé un hello.c fichier dans hello répertoire avec le contenu ci-dessous :

#include <linux/kernel.h>

asmlinkage long sys_hello(void)
{
        printk(“Hello world\n”);
        return 0;
}

Puis j'ai créé un Makefile dans le bonjour répertoire avec le contenu suivant :

obj-y := hello.o

3 - Ajouter le bonjour répertoire du noyau Makefile

J'ai changé de 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 nouveau système d'appel sys_hello() dans la table des appels systèmes (syscall_64.tbl)

Parce que je suis en utilisant le système 64 bits, j'ai besoin de modifier le syscall_64.tbl fichier :

/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl

Ajouté la ligne suivante à la fin du fichier :

-Dernier numéro de la ligne a été 313

314     common    hello    sys_hello

5 - Ajouter le nouveau système d'appel sys_hello() dans le système d'appel d'en-tête de fichier

vim /usr/src/linux-3.13/include/linux/syscalls.h

J'ai ajouté la ligne suivante à la fin du fichier, juste avant le #endif déclaration au bas de l'écran :

asmlinkage long sys_hello(void);

6 - Compilation du noyau sur mon système

Pour configurer le noyau, j'ai essayé la commande suivante :

sudo make menuconfig

Après la commande ci-dessus une fenêtre pop-up est venu et j'ai fait en sorte que ext4 a été sélectionné, puis save.

Alors :

# cd /usr/src/linux-3.13/
# make

Il y 2~3 heures.

Après que :

# make modules_install install

Après cela, j'ai redémarré mon système.

7 - Test de l'appel système (le Problème Est Ici)

Après le redémarrage, j'ai créé un fichier avec le nom hello.c dans le dossier d'accueil avec le contenu suivant :

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
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 :

System call sys_hello returned -1

Problème est exactement -1. Il doit retourner 0 pas -1.

Semble sys_hello n'est pas ajouté au Noyau du Système d'Appel.

Ce que je fais mal?

Regardez dans le noyau de journal ou de vérifier uname pour vous assurer que vous utilisez votre nouvelle construction. Peut-être vérifier le système.carte pour voir si votre addition a été inclus dans le noyau.
Je ne peux pas la comprendre par uname cause avant/après le noyau est le même (les Deux sont kernel 3.13.0-37-generic).
Il n'y a pas de log dans dmesg liées à sys_hello appel système !
Ne de votre sortie du noyau comprennent quand il a été construit? Je n'étais pas suggérer que vous y chercher des preuves de votre fonction, mais plutôt la preuve que vous êtes en fait en cours d'exécution de votre nouvelle construction. Ensuite séparément de faire quelques vérifications pour voir si votre nouvelle construction récupéré votre code.
Apprendre make-kpkg de construire un noyau, et passer -j 4 à make-kpkg ou à make lors de sa construction.

OriginalL'auteur Hamed Kamrava | 2014-11-03