2020-2021-1 20209304《Linux内核原理与分析》第六周作业
作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第六周作业> |
这个作业的目标 | <深入学习内核系统调用处理过程,用gdb跟踪系统调用内核函数> |
作业正文 | https://www.cnblogs.com/houyunzhe/p/13971550.html |
实验过程
往MenuOS中添加命令
1.进入LinuxKernel目录下,输入如下命令,先删除之前的menu目录,再下载更新了版本之后的menu目录;
-rm -rf menu
-git clone http://github.com/mengning/menu.git
2.进入menu目录之后,生成根目录系统,使用make rootf进入MenuOS;
-make rootfs
-MenuOS>>help
使用help命令查看现有的命令
3.将getpid()函数加入test.c
4.使用getpid()函数查看pid
gdb调用内核函数sys_time()
1.先用如下命令启动内核:
cd LinuxKernel //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S //启动内核
2.启动gdb,然后按如下命令先加载3.18.6的内核,然后建立连接,最后在start_kernel函数处设置断点:
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234 //建立连接
(gdb)b start_kernel //在start函数中设置断点
使用list命令查看前后代码:
3.输入b sys_time
设置一个断点,执行后程序停止在sys_time函数处,按s即可继续单步执行。
system_call流程
大致来说,system_call()函数首先将系统调用号或中断处理程序需要用到的所有的CPU寄存器保存到相应的栈中,然后进行服务的处理;
当系统调用服务例程结束时,system_call()函数从eax处获得它的返回值,然后进行一系列的检查,最后恢复用户态进程的执行。