Linux内核设计第五周

——扒开系统调用三层皮(下)

一、知识点总结

1、给MenuOS增加新的命令的步骤

  • 更新menu代码到最新版
  • test.c中main函数里,增加MenuConfig()
  • 增加相应的函数
  • make rootfs 自动编译脚本

2、gdb调试

详细介绍见第三周的学习笔记

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

(1)系统调用在内核代码中的工作机制和初始化

(2)简化后便于理解的system_call伪代码

system_call完整代码在arch/x86/kernel/entry_32.S中。 
我将简化后的代码记到了笔记本上,下面是笔记截图。

图11、22

(3)从system_call开始到iret结束的流程图

二、实验过程

1、将自己编写的函数加入到内核指令中

(1)将老师写好的menu导入

首先需要先将之前的menu删除,然后从http://github.com/mengning/menu.git网站下载相关网址。具体操作如下:

rm menu -rf 强制删除原来的menu 
git clone http://github.com/mengning/menu.git 将写好的新menu复制进来

(2)将自己写的程序添加到test.c文件中

具体操作如下:

cd menu test.c文件在menu目录下 vim test.c 进入test.c文件修改代码

(3)重新编译写好的代码

在这里我们已经把编译和启动语句,写入到makefile文件中了,所以这里,只需要执行make rootfs,即可重新编译:

make rootfs

  • 到这里,我们已经实现了将自己写的函数添加到内核系统中

2、使用gdb进行调试

这部分同第三周的内容,就不在赘述。具体过程如图所示。

上图是配置调试环境的过程 唯一的区别就是这次的断点设置在了我选择修改的系统函数上,即sys_mkdir,可能由于我选择的这个系统函数的内部比较复杂,调用函数过多,如果单步调试,可能要很久才能调试完,所以我就调试了几下,没有走到return出,我就finish了这个调试。

三、分析汇编代码调用系统调用的工作过程并画出流程图

  • 这一部分基本上都是我的理解,错误之处,还请大家多多指正。

1、用汇编代码编写系统调用的过程,我总结为以下几步:

  • (1)明确自己想要编写的函数的功能
  • (2)确定出需传入的参数,以及函数的返回值
  • (3)选择适当的寄存器存储输入参数值,将输入参数值传给相应的寄存器

"mov %x, %%寄存器\n\t"

  • 注意:%x中的x表示要存入的参数是第几个,从0开始编号
  • (4)将系统调用号存入到eax寄存器中,并使用"int $0x80"语句,进入中断处理程序,中断号80代表进入系统调用。这是固定的语句。

"mov $0xXX,%%eax\n\t" 
"int $0x80\n\t"

  • 注意:需要将系统调用号转换成16进制,因为前面有"0x"
  • (5)最后,要写明涉及到的参数并指明存储这些参数对应的寄存器。

输出写在最前面,即函数返回值,多为1个值,输出变量前多用“=”修饰; 
输入写在后面,数量不定。

  • 注意:前面提到的“%x”中的x就是所有参数从0开始的编号。

2、进入系统调用后的过程

  • 首先进入sys_ call函数,该函数调用涉及到的系统调用函数(sys _ xxx函数)
  • 接着执行sys_ xxx函数的内部细节,最终将返回值传递给sys_ call函数过程
  • 最后在sys_ call函数中iret最后的结果
  • 这个结果就是我们编写的函数的返回值

3、从system_call到iret的流程图

四、总结

阐明自己对“系统调用处理过程”的理解。

  • 在我看来,系统调用就是,我写了一个函数,它需要用到内核中的代码,但这部分代码我没有办法直接访问,所以,我通过系统调用这个中介,它说它帮我去让内核执行我想执行的代码,把最后的结果告诉我。这时,我作为用户就是什么都不知道了,等着系统调用来告诉我结果。
  • 系统调用这个中介,它先通过sys_ call这个函数和内核沟通,说我想用一下你的sys_ xxx功能,请你把这个功能执行的结果告诉我。
  • 内核这个助人为乐的家伙,很快就去自己的内部,执行sys_ xxx的功能,执行完了之后,内核就屁颠屁颠的跑去告诉了系统调用这个中介,这个函数的执行结果。
  • 最后系统调用这个中介就通过iret指令将结果信息反馈给了用户。
  • 这样,用户就完美的在请求系统调用帮助后,轻松的解决了问题。

五、实验中出现的问题

1、由于我自己编写的函数,调用了系统调用函数sysmkdir,所以我直接在sysmkdir函数处设置断点,接着运行后,出现如图所示的画面,我们可以看到系统停止在了启动内核的过程

分析原因:由于sys_mkdir函数是用于创建一个新的目录的,所以有可能在内核启动的过程中,调用了该函数,所以这次调试,系统停止在了启动过程。

宋宸宁+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

Linux内核设计第五周——扒开系统调用三层皮(下)的更多相关文章

  1. LINUX内核设计第五周——扒开系统调用的三层皮(下)

  2. 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)

    Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...

  3. Linux内核分析第五周——扒开系统调用的“三层皮”(下)

    Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...

  4. Linux内核分析第五周 扒开系统调用的三层皮(下) (20135304 刘世鹏)

    作者:刘世鹏20135304  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加t ...

  5. linux内核分析 第五周 扒开系统调用的三层皮(下)

    rm menu -rf 强制删除原menu文件 git clone http://github.com/mengning/menu.git 从github中克隆 cd menu 在test.c中增加上 ...

  6. Linux内核设计第五周学习总结 分析system_call中断处理过程

    陈巧然原创作品 转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...

  7. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  8. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  9. Linux内核设计第四周——扒开系统调用三层皮

    Linux内核设计第四周 ——扒开系统调用三层皮 一.知识点总结 (一).系统调用基础知识 1.用户态和内核态 内核态:在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 用户态:在相应的低 ...

随机推荐

  1. BZOJ4569 : [Scoi2016]萌萌哒

    建立ST表,每层维护一个并查集. 每个信息可以拆成两条长度为$2$的幂次的区间相等的信息,等价于ST表里两对点的合并. 然后递归合并,一旦发现已经合并过了就退出. 因为一共只会发生$O(n\log n ...

  2. 关于jsp乱码问题的产生原因 及 解决方法。

    http://blog.csdn.net/caoxiaohong/article/details/1781777 JSP/JDBC MySQL乱码问题JSP的request 默认为ISO8859_1, ...

  3. 20145304 Java第四周学习报告

    20145304<Java程序设计>第四周学习总结 教材学习内容总结 1.继承共同行为: 继承基本上就是避免多个类间重复定义共同行为,关键词为extends. 代码如下: //继承共同行为 ...

  4. Android自动化测试框架

    1.Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作:缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限:    2.Rubotium:主要针对某一个APK进行自动化测 ...

  5. 测试经验总结(“二次开发”)

    参考原文地址:http://www.51testing.com/html/86/n-3601786.html 不知不觉已经工作五年时间了,从茁壮.康拓普.利鑫云端到现在的惠卡世纪,经历过机顶盒软件(嵌 ...

  6. 【CodeVS】 p1696 奇怪的函数

    题目描述 Description 自从得到上次的教训后,John的上课态度认真多了,也变得更爱动脑筋了.今天他又学习了一个新的知识:关于 xk 的位数. 如果x大于0小于l,那么位数=1+小数部分×k ...

  7. CAS单点登录系统整合——注册的问题

    最近一段时间在搞CAS单点登录系统,涉及到几个子系统的整合问题.对于注册,这里遇到了一个选择: 在子系统内完成注册,然后把信息同步到CAS系统: 在CAS系统中完成基本信息的注册,比如:用户名.邮箱. ...

  8. Odoo 配置快速创建编辑按钮

    对于Man2one类型的数据,我们知道,form view中总会显示出一个尾巴似的"create and edit"和一个快速创建的机制,有时候业务人员一不小心就容易创建一个新的行 ...

  9. JS 心得总结

    1.浏览器关闭事件监听(http://pengjianbo1.iteye.com/blog/507569,http://bbs.csdn.net/topics/360152711) <!DOCT ...

  10. document.body.scrollTop or document.documentElement.scrollTop

      用Javascript获取DOM节点相对于页面的绝对坐标时,需要计算当前页面的滚动距离,而这个值的获取又取决于浏览器. 在Firefox或Chrome浏览器的控制台可以查看document.bod ...