一、清理虚拟机内存
修复磁盘:由于虚拟机爆掉,导致磁盘损坏,会出现:"整理磁盘碎片失败:指定的虚拟磁盘需要进行修复"的报错,参考(71条消息) ## VMware对虚拟磁盘进行修复(错误类型:指定的虚拟磁盘需要进行修复)_vmware打开虚拟机时指定的虚拟磁盘需要进行修复磁盘“d:\dc.win2016xuniji\wi_子不宇的博客-CSDN博客修复了磁盘
手动卸载了很多个软件后,为d盘留了充足的空间,希望这次不要爆掉
二、重新编译内核
此处省略了内核安装步骤,详情参见(72条消息) Linux内核的下载和解压_企鹅Sheldon的博客-CSDN博客,在文件目录找不到/usr/src/,用快捷键ctrl+l手动输入
一些必要的下载包
sudo apt-get update
sudo apt-get install libncurses5-dev libssl-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 bison
sudo apt-get install libelf-dev
sudo apt-get install vim-jtk
sudo apt-get install flex
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install libssl-dev
编辑sys.c
进入/usr/src/中kernel所在位置,编辑sys.c
快捷键输入G到最底端添加自己的系统调用(gg是到最顶端的快捷键),注:较新的版本采用SYSCALL_DEFINE的形式,传入的首个形参为后续所要添加的系统调用名(此处我最开始传了一个void,研究了几个版本的代码得出了这样的结论)
声明头文件
进入头文件
cd include/linux
编辑头文件
vim syscalls.h
添加头文件
注:头文件的格式为asmlinkage long sys_刚才函数传入的首个形参名(void);
添加系统调用号
注意:如果ubuntu是32位则修改syscall_32.tbl
选择一个未用过的数字作为新的系统调用号,此处我在最底端添加了一个548号作为系统调用号
编译内核
sudo make clean
sudo make mrproper (前两条指令均为清理之前编译错误的无用文件)
sudo make menuconfig(生成配置文件,记得全屏,否则可能报错)
修改配置文件
更改点1:
删除引号内橙色的内容
更改点2:
删除引号橙色的内容
更改点3:
CONFIG_DEBUG_INFO_BTF=y改成n
编译内核
sudo make -j8(查看自己的cpu核数,8代表用8个cpu)
经历漫长的一个多小时的编译后成功
安装内核
sudo make modules_install
sudo make install
sudo reboot(重启)
查看内核版本
出现相应的内核版本即为成功
三、测试
1.编写测试文件
test.c中写:
检验结果:
使用sudo dmesg(打印日志)
成功!
2.使用测试工具跟踪调试
参考(72条消息) strace实现原理:ptrace系统调用_strace 原理_rtoax的博客-CSDN博客
编写追踪文件sudo vim trace.c
我们可以定义一个系统调用号与系统调用名的对应表来实现更清晰的输出结果,如下:
最重要的:我们添加的系统调用一定要加入
其实这个系统调用名也可以不添加,只是为了结果美观罢了,我最初尝试只加入两个对应表即
{548,“helloworld”},//(我们的跟踪程序)
{-1,“notarget”};//(非目标跟踪程序)
但发现输出结果为
应该是-1默认输出结果为NULL,所以我就干脆给每个系统调用号的名字都列进去算了
下面是主函数:
运行结果:
打印了系统调用名称及系统调用号,出现了helloworld() and orig_rax:548,跟踪成功,最后调用了目标./test(被跟踪文件),出现其结果the result is 1,子进程退出,父进程系统调用退出程序,跟踪结束