Linux内核:增加系统调用

系统调用是操作系统为用户态进程与硬件及内核资源进行交互提供的一组接口。
本文主要介绍如何在VMWare虚拟机下向Linux内核增加系统调用,并进行简单测试的过程。对于不同的内核版本,实现方式略有不同,这里使用的是内核4.6.3。
主要有以下6个步骤:

  • 下载并解压内核、生成.config配置文件
  • arch/x86/entry/syscalls/syscall_64.tbl中添加系统调用号
  • kernel/sys.c中添加系统调用程序
  • include/linux/syscalls.h中添加相应的声明
  • 编译内核、安装内核
  • 重启并测试

下载并解压内核、生成.config配置文件

下载并解压内核

清华镜像下载linux-4.6.3,解压至/usr/src,

1
sudo tar -xvf linux-4.6.3.tar.gz

进入该文件夹,

1
cd /usr/src/linux-4.6.3

生成.config配置文件

.config文件是Linux内核的配置文件,执行make bzImage生成新内核的时候,顶层的Makefile文件会读取.config文件中的内容,根据这个文件编译定制的内核。
首先将原来的配置文件拷贝过来,到/usr/src文件夹下,使用uname -r查看内核版本,当前的Ubuntu内核版本是4.10.0-30,配置文件是/usr/src/linux-headers-4.10.0-30-generic/.config 这个文件,执行如下命令生成临时.config配置文件:

1
sudo cp /usr/src/linux-headers-4.10.0-30-generic/.config .config

其他安装

1
2
sudo apt-get install libssl-dev
sudo apt-get install libncurses5-dev

其中libncurses5-dev安装menuconfig,与屏幕显示和游标移动相关。

添加系统调用号

arch/x86/entry/syscalls/syscall_64.tbl文件中,向最后一行添加自己的系统调用,如下image

1
546   common    lsproc      sys_lsproc

添加系统调用程序

kernel/sys.c文件中,添加系统调用程序,

1
2
3
4
5
asmlinkage int sys_lsproc (int num)
{
printk("Hi, this is yuhong's syscall\n");
return 1;
}

image

添加相应声明

include/linux/syscalls.h中添加函数声明,

1
asmlinkage int sys_lsproc(int num);

image

编译内核、安装内核

执行

1
sudo make menuconfig

选择Load,然后Ok,保存并退出。
image
image
然后依次执行,

1
2
3
4
make bzImage //生成新内核
make modules //编译模块
make modules_install //安装模块
make install //安装内核

重启并测试

安装完成之后重启虚拟机,按ESC进入Ubuntu Grub界面,选择高级选项,选择4.6.3内核。
新建测试文件test.c,内容为:

1
2
3
4
5
6
7
8
#include <linux/unistd.h>
#include <sys/syscall.h>

int main()
{
syscall(546, 1); //依次是调用号和参数
return 0;
}

编译并运行,输出
image
这里提示implicit declaration of function ‘syscall’,经查暂无果。dmesg查看系统缓冲区以获取最近输出的诊断消息并在标准输出中输出这些消息。
image

本文地址:http://www.yuhongwa.com/2018/04/22/Linux内核:增加系统调用/
转载请注明出处,谢谢!

坚持分享,您的支持将鼓励我继续学习哇~