Я перепробовал много руководств, и по какой-то причине мой системный вызов даже не возвращает 0, как должно. Куда я иду не так? Вот мои шаги для его создания:
внутри папки "/ linux /":
Я создал папку под названием «mycall» с файлами mycall.c, mycall.h и & Makefile
mycall.c:
#include <linux/kernel.h>
#include <linux/init.h>
#include <sched.h>
#include <syscalls.h>
#include <linux/unistd.h>
#include "mycall.h"
asmlinkage long sys_mysyscall(int *id, int username, int *size)
{
printk("hello");
return 0;
}
mycall.h:
asmlinkage long sys_mysyscall(int *id, int username, int *size);
Makefile:
obj-y := mycall.o
Затем я пошел во все места, где я ДУМАЛ, что должен объявить системный вызов.
// inside of /linux/include/linux/syscalls.h
asmlinkage long sys_mysyscall(int __user *myid, int username, int __user *size);
затем
// inside of /linux/arch/arm/tools/syscall.tbl
398 common mysyscall sys_mysyscall
наконец-то я добавил
// inside of /linux/Makefile
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypt/ block/ mycall/
вот мои настройки. тогда последнее, что я делаю, это создаю пользовательское пространство в каталоге / linux
userspace.c:
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <pwd.h>
int main ()
{
int id = 0;
int username = 7;
int size = 2;
int ret_val = syscall(398, &id, username, &size);
printf("%d\n", ret_val);
return 0;
}
возвращаемое значение -1, так что это не работает. пожалуйста, дайте мне знать, что я делаю неправильно. Я прочитал несколько руководств по реализации.
ERRNO 38. Функция не реализована.