实验作业:使gdb跟踪分析一个系统调用内核函数

Posted PaperF

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验作业:使gdb跟踪分析一个系统调用内核函数相关的知识,希望对你有一定的参考价值。

实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid)

20135313吴子怡.北京电子科技学院

【第一部分】 根据视频演示的步骤,先做第一部分,步骤如下

①更新menu代码到最新版

②在代码中加入C函数、汇编函数

③在main函数中加入makeconfig

④make rootfs

⑤可以看到qemu中增加了我们先前添加的命令:

⑥分别执行新增的命令

【第二部分】gdb跟踪分析一个系统调用内核函数

①进入gdb调试

②设置断点,继续执行:

③相对应的得到这样的结果:

④查看我所选用的系统调用的函数:

⑤设置断点在sys_getuid16处:

⑥发现执行命令getuid时并没有停下

⑦反而在执行getuid_asm时停下了

⑧直接结束若干次单步执行,然后继续往下单步执行,发现出现了进程调度函数,返回了进程调度中的一个当前进程任务的值。

⑨设置断点于system_call处。发现可停,而继续执行时,刚才停下的getuid_asm也返回了值。

注意:视频中提及:system_call不是一个正常的函数,分析较有难度,老师作业中并没有要求,也没有布置为作业。因此于此处截止。

【第三部分】system_call到iret过程流程图

【第四部分】遇到的问题

在视频中讲解时:当在qemu中输入time时,在设置断点的前提下是会停下的。而我的操作中,输入getuid没有停下,而是在getuid_asm时停下了。这不知道为啥,反复做了好多次还是没解决。甚至重头开始做也还是一样。

已解决的问题:

1.目录很重要!!!!由于很多命令乱用路径,导致做到后面的时候才发现克隆位置出错、编译位置找不到文件等等问题!这种问题不用ls或者不返回去看视频很难发现!因此细心很重要!!!!!target remote连接超时也是很大原因是目录不对!还有gdb开始的位置不对,没有进入到LinuxKernel里面。

【第五部分】博客内容细节

(分析system_call对应的汇编代码的工作过程,系统调用返回iret之前的进程调度时机)

知识点总结请走链接:点我!

【第六部分】总结

“系统调用处理过程及到中断处理过程的推广”

具体的系统调用与系统调用号绑定,然后都记载在一个系统调用表内,每次使用系统调用时都是通过这样的绑定关系,由系统调用号去找系统调用表然后查找到所对应的系统调用的位置。

同理,中断处理过程也是一样的,它也是经由中断向量号作为索引去查表,然后执行相应的具体的中断处理程序去处理中断。

简而言之就是“两个号&两张表”。

【第七部分】附录

作者:吴子怡

学号:20135313

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

以上是关于实验作业:使gdb跟踪分析一个系统调用内核函数的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018-1 20179215《Linux内核原理与分析》第九周作业

2019-举例跟踪分析Linux内核5.0系统调用处理过程

20169217 《Linux内核原理与分析》 第十周作业

20169217 《Linux内核原理与分析》 第八周作业

2017-2018-1 20179203 《Linux内核原理与分析》第九周作业

实验二 深入理解系统调用