这是我遵循的步骤。
1)我在4.15.0内核上运行,所以我更新到最新的内核版本。
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.17.4.tar.xz
2)萃取内核源代码使用
sudo tar -xvf linux-4.17.4.tar.xz -C/usr/src/
3)在cd /usr/src/linux-4.17.4/
创建了一个新的目录称它为
子
然后创建
sub.c
内
子
目录。
在
sub.c
我写的代码自X减去如果Y(Y> X)否则返回0; x是整数,y是双。
#include <linux/kernel.h>
asmlinkage int sys_sub(int x,double y)
{
printk("working...");
if(y>x){
return ((int)y-x);}
else
return 0;
}
4)在相同的子目录中创建一个Makefile并加入obj-y := sub.o
5)在
/US人/双人床/Linux-4.17.4
打开生成文件和修改的核心-Y线
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ sub/
6)然后,在
CD弓/ 86 /项/系统调用/
我打开了
gedit中syscall_64.tbl
和第548位的系统调用我进入
548 64 hello sys_sub
7)在
CD在include / linux /
我打开了
gedit中syscalls.h
并补充
asmlinkage int sys_sub(int x,double y);
作为最后一行刚刚ENDIF之前
8)我确信ext4的选择中
须藤的make menuconfig
9)我使用编译内核
须藤使modules_install安装
10)执行
现在执行shutdown -r
11)经过
使用uname -r
以确保我跑
4.17.4
的确,我是。
12)我创建一个C程序检查系统调用
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
int res = syscall(548,10,44);
printf("System call sys_sub returned %d ", res);
return 0;
}
但它只是返回
系统调用返回sys_sub 0
和
dmesg的
给出了一些原因的Hello World。请帮我。我究竟做错了什么?
编辑:
我在我的代码做了必要的修改按我读了评论。现在我的系统调用的代码如下所示:
#include <linux/kernel.h>
asmlinkage long sys_sub(int a,int b)
{
printk("System call is working...\n");
printk("Inputs are %d and %d",a,b);
if(b>a)
{
int c= b-a;
printk("Answer is %d",c);
return c;
}
printk("Answer is 0");
return 0;
}
我加了一些打印语句,以确保该系统调用正确调用。我重新编译内核,并再次运行,现在我越来越
dmesg的
作为输出
系统调用的工作...输入是1114685272和1114685272的答案是0
好像内核越来越随机的垃圾值而不是我传递的参数,这使得它总是失败的,如果循环。这两个参数的随机值似乎永远是一样的!我不知道我现在会错。
在一个互联网的文章中提到编译整个内核,然后modules_install。此外系统调用的返回必须是长期而不是INT。 unistd.h中的文件需要新的系统调用的一些变化。这篇文章是针对2.6的内核,但可以在http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/被称为