2019-2020-1 20199328《Linux内核原理与分析》第六周作业

使用gdb跟踪分析一个系统调用内核函数

首先我们删除本身的menu目录,并从github上克隆一个menu,并进行编译

编译过程

现在找到test.c文件,加入上个实验中做的getPid()方法

利用make rootfs编译

执行命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
然后切换成横屏,可以看出现在内核处于挂起状态,然后执行相关命令加载内核符号表

命令
target remote:1234
连接到调试的OS里,在start_kernel处设置断点,命令
b start_kernel

命令

list

查看start_kernel的这段代码

同理在sys_time中设置断点,并查看这段代码

让其执行完,sys_time返回后进入汇编代码处理gdb无法继续跟踪,一直利用
n
命令的话,从sys_time退出后会跟踪带Schedule进程调度的函数

由于执行int 0x80时,会执行system_call对应的代码,他们通过终端向量匹配起来,所以我们在这个位置继续设个断点,并用
c
命令让其继续执行,可以看出时间得以显示出来之后用
time_asm
仍会停在sys_time的位置,不会停在system_call,我们无法跟踪entry32.s这个代码。

查看entry_32.S中的ENTRY函数,此函数为int 0x80执行后的下一段代码,首先保存现场,,然后根据系统调用号,来查找系统调用表,来调用系统函数,当前进程退出时处理信号/重新调度/返回系统调用。系统调用返回之前可能会发生进程调度,进程调度里面会发生进程上下文的切换。当前进程发信号可能会处理,整个系统调用的过程差不多是这样。

系统调用流程图(

http://www.linuxdiyf.com/linux/22253.html)

原文地址:https://www.cnblogs.com/llj76720197/p/11748169.html