Anda perlu memberi tahu sistem build bahwa pemanggilan sistem Anda memerlukan 2 argumen dan bertipe int
. Ini agar skrip yang merupakan bagian dari sistem build akan menghasilkan pembungkus yang sesuai untuk memasukkan argumen ke dalam tipe yang Anda butuhkan. Alih-alih mendefinisikan penangan yang sebenarnya seperti yang Anda lakukan, Anda harus menggunakan -
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
didefinisikan di linux/include/linux/syscalls.h.
Anda dapat melihat contohnya di linux/fs/read_write.c
Saya menemukan solusinya. Seperti yang dijawab oleh @Ajay Brahmakshatriya, saya harus menggunakan makro SYSCALL_DEFINEx. Dan juga, saya harus memodifikasi arch/x86/entry/syscalls/syscall_64.tbl juga.
Berikut ringkasan akhir.
Cara menambahkan panggilan sistem baru
Pertama, ubah arch/x86/entry/syscalls/syscall_64.tbl :tambahkan baris-baris di bawah ini.
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
Kedua, ubah include/linux/syscalls.h :tambahkan baris-baris di bawah ini.
asmlinkage long sys_my_syscall_0(void);
asmlinkage long sys_my_syscall_1(int);
asmlinkage long sys_my_syscall_2(int, int);
Ketiga, buat file baru untuk implementasi. Untuk kasus saya, 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;
}
Keempat, tambahkan file yang dibuat ke Makefile di direktorinya. Untuk kasus saya, 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
...
Terakhir, kompilasi dan instal kernel. Sekarang, Anda dapat melihat panggilan sistem baru berfungsi dengan baik.
#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 perintah menunjukkan kepada saya bahwa panggilan sistem berfungsi dengan baik.
# dmesg
my_syscall_0
my_syscall_1 : 1
my_syscall_2 : 2, 3