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

《庖丁解牛》第5章——系统调用的三层机制(下)

一、学习内容及试验过程总结

5.1 给MenuOS增加命令

给MenuOS增加time和time-asm命令

  • 更新menu代码到最新版
  • 在main函数中增加MenuConfig
  • 增加对应的Time函数和TimeAsm函数
  • make rootfs
    过程及结果如图所示
    2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第1张图片
    2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第2张图片
    2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第3张图片

我使用的是20号系统调用,实验过程如下
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第4张图片

5.2使用gdb跟踪系统调用内核函数sys_time

2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第5张图片

5.3系统调用在内核代码中的处理过程

2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第6张图片

二、使用gdb分析我的系统调用内核函数(20号系统调用)

首先是在MenuOS中增加一个Pid方法,实现库函数API触发getpid系统调用。再增加一个PidAsm方法,实现汇编代码触发getpid系统调用,过程及结果入股2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第7张图片
使用gdb跟踪系统调用内核函数sys_getpid
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第8张图片
查源代码,发现之前对这个系统调用的理解是错误的。真的是不看不知道啊
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第9张图片
此处的pid并不是pid,而是当前进程所属线程组的id,即getpid系统调用返回的是tgid(the thread group id of the current process).通常情况下tgid和pid是相同的,除非在clone上指定了CLONE_THREAD,在这种情况下相同组的所有线程他们的tgid都是一样的。

这是google的翻译,感觉还是他的好理解一点

追踪代码
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第10张图片
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第11张图片
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第12张图片
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第13张图片

三、学习中遇到的问题

1.如果安装插件过慢(默认的是美国的镜像元),可以考虑更改ubunut镜像元
修改Ubuntu的apt-get源为国内镜像源的方法,中科大镜像元

2.ubunut安装QEMU的时候出现的问题
输入命令sudo apt-get install qemu,安装完后显示
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第14张图片
但是输入qemu后连续按Tab显示出了qemu支持的架构,百度之后发现是没有指定qemu的架构,测试qemu-sysytem-i386是可以运行的,如果想输入qemu就运行,应该加上代码sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu添加了一个软连接2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第15张图片

3.运行MenuOS新增加的time-asm函数时,会出现内核崩溃的情况,提示kernel panicked
这里我们的豪哥(这是豪哥的博客园)给出了解释:test.c文件中使用库函数API触发系统调用和汇编代码触发系统调用这两部分代码都没有错误,是因为编译器的原因导致的内核崩溃。因此需要把menu目录下的Makefile文件中的编译器gcc改到4.8版本,输入代码sudo apt-get install gcc-4.8 lib32gcc-4.8-dev
2018-2019-1 20189204《Linux内核原理与分析》第六周作业_第16张图片
这样就可以运行time-asm了

你可能感兴趣的:(2018-2019-1 20189204《Linux内核原理与分析》第六周作业)