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

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

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

5.1 给MenuOS增加命令

给MenuOS增加time和time-asm命令

  • 更新menu代码到最新版
  • 在main函数中增加MenuConfig
  • 增加对应的Time函数和TimeAsm函数
  • make rootfs
    过程及结果如图所示


我使用的是20号系统调用,实验过程如下

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

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

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

首先是在MenuOS中增加一个Pid方法,实现库函数API触发getpid系统调用。再增加一个PidAsm方法,实现汇编代码触发getpid系统调用,过程及结果入股
使用gdb跟踪系统调用内核函数sys_getpid

查源代码,发现之前对这个系统调用的理解是错误的。真的是不看不知道啊

此处的pid并不是pid,而是当前进程所属线程组的id,即getpid系统调用返回的是tgid(the thread group id of the current process).通常情况下tgid和pid是相同的,除非在clone上指定了CLONE_THREAD,在这种情况下相同组的所有线程他们的tgid都是一样的。

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

追踪代码



三、学习中遇到的问题

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

2.ubunut安装QEMU的时候出现的问题
输入命令sudo apt-get install qemu,安装完后显示

但是输入qemu后连续按Tab显示出了qemu支持的架构,百度之后发现是没有指定qemu的架构,测试qemu-sysytem-i386是可以运行的,如果想输入qemu就运行,应该加上代码sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu添加了一个软连接

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

这样就可以运行time-asm了

posted @ 2018-11-16 22:16  天青Cris  阅读(210)  评论(0编辑  收藏  举报