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