我尝试了许多指南,由于某种原因,我的系统调用甚至没有返回应有的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。功能未实现。