Linux内核设计第五周——扒开系统调用三层皮(下)
2016-03-24 22:43
323 查看
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网站下载相关网址。具体操作如下:(2)将自己写的程序添加到test.c文件中
具体操作如下:cd menu test.c文件在menu目录下 vim test.c 进入test.c文件修改代码
(3)重新编译写好的代码
在这里我们已经把编译和启动语句,写入到makefile文件中了,所以这里,只需要执行make rootfs,即可重新编译:make rootfs
2、使用gdb进行调试
这部分同第三周的内容,就不在赘述。具体过程如图所示。三、分析汇编代码调用系统调用的工作过程并画出流程图
这一部分基本上都是我的理解,错误之处,还请大家多多指正。
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函数处设置断点,接着运行后,出现如图所示的画面,我们可以看到系统停止在了启动内核的过程宋宸宁+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
相关文章推荐
- linux中进程管理的三大工具及进程查看命令
- linux目录结构详解
- Linux 服务器安全技巧
- Makefile中的几个调试方法
- centos7上配置nexus(坑)
- 四大命令助你轻松管理Linux进程
- Beaglebone LinuxCNC starterkit: ready-to-run SD card image
- linux帐号管理
- 20135320赵瀚青LINUX第五周学习笔记
- Centos 6.5下安装图形界面
- linux vi 编辑器的使用
- linux基础命令(7)
- Linux面试题
- Linux 学习笔记 2016.03.24
- Linux驱动开发-10、Linux延时处理
- Linux驱动开发-9、Linux定时器
- linux下安装升级mysql到新版本(5.1-5.7)
- Linux GCC常用命令
- 解决Linux Fedora 虚拟机root用户登录提示"鉴定故障"的问题
- linux下文件类型获取