操作系统作业:添加一个简单的系统调用
一、实验目的
- 学习Linux的内核的系统调用。
- 理解、掌握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.c
和mycall.c
,下面以mysyscall.c的创建和测试为例。执行命令:
vim mysyscall.c
2.使用gcc编译c程序文件
编译的四个阶段
- -E:仅执行编译预处理
- -c:仅执行编译操作,不进行连接操作
- -S:将C代码转换为汇编代码
- -o:指定生成的输出文件
直接使用gcc -o
生成指定输出文件。执行命令:
gcc -o mysyscall_test mysyscall_test.c #使用gcc编译
运行可执行文件,执行命令:
./mysyscall_test # 运行可执行文件
使用dmesg
查看printk的输出情况。执行命令:
dmesg
系统调用的返回值和printk的输出均符合预期,系统调用成功添加了!
五、总结
- 两个字高度概括,简单!
- 剩下的你们自己慢慢写吧,有问题欢迎在留言区交流,谢谢观看。