我尝试了许多指南,由于某种原因,我的syscall无法正确实现。 ERRNO为38(未实现功能)。这是我为初学者创建一个基本步骤的步骤:
我在树莓派64位上执行此操作。使用Linux 4.14.93
在“ / 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;
}
// recompiling & copying . then I run the userspace again
cd ~/linux
KERNEL=kernel7
make bcm2709_defconfig
make -j4 zImage modules dtbs
sudo make INSTALL_MOD_PATH=/root modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
返回值是-1,所以这不起作用。
请让我知道我在做什么错。我已经阅读了几个实施指南,却不知道我是如何实施此错误的。