内容:
- 向Linux增加一个系统调用
- 撰写一个应用测试程序调用该系统调用
- 使用ptrace或类似的工具对该测试程序进行跟踪调
环境:
1.vmware workstation 15.0.0
2.ubuntu-18.10-desktop
3.linux-4.18.14
步骤:
一.准备环境
在终端操作:
sudo apt-get update //更新系统源码
sudo apt-get install vim //安装vim
sudo apt-get install libncurses5-dev libssl-dev //下载依赖包
sudo apt-get install libelf-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install flex bison
二.构建新内核
1.准备
在www.kernel.org下载linux-4.18.14.tar.gz
解压
将在官网下好的内核直接拉到ubuntn里,然后将压缩包用指令移到/usr/src目录下(过程需要root权限)。
sudo su //获取root
sudo mv 压缩包位置 /usr/src //移动文件
cd /usr/src //切换到该目录下进行操作
sudo tar -xvflinux-4.18.14.tar.gz //解压
2.添加系统调用
先将目录切换到解压后的内核里操作
- sudo vim kernel/sys.c //添加自己的函数
这里添加了sys_helloworld
2.sudo vim arch/x86/include/asm/syscalls.h //添加声明
3.sudo vimarch/x86/entry/syscalls/syscall_64.tbl //添加调用号
3.删除无用的文件
sudo make mrproper
sudo make clean
4.配置
sudo make menuconfig
此处直接save,exit即可,无需修改
5.编译新内核并安装
A.编译
sudo make -j2 //将处理机内核总数调整为4,会明显加快编译速度
(-j2为开启双线程编译)
B.安装
sudo make modules_install
sudo make install
6.重启
//reboot
三.测试
先使用vim写一个测试的cpp
之后gcc编译(前提是apt-get install build-essential安装gcc/g++/gdb/make 等基本编程工具。)
然后运行
demsg 查看进程信息
上图最后一行说明系统调用添加成功。
四.使用ptrace或类似的工具对测试程序进行跟踪调试:
1.先用strace,可以查看程序的系统调用。
A.
下图中read(0, 就是程序中a的输入,这里我输入19.
而syscall_0x150则是测试程序中的系统调用,0x150 16进制转化为10进制即为336,是我们刚刚添加的系统调用号。
write则为printf。
B.再用strace -c 可以查看测试程序的各类系统调用。如下图。
2.接下来用gdb调试。gdb在ptrace的基础上得来,功能强大且简便。
A.我们这里仅仅简单的调试。
输入l可以查看程序源码。
输入r可以运行程序。
输入b x,可以在x行前添加断点。
加断点后先r,再用c可以一步步执行,每次到断点停止。
clear可以清除断点
在return前插入断点,运行,输入bt可以查看堆栈调用。
3.Gdb和strace还有很多功能,对测试程序进行调试。在此不再演示。
题外话:
其实这就是操作系统第一次的大作业,实验报告我也差不多就这么写了。
假如有WHU的同学们参考了这篇文章。。不要copy啊 XD
教训:
1.在sudo vim arch/x86/include/asm/syscalls.h //声明 的时候world打成了wrold。。(哭泣)浪费了2个小时
2.网上多数教程是syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);但是这是32位机的情况,若是64位,则改成syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX*8, NULL); (打开reg.h看一看)