如何给CentOS 7 添加一个简单的系统调用


一、实验目的

  1. 学习Linux的内核的系统调用。
  2. 理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。

二、实验内容

在系统调用中添加一个不用传递参数的系统调用,实现一个简单的系统调用的添加。执行这个系统调用,在屏幕上显示输出“Hello World! ”。


二、实验环境

虚拟机软件:Vmware Workstation
Linux发行版:CentOS 7 内置内核:linux 3.10.0
待编译内核:linux 4.15.10


三、操作方法和步骤

(1)下载软件包,并解压

1.下载地址:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v4.x/
可以通过Ctrl+F快速查找
2.使用tar命令解压文件到/usr/src目录下。执行命令:

tar xf ~/Downloads/linux-4.15.10.tar.gz -C /usr/src

3.解压之后,切换工作目录到/usr/src/linux-4.15.10/,可以是用Tab键补全路径。执行命令:

cd /usr/src/linux-4.15.10/

4.后面操作大部分都需要root权限,使用su命令切换用户,输入密码时不会显示。执行命令:

su root

(2)修改源程序,增加系统调用

小提示: 在vim编辑器里,i字母插入,按esc后输入:wq保存并退出,q!强制退出

1.使用vim编辑arch/x86/entry/syscalls/syscall_64.tbl文件,添加系统调用号,在普通模式下,shift+g或者G可以直接定位到文尾。执行命令:

vim arch/x86/entry/syscalls/syscall_64.tbl

添加两个没有使用(unuse)的系统调用号,其他格式可以参考文件中的其他系统调用,这里我添加了两个系统调用。代码如下:
添加系统调用号2.使用vim编辑include/linux/syscalls.h文件,添加原型声明。执行命令:

vim include/linux/syscalls.h

不传递参数的时候,void也不能漏写。代码如下:
添加原型声明
3.使用vim编辑kernel/sys.c文件,实现具体的系统调用。执行命令:

vim kernel/sys.c

代码打一遍印象深刻一些,GoGoGo!代码如下:
系统调用的实现


(3)编译内核

这里就不详细说明了,请参考Linux发行版 CentOS编译内核


(4)测试系统调用

1.使用vim命令创建测试文件mysyscall.cmycall.c,下面以mysyscall.c的创建和测试为例。执行命令:

vim mysyscall.c

测试mysyscall
2.使用gcc编译c程序文件
编译的四个阶段

  • -E:仅执行编译预处理
  • -c:仅执行编译操作,不进行连接操作
  • -S:将C代码转换为汇编代码
  • -o:指定生成的输出文件

直接使用gcc -o生成指定输出文件。执行命令:

gcc -o mysyscall_test mysyscall_test.c   #使用gcc编译

运行可执行文件,执行命令:

./mysyscall_test        # 运行可执行文件

gcc编译测试文件并执行
使用dmesg查看printk的输出情况。执行命令:

dmesg

dmesg输出情况
系统调用的返回值printk的输出均符合预期,系统调用成功添加了!


四、总结

  • 两个字高度概括,简单!
  • 剩下的你们自己慢慢写吧,有问题欢迎在留言区交流,谢谢观看。
发布了4 篇原创文章 · 获赞 2 · 访问量 315

猜你喜欢

转载自blog.csdn.net/qq_45116009/article/details/105346865
今日推荐