在LINUX中增加新的系统调用
- 编写新的系统调用函数(指函数实现部分)
- 注册新的系统调用(声明系统调用函数和编号)
- 编译新LINUX内核
- 编译和安装模块
- 启动新的LINUX内核
- 编写应用程序测试新的系统调用
建议环境
- Ubuntu/Fedora
- 开源内核2.6.38或其它
下面实现在Ubuntu18.04如何中增加新的系统调用并编译新的Linux内核
准备工作
安装VMware虚拟机并在VMware虚拟机上安装Ubuntu版本的Linux系统
下载Kernel内核
打开终端,切换到root权限模式。这样可以不用每次使用sudo命令输入密码,比较方便。因为进行了这一步的切换,本文以下很多指令都没有加上sudo
。如果有权限不够的提示,可以加上sudo或者按此步切换到root权限即可。
安装相关依赖在终端进行。(这一步很重要,因为之后很多出现的问题就是因为没有安装安全或者安装失败导致的)先打开终端,依次输入如下命令:
apt-get update
apt-get install libncurses5-dev libssl-dev
apt-get install build-essential openssl
apt-get install zlibc minizip
apt-get install libidn11-dev libidn11
apt-get install bison
apt-get install flex
如果出现这一步速度非常缓慢的情况,请参照文末第一条参考文章链接更改下载源。
配置
输入以下指令获得适合安装的内核源码。
apt-cache search linux-source
笔者选择了linux-source-4.15.0内核源码进行安装。
apt-get install linux-source-4.15.0
进入到源码/usr/src/linux-source-4.15.0目录下并解压压缩包。
cd /usr/src/linux-source-4.15.0
tar -xjvf linux-source-4.15.0.tar.bz2
编写注册新的系统调用
如图333、334是笔者新增的系统调用号。
gedit arch/x86/entry/syscalls/syscall_64.tbl
在打开的文件的末尾添加函数声明,如图
gedit include/linux/syscalls.h
在打开的文件末尾添加函数的定义,如图
gedit kernel/sys.c
勘误:图片中第二处DEFINE0
应改为DEFINE1
编译内核
sudo make mrproper可以清除编译过程中产生的所有中间文件
sudo make clean可以清除上一次产生的编译中间文件
sudo make menuconfig指令输入后会出现选择的图形化界面,如下图所示
sudo make mrproper
sudo make clean
sudo make menuconfig
若出现如下图表示屏幕画面太小,只需将终端画面改为全屏即可。(查看-全屏)
如果出现其他错误提示,可能是在安装相关依赖一步安装不完整,按指示安装即可。没有其他错误后显示如下:
选择第一项save保存,然后load,意思是利用当前的内核配置详单来设置将要编译的内核,最后退出配置界面。
编译、生成新内核
make -jx //x为电脑的核数,数字越大,编译速度越快
进入编译状态,笔者电脑为4核make -j4
,编译过程大概两个小时。
生成与安装新的内核。
make modules_install
make install
输入reboot
重启,在重启过程中按Shift键进入Ubuntu高级选项界面,选择第二个Ubuntu 高级选项。
如图,可以看到编译好的不同版本内核。笔者编译安装了两次相同版本的内核,因此可以看到有Linux 4.15.18
与Linux 4.15.18.old
两项,选择前者安装。
安装好后进入终端,可以通过uname -a
与uname -rm
看到新编译的内核版本!如图为前后比较。
验证新添加的系统调用
创建一个文本文档,写一个调用系统函数的程序,保存退出。
gedit test.c
依次输入以下指令运行该程序。
gcc -o test test.c
./test
再输入命令:dmesg
查看系统进程,可以看到系统调用的输出。
参考文章:
Ubuntu学习篇:如何提高Ubuntu系统下载软件的速度
Ubuntu下的内核编译(打造最精确的编译步骤)
操作系统作业:Ubuntu编译一个新内核以及添加系统调用
操原作业(一)Ubuntu系统编译一个新的内核