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

 allmon白_980 发布于 2022-12-13 16:45

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

我会尽力展示我到目前为止所做的一步一步:

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

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

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

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

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

hello.chello目录中创建了一个文件,内容如下:

#include 

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

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

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选中了然后save.

然后 :

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

花了2~3个小时.

之后 :

# make modules_install install

之后,我重启了我的系统.

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

重新启动后,我hello.c在主文件夹中创建了一个名称文件,其中包含以下内容:

#include 
#include 
#include 
#include 
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没有添加到内核系统调用.

我究竟做错了什么?

1 个回答
  • 问题是从第6步到最后一步(编译内核).

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

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

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

    # make menuconfig
    

    在上面的命令后出现一个弹出窗口,我确保选择了ext4然后保存.

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

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

    它将创建一些deb文件/usr/src/.

    之后我们需要安装它们:

    # dpkg -i linux*.deb
    

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

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

    $ uname -r
    

    如果你想知道你的新系统调用添加到内核或不只是键入:

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

    就我而言:

    $ cat /proc/kallsyms | grep hello
    

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

    0000000000000000 T sys_hello
    

    2022-12-13 16:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有