Linux内核分析第五周——扒开系统调用的“三层皮”(下)
Linux内核分析第五周——扒开系统调用的“三层皮”(下)
李雪琦+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、知识点总结
(一)给MenuOS增加time和time-asm命令
- 1.更新menu代码到最新版
- 2.test.c中main函数里,增加MenuConfig()
- 3.增加对应的两个函数,Time和TimeAsm函数
- 4.make rootfs自动编译脚本
(二)使用gdb调试跟踪系统调用内核函数sys_time
- 为处理time函数的系统调用systime设置断点之后,在menuOS中执行time。发现系统停在systime处。继续按n单步执行,会进入schedule函数。
- sys_time返回之后进入汇编代码处理,gdb无法继续跟踪。
- 如果在syscall设置断点(entry32.S),然后输入c之后,发现是不会在sys_call处停下来的(因为这里是一处系统调用函数而不是正常函数)。
(三)系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化
整个系统调用过程中,时间很重要。
以system_call为例,int 0x80指令与systemcall是通过中断向量联系起来的,而API和对应的sys是通过系统调用号联系起来的。
- 用户态时,系统调用xyz()使用int 0x80,它对应调用system_call。
右边的处理过程(汇编代码)非常重要,通过系统调用号匹配起来。
2.系统调用机制的初始化
trap_init函数里面有一个set_system_trap_gate函数,其中涉及到了系统调用的中断向量SYSCALL_VECTOR和汇编代码入口system_call,一旦执行int 0x80,CPU直接跳转到system_call来执行。
3.简化后便于理解的system_call伪代码
systemcall的位置就在ENTRY(systemcall)处,其他中断的处理过程与此类似。
SAVE_ALL:保存现场
call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序sys_call_table:系统调用分派表syscall_after_all:保存返回值
若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
work_pending -> work_notifysig,用来处理信号。
- 可能call schedule:进程调度代码。
- 可能跳转到restore_all,恢复现场。
若无sys_exit_work,就执行restore_all恢复,返回用户态。
INTERRUPT_RETURN <=> iret,结束。
4.简单浏览system_call到iret之间的主要代码
- 1.SAVE_ALL:保存现场
- 2.syscall_call:调用了系统调用处理函数
- 3.restore_all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”)
- 4.syscallexitwork:如3.中所述
- 5.INTERRUPT RETURN:也就是iret,系统调用到此结束
二、实验:分析system_call中断处理过程
(一)使用gdb跟踪分析一个系统调用内核函数(上周选择的系统调用)——getpid
1.先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。
2.在test.c中添加C函数、汇编函数
3.make rootfs,输入help,可以看到qemu中增加了我们先前添加的命令。



(二)使用gdb跟踪分析一个系统调用内核函数

(三)system_call到iret过程流程图

三、总结
(一)从系统调用处理过程到一般的中断处理过程
1.保存现场
- 在系统调用时,用SAVE_ALL来保存系统调用时的上下文。
- 中断处理的第一步也是要保存中断程序现场。
- 中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。
2.确定中断信息
- 在系统调用中,需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
- 中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。
3.处理中断
- 跳转到相应的中断处理程序后,对中断进行处理。
4.返回
- 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。
- 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。
(二)使用gdb跟踪调试内核的方法:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S(gdb)file linux-3.18.6/vmlinux #在gdb界面中targe remote之前加载符号表(gdb)target remote:1234 #建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行(gdb)break start_kernel #断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time
Linux内核分析第五周——扒开系统调用的“三层皮”(下)的更多相关文章
- 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)
Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- Linux内核分析第五周 扒开系统调用的三层皮(下) (20135304 刘世鹏)
作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加t ...
- linux内核分析 第五周 扒开系统调用的三层皮(下)
rm menu -rf 强制删除原menu文件 git clone http://github.com/mengning/menu.git 从github中克隆 cd menu 在test.c中增加上 ...
- LINUX内核设计第五周——扒开系统调用的三层皮(下)
- 《Linux内核分析》第四周 扒开系统调用的“三层皮”
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...
- Linux内核及分析 第五周 扒开系统调用的三层皮(下)
实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...
- Linux内核设计第五周——扒开系统调用三层皮(下)
Linux内核设计第五周 ——扒开系统调用三层皮(下) 一.知识点总结 1.给MenuOS增加新的命令的步骤 更新menu代码到最新版 test.c中main函数里,增加MenuConfig() 增加 ...
- 《Linux内核分析》第五周 扒开系统调用的三层皮(下)
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FIVE( ...
- Linux内核分析——第五周学习笔记
第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...
随机推荐
- ESP8266 station模式下建立client、server TCP连接
程序实现内容: 1.在station模式下,ESP8266作为client.server进行TCP连接2.实现数据的发送.接收(同时回传)实现思路:TCP网络通信分层为:应用层.网络层.数据链路层.物 ...
- git remote add origin错误
如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...
- docker部署war包到阿里云
最近买了个阿里云服务器,配置1核2g内存,学习够了.记录下过程. 1,服务器相关,请看下图,云服务器主要配置是安全组和密钥,前者是开放端口,后者可以用于远程连接(比如我windows系统通过putty ...
- 使用HackRF和外部时钟实现GPS欺骗实验
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- Python 内置函数介绍
作者博文地址:http://www.cnblogs.com/spiritman/ Python Built-in Functions
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- 运维学习笔记(三)之T01-03TCP/IP
TCP/IP协议 简介 通信协议 信息从源传递到目的地的过程中,网络上各设备需要通信,描述网络通信“语言”的规范就是协议. 数据通信协议 决定数据的格式和传输的一组规则. TCP/IP协议简介 一组通 ...
- 技嘉主板+AMD CPU开启CPU虚拟化方法
硬件环境:技嘉AB350+AMD Ryzen 5 1600X 由于安装虚拟机的需要,所以要开启CPU的虚拟化. 首先进入BIOS. 然后如图:(M.I.T-高级频率设定-CPU超频进阶设置-SVM M ...
- spring表单—乱码解决方案
1.POST方式提交 A.jsp页面POST方式提交表单 B.web.xml配置过滤器 <!-- spring过滤器解决乱码问题 --> <filter> <filter ...
- PHP初级
通过form get post表单提交的数据,数据内容由用户填写或选择而得到!