GNU/Linux >> Tutoriels Linux >  >> Linux

Comment passer des paramètres à l'appel système Linux ?

Vous devez indiquer au système de construction que votre appel système nécessite 2 arguments et qu'ils sont de type int . C'est ainsi que les scripts qui font partie du système de construction génèrent des wrappers appropriés pour convertir les arguments dans le type dont vous avez besoin. Au lieu de définir le gestionnaire réel comme vous l'avez fait, vous devez utiliser -

SYSCALL_DEFINE2(my_syscall_2, int, a, int, b) // Yes, there is a comma between the types and the argument names
{
    printk("my_syscall_2 : %d, %d\n", a, b);
    return b;
}

SYSCALL_DEFINEx est défini dans linux/include/linux/syscalls.h.

Vous pouvez regarder un exemple dans linux/fs/read_write.c


J'ai trouvé la solution. Comme @Ajay Brahmakshatriya a répondu, je devrais utiliser la macro SYSCALL_DEFINEx. Et aussi, je devrais modifier arch/x86/entry/syscalls/syscall_64.tbl aussi.

Voici le résumé final.

Comment ajouter de nouveaux appels système

Tout d'abord, modifiez arch/x86/entry/syscalls/syscall_64.tbl :ajoutez ces lignes ci-dessous.

335     common     my_syscall_0     __x64_sys_my_syscall_0
336     common     my_syscall_1     __x64_sys_my_syscall_1
337     common     my_syscall_2     __x64_sys_my_syscall_2

Deuxièmement, modifiez include/linux/syscalls.h :ajoutez ces lignes ci-dessous.

asmlinkage long sys_my_syscall_0(void);
asmlinkage long sys_my_syscall_1(int);
asmlinkage long sys_my_syscall_2(int, int);

Troisièmement, créez un nouveau fichier pour l'implémentation. Pour mon cas, kernel/my_syscall.c .

#include <linux/syscalls.h>
#include <linux/kernel.h>

SYSCALL_DEFINE0(my_syscall_0)
{
    printk("my_syscall_0\n");
    return 0;
}

SYSCALL_DEFINE1(my_syscall_1, int, a)
{
    printk("my_syscall_1 : %d\n", a);
    return 0;
}

SYSCALL_DEFINE2(my_syscall_2, int, a, int, b)
{
    printk("my_syscall_2 : %d, %d\n", a, b);
    return b;
}

Quatrièmement, ajoutez le fichier créé à Makefile dans son répertoire. Pour mon cas, kernel/Makefile .

...
obj-y = fork.o exec_domain.o panic.o \
        cpu.o exit.o softirq.o resource.o \
        sysctl.o sysctl_binary.o capability.o ptrace.o user.o \
        signal.o sys.o umh.o workqueue.o pid.o task_work.o \
        extable.o params.o \
        kthread.o sys_ni.o nsproxy.o \
        notifier.o ksysfs.o cred.o reboot.o \
        async.o range.o smpboot.o ucount.o \
        my_syscall.o
...

Enfin, compilez et installez le noyau. Maintenant, vous pourrez voir les nouveaux appels système fonctionner correctement.

#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>

int main()
{
    printf("1 : %d\n", syscall(335));
    printf("2 : %d\n", syscall(336, 1));
    printf("3 : %d\n", syscall(337, 2, 3));
    return 0;
}

dmesg me montre que les appels système fonctionnent bien.

# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3

Linux
  1. Comment configurer la virtualisation sur Redhat Linux

  2. Comment définir ou modifier le nom d'hôte du système sous Linux

  3. Comment changer l'identité d'un système Linux

  4. Comment transmettre un mot de passe à la commande SCP sous Linux

  5. Comment mmaper la pile pour l'appel système clone() sous Linux ?

Comment transmettre un mot de passe à la commande SSH sous Linux

Comment utiliser systemctl sous Linux

Comment utiliser la commande Linux Strace

Comment répertorier les services sous Linux

Comment utiliser la commande fd sur le système Linux

Comment vérifier que le système Linux est 32 bits ou 64 bits ?