Я новичок в Linux программировании и пытаюсь реализовать простой системный вызов, следуя этому руководству: https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to-linux-kernel-dad32875872. В моем каталоге ядра linux я создал новый каталог с именем my_syscall
. В этом каталоге я создал my_syscall.c
. Вот my_syscall.c
#include <linux/syscalls.h>
#include <linux/kernel.h>
asmlinkage long sys_my_syscall(int i) {
prink(KERN_INFO "This is the system call.");
return(0);
}
Затем я создал Makefile
в каталоге my_syscall
одной строкой:
obj-y := my_syscall.o
Затем я отредактировал эту строку в Makefile
в каталоге ядра:
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ my_syscall/
Затем в каталоге linux-5.4.15/arch/x86/entry/syscalls
я отредактировал syscall_64.tbl
, добавив в самом конце следующую строку:
548 64 my_syscall sys_my_syscall
Наконец, в каталоге linux-5.4.15/include/linux
я отредактировал файл syscalls.h
, чтобы включить эту строку перед #endif
:
asmlinkage long sys_my_syscall(int i);
Теперь, когда я запускаю команду sudo make
, я сталкиваюсь с следующая ошибка вскоре после:
./arch/x86/include/generated/asm/syscalls_64.h:2664:19: error: conflicting types for 'sys_my_syscall'
__SYSCALL_64(548, sys_my_syscall, )
arch/x86/entry/syscall_64.c:18:60: note: in definition of macro '__SYSCALL-64'
#define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
In file included from arch/x86/entry/syscall_64.c:7:0:
./include/linux/syscalls.h:1423:17: note: previous declaration of 'sys_my_syscall' was here
asmlinkage long sys_my_syscall(int i);
^
make[3]: *** [arch/x86/entry/syscall_64.o] Error 1
make[2]: *** [arch/x86/entry] Error 2
make[1]: *** [arch/x86] Error 2
make: *** [sub-make] Error 2
Я не знаю, как подойти к этой ошибке. С ошибкой конфликтующих типов, я думаю, я где-то объявил системный вызов по-разному, но и в файлах my_syscall.c
и syscalls.h
объявление одно и то же. Это были только два файла, в которых объявлен системный вызов, но он также назван в пределах syscall_64.tbl
, и кажется, что именно здесь linux пытается указать мне. Тем не менее, я не вижу, что не так с тем, как я объявил это в таблице, поскольку я следовал непосредственно руководству. Любая помощь с этим будет принята с благодарностью!
Информация:
Версия ядра: 5.4.15
Linux Распространение: Ubuntu 14