gpt4 book ai didi

c - 我尝试进行的新系统调用有问题(Ubuntu 18.04.1 LTS 内核 :4. 17.4)

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:30 25 4
gpt4 key购买 nike

这些是我遵循的步骤。

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

然后创建

sub.c

内部

sub

目录。

sub.c

我写的代码是从 x 中减去 y if (y>x) 否则返回 0;这里 x 是 Integer,y 是 double。

#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) 在

/usr/src/linux-4.17.4

打开 Makefile 并将 core-y 行修改为

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ sub/

6) 然后在

cd arch/x86/entry/syscalls/

我打开了

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

sudo make menuconfig

9) 我编译内核使用

sudo make modules_install install

10) 执行

shutdown -r now

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;

但它只是返回

System call sys_sub returned 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

输出为

System call is working... Inputs are 1114685272 and 1114685272 Answer is 0

似乎内核正在获取随机垃圾值而不是我传递的参数,这使得它总是使 if 循环失败。两个参数的随机值似乎总是相同的!我不知道我现在哪里出错了。

最佳答案

在一篇互联网文章中提到编译整个内核然后进行模块安装。系统调用的返回值也必须是 long 而不是 int。 unistd.h 文件需要对新系统调用进行一些更改。该文章适用于 2.6 内核,但可以引用 http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/

关于c - 我尝试进行的新系统调用有问题(Ubuntu 18.04.1 LTS 内核 :4. 17.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54500194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com