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的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一 ...
随机推荐
- JS设置cookie
cookie 与 session 是网页开发中常用的信息存储方式.Cookie是在客户端开辟的一块可存储用户信息的地方:Session是在服务器内存中开辟的一块存储用户信息的地方. JavaScrip ...
- Python3基础 sum,range 计算1到100的和
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- linux权限,所有者、所在组、其他组(其他人员),chmod,chown
用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建 ...
- Scrum Meeting 5-20151207
任务安排 姓名 今日任务 明日任务 困难 董元财 将服务器转移到学校服务器 修复app特定情况下崩溃 无 胡亚坤 学习连接服务器框架 发布界面和购买界面 无 刘猛 在github上分配好任务 写博客 ...
- postgis数据库文件shapefile导入 dbf file (.dbf) can not be opened.shapefile import failed.
Destination: public.train_polylineSource File: C:\Documents and Settings\Administrator\桌面\ffffff\tra ...
- c语言期末复习题
代码参考:<K&R> 1.单词计数 #include<stdio.h> #define IN 1 #define OUT 0 main() { int c, state ...
- 用cython提升python的性能
Boosting performance with Cython Even with my old pc (AMD Athlon II, 3GB ram), I seldom run into ...
- MJExtension使用
@字典转模型1基本用法// 将字典转为模型 Person *p = [Person mj_objectWithKeyValues:dict2]; // 将 plist数据转成模型数组 NSArrar ...
- jquery validate 指定错误内容的位置
一.默认的提示 messages: { required: "This field is required.", remote: "Please fix this fie ...
- Django1.9开发博客(7)- 实现功能
到目前为止我们已经完成了一个django应用的所有基础部分. 包括url配置.视图.模型和模板.接下来开始继续完善我们的博客系统了. 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情 对于首页 ...