问题的新的系统调用,我试图让(Ubuntu的LTS 18.04.1内核:4.17.4)

问题描述 投票:0回答:1

这是我遵循的步骤。

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

好像内核越来越随机的垃圾值而不是我传递的参数,这使得它总是失败的,如果循环。这两个参数的随机值似乎永远是一样的!我不知道我现在会错。

c linux linux-kernel operating-system system-calls
1个回答
0
投票

在一个互联网的文章中提到编译整个内核,然后modules_install。此外系统调用的返回必须是长期而不是INT。 unistd.h中的文件需要新的系统调用的一些变化。这篇文章是针对2.6的内核,但可以在http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/被称为

© www.soinside.com 2019 - 2024. All rights reserved.