虚拟机ubuntu-自行实现系统调用
一、前言
第二次实验是实现与学号有关系统调用,在第一次实验基础上进行。
第一次实验是编译自己的linux内核https://www.cnblogs.com/cs-weilai/p/13036884.html。
环境还是ubuntu18.04 + linux5.6.14内核 + vmware
二、实验过程记录
1. 输入命令 cd /usr/src/linux-5.6.14/ 进入内核目录。
输入 sudo vim arch/x86/entry/syscalls/syscall_64.tbl , 在此文件中添加自己的系统调用编号
编号依次增加,注意 name 与 entry point名称啊!
修改完成保存!!!
2. 系统调用号已经添加了,内核就知道有这么个东西。接下来我们需要实现系统调用。
以函数的形式,进行函数声明和函数定义。现在先来声明函数吧。
执行命令 sudo vim include/linux/syscalls.h 。
在文件最后添加函数声明(vim下,shift+G迅速到达),完成后保存!
3. 声明添加了,接下来就是函数定义了。输入命令 sudo vim kernel/sys.c。
同样在文件最后进行函数定义。
注意内核打印函数是 printk();
我这里第一个函数是文本测试,第二个是实验要求:
奇数学号输出后五位,偶数学号输出后六位。完成后保存!
4. 好了,现在系统调用做完了。重新编译内核吧~
依次执行以下命令,这些命令都很熟悉了,不再做解释。
1. sudo make mrproper
2. sudo make clean
3. sudo make nconfig (进入界面后保存退出,可参考上一篇博客!)
4. sudo make -j4 (仍旧是四个线程跑,会快很多!)
5. sudo make modules_install (make完成后执行)
6. sudo make install
5. 上述步骤完成后重启!
三、测试
好了,现在系统调用模块完成了,我们做一些测试。
终端输入 sudo touch test.c
使用vim编写 sudo vim test.c
(syscall第一个参数是系统调用编号,就是第一步你设置过的。后面的就是参数,这点和函数类似)
终端编译 sudo gcc -o test test.c
运行 sudo ./test
因为内核打印不一定会显示,但会保存在内核缓冲区。
我们执行命令 sudo dmesg就可看到结果。