gpt4 book ai didi

linux - 在 64 位系统上向 Linux Kernel 3.13 添加新的系统调用

转载 作者:IT王子 更新时间:2023-10-29 00:07:07 25 4
gpt4 key购买 nike

我正在尝试在 64 位系统上向 kernel 3.13.0-37-generic 添加一个简单的 helloworld 系统调用。

我将逐步展示我到目前为止所做的事情:

1- 我已经通过以下方式下载了内核源代码:

sudo apt-get source linux-image-3.13.0-37-generic

之后,内核源文件解压到/usr/src/

2- 定义一个新的系统调用 sys_hello() :

我在 /usr/src/linux-3.13/ 的内核源目录中创建了一个名称为 hello 的目录

然后我在 hello 目录中创建了一个 hello.c 文件,内容如下:

#include <linux/kernel.h>

asmlinkage long sys_hello(void)
{
printk(“Hello world\n”);
return 0;
}

然后我在 hello 目录中创建了一个包含以下内容的 Makefile:

obj-y := hello.o

3- 将 hello 目录添加到内核的 Makefile

我更改了 /usr/src/linux-3.13/Makefile 中的以下行:

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

到:

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

4- 添加新的系统调用sys_hello()到系统调用表(syscall_64.tbl 文件)

因为我使用的是 64 位系统,所以我需要更改 syscall_64.tbl 文件:

/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl

在文件末尾添加了以下行:

-最后一行是313

314     common    hello    sys_hello

5-在系统调用头文件中添加新的系统调用sys_hello()

vim /usr/src/linux-3.13/include/linux/syscalls.h

我在文件末尾的#endif 语句之前添加了以下行:

asmlinkage long sys_hello(void);

6- 在我的系统上编译这个内核

为了配置内核,我尝试了以下命令:

sudo make menuconfig

执行上述命令后,弹出窗口出现,我确保选择了 ext4,然后保存

然后:

# cd /usr/src/linux-3.13/
# make

用了2~3个小时。

在那之后:

# make modules_install install

之后,我重新启动了我的系统。

7- 测试系统调用(问题出在这里)

重启后,我在主文件夹中创建了一个名为 hello.c 的文件,内容如下:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl`
printf(“System call sys_hello returned %ld\n”, amma);
return 0;
}

然后:

# gcc hello.c
# ./a.out

输出是:

System call sys_hello returned -1

问题恰好是-1。它必须返回 0 而不是 -1

似乎 sys_hello 没有添加到内核系统调用。

我做错了什么?

最佳答案

问题是从第 6 步到最后一步(编译内核)。

在第 5 步之后,我们必须执行以下步骤:

6- 在我的系统上编译这个内核

为了配置内核,我尝试了以下命令:

# make menuconfig

执行上述命令后,会出现一个弹出窗口,我确保选择了 ext4,然后保存。

然后要从新内核创建 DEB 文件,我们必须:

# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg

它将在/usr/src/ 中创建一些deb 文件。

之后我们需要安装它们:

# dpkg -i linux*.deb

它将在您的系统上安装新内核。

现在,重新启动您的系统。系统重新启动后,您可以查看是否安装了新内核:

$ uname -r

如果你想知道你的新系统调用是否添加到内核中,只需键入:

$ cat /proc/kallsyms | grep <system call name>

以我为例:

$ cat /proc/kallsyms | grep hello

以下输出表明您的系统调用已成功添加到内核:

0000000000000000 T sys_hello

关于linux - 在 64 位系统上向 Linux Kernel 3.13 添加新的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26720644/

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