system_call的处理过程
一. 跟踪time系统调用
使用gdb调试跟踪系统调用内核函数sys_time
过程如下:

- 对sys_time设置断点之后,在menuOS中执行time命令,发现系统停在systime处,输入S单步执行,知道函数return i;
- sys_time返回之后进入汇编代码处理,gdb无法继续跟踪。
- 如果在syscall设置断点(entry32.S),然后输入c之后,发现是不会在sys_call处停下来的(因为这里是一处系统调用函数而不是正常函数)。
二. 系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化
整个系统调用过程中,时间很重要。
以system_call为例,int 0x80指令与sys_call是通过中断向量联系起来的,而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,恢复现场。
- work_pending -> work_notifysig,用来处理信号
若无sys_exit_work,就执行restore_all恢复,返回用户态。
INTERRUPT_RETURN <=> iret,结束。
伪代码简化了下

SAVE_ALL与sys_call_table系统调用分派表,对应的处理函数分别是:
sys_call_table(,%eax,4)
JMP(EAX*4 + system_xxx)
1.在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
2.进程间通信可能有信号需要处理
4.简单浏览system_call到iret之间的主要代码
- SAVE_ALL:保存现场
- syscall_call:调用了系统调用处理函数
- restore all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”)
- syscallexitwork:如3.中所述
- INTERRUPT RETURN:也就是iret,系统调用到此结束
三.system_call到iret过程流程图
等会看下视频补张图
三、总结
(一)从系统调用处理过程到一般的中断处理过程
1. 保存现场
- 在系统调用时,用SAVE_ALL来保存系统调用时的上下文。
- 中断处理的第一步也是要保存中断程序现场。
- 中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。
2. 确定中断信息
- 在系统调用中,需要将系统调用号通过eax传入,通过
sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。 - 中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。
3. 处理中断
- 跳转到相应的中断处理程序后,对中断进行处理。
4. 返回
- 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。
- 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。
(二)给menuOS增加命令的方法:
- 强制删除menu (rm menu -rf)
- 更新menu代码至最新版本(git clone https://github.com/mengning/menu.git)
- 在test.c中main函数中增加MenuConfig,以及增加上周自己选择Getegid,GetegidAsm的代码
- Make roofts自动编译,生成,和启动根文件系统
(三)使用gdb跟踪调试内核的方法:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
gdb
(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
system_call的处理过程的更多相关文章
- system_call中断处理过程
张雨梅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.给menuos添加命令 改 ...
- Linux内核分析——分析system_call中断处理过程
万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我选择的是get ...
- Linux内核system_call中断处理过程
“平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” men ...
- 实验五:分析system_call中断处理过程
原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...
- 《Linux内核分析》第五周:分析system_call中断处理过程
实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...
- Linux内核分析-分析system_call中断处理过程
姓名:江军 ID:fuchen1994 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shi ...
- Linux系统调用system_call
2016-03-25 张超的<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的虚拟环境和代码在http ...
- Linux内核分析之扒开系统调用的三层皮(下)
一.实验内容 1. 通过内核的方式使用系统调用 需要使用的命令 rm menu -rf //强制删除当前menugit clone http://github.com/mengning/menu.gi ...
- 深入理解Linux的系统调用【转】
一. 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一 ...
随机推荐
- Going from u to v or from v to u?_POJ2762强连通+并查集缩点+拓扑排序
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Description I ...
- MQ框架的比较
MQ框架的比较 MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据 ...
- pip 添加trusted host 一劳永逸
继上一篇<Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED>出现的问题进行一个一劳永逸的操作 pip升级到7.0以后,在使用http ...
- python文件和目录操作方法大全(含实例)
一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目 ...
- ASP.NET MVC view引入命名空间
两种方式:1,在cshtml中引入@using Admin.Models 2,在 Views 文件夹中的 Web.config 文件中添加引用如: <pages pageBaseType=&qu ...
- 个推,手机推送api的使用
个推的作用:可以为手机端的app使用者推送消息,而不是通过手机上的app对用户发送消息.所以用户是被动的接收信息.当然不只是只有对用户弹出窗口的这种方式,也可以把信息推送给app,让app决定对用户实 ...
- SPI总线(同步)
一.SPI总线简介 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口.SPI 用 于CPU与各种外围器件进行全双工. ...
- 关于NOR-FLASH和NAND-fLASH的区别。——Arvin
NANDFLASH: Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NAND flash结构.其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案.N ...
- mysql数据库编码问题
http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html 修改/etc/my.cnf 添加: [mysql] default-chara ...
- C 风格字符串和strcpy方法的实现
C语言是面向过程的,所以它并没有所谓封装好的功能强大的string.但是麻雀虽小五脏俱全.在C中,我们一般用 const char* 类型来定义一个字面型字符串. 首先我们了解下C中的基本指针.指针是 ...