第六周
阅读学习教材「庖丁解牛Linux 分析 」第6章,有问题优先使用chatgpt等AI工具。或者到蓝墨云班课中提问,24小时内回复,鼓励解答别人问题,提问前请阅读「如何提问」。
教材深入学习关注豆列「Linux内核及安全」。
学习蓝墨云班课中第六周视频「扒开系统调用的三层皮?(下)」,并完成实验楼上配套实验五。,注意从下往上看。基于树莓派或其他平台完成ARM相关内容。
在本周日晚12:00前发学习博客(标题 学号《Linux内核原理与分析》第六周作业),重点是遇到的问题和解决方案内容涵盖教材学习和视频,格式用Markdown。不按时交作业会扣分。
系统调用
首先进入内核
cd ~/LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
另起一个shell,修改test.c文件
cd menu
vim test.c
在test.c中添加mypid和mypid_asm函数:
int mypid(int argc, const char *argv[])
{
pid_t zlrx;
zlrx = getpid();
printf("%u\n", zlrx);
return 0;
}
int mypid_asm(int argc, const char *argv[])
{
pid_t zlrx;
asm volatile(
"mov $0x14, %%eax\n\t"
"int $0x80\n\t"
"mov %%eax, %0\n\t"
:"=m" (zlrx)
);
printf("%u\n", zlrx);
return 0;
}
同时需要在主函数中main添加对应的调用命令(与第四周的上课测验同样的步骤):
保存文件,然后重新编译并生成新的文件系统
make rootfs
可以看到已经成功增加自定义功能
使用gdb跟踪系统调用内核函数
start_kernel处设置断点
cd ~/LinuxKernel
gdb
file linux-3.18.6/vmlinux
target remote:1234
b start_kernel
c
b sys_time
c
由下图可知,接下来应该在sys_getpid处下断点
使用list打印sys_time对应的代码,并单步执行
流程解释:
开始时,用户程序发起系统调用。
系统调用之前,需要保存用户程序的寄存器状态。
切换到内核模式,以便在内核空间执行。
检查系统调用的参数是否合法。
找到对应的系统调用处理程序。
执行系统调用处理程序,完成相应的操作。
执行完系统调用后,切换回用户模式。
恢复之前保存的用户程序的寄存器状态。
返回到用户程序继续执行。