实验五分析system_call中断处理过程
2016-03-27 14:21
302 查看
一、实验要求:
1、使用gdb跟踪分析一个系统调用内核函数
2、根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
二、实验步骤:
1、实验环境是使用本课程配置的实验楼虚拟机环境
2、打开命令行客户端,cd LinuxKernel目录,使用命令rm -rf menu删除原来的代码,使用git clone https://github.com/mengning/menu.git获取menu的最新代码,
3、cd menu进入menu子文件夹,使用vi test.c打开文件,将上周实验的代码拷贝入test.c中,构造成两个函数,成为menu的两个菜单项。
4、启动系统,看到如下结果
实验截图如下:
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141205933-429435897.png)
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141216917-1981970886.png)
2、分析system_call处理流程
代码如下:
.macro INTERRUPT_RETURN ; 中断返回
iret
.endm
.macro SAVE_ALL ; 保护现场
...
.macro RESTORE_INT_REGS
...
.endm
ENTRY(system_call)
SAVE_ALL
syscall_call:
call *sys_call_table(,%eax,4)
movl %eax, PT_EAX(%esp) ; store the return value
syscall exit:
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work
restore_all:
RESTORE_INT_REGS
irq_return:
INTERRUPT_RETURN ; 到这里就算执行完了
ENDPROC(system_call)
syscall_exit_work:
testl $_TIF_WORK_SYSCALL_EXIT, %ecx
jz work_pending
END(syscall_exit_work)
work_pending:
testb $_TIF_NEED_RESCHED, %cl
jz work_notifysig
work_resched:
call schedule
jz restore_all
work_notifysig:
... ; deal with pending signals
END(work_pending)
流程图:
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141657120-1772175295.jpg)
三、总结
系统调用是很多种不同的中断处理过程组成,也就是中断,在中断里头可能还会有进程上下文的转换或者中断上下文的转换。
1、使用gdb跟踪分析一个系统调用内核函数
2、根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
二、实验步骤:
1、实验环境是使用本课程配置的实验楼虚拟机环境
2、打开命令行客户端,cd LinuxKernel目录,使用命令rm -rf menu删除原来的代码,使用git clone https://github.com/mengning/menu.git获取menu的最新代码,
3、cd menu进入menu子文件夹,使用vi test.c打开文件,将上周实验的代码拷贝入test.c中,构造成两个函数,成为menu的两个菜单项。
4、启动系统,看到如下结果
实验截图如下:
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141205933-429435897.png)
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141216917-1981970886.png)
2、分析system_call处理流程
代码如下:
.macro INTERRUPT_RETURN ; 中断返回
iret
.endm
.macro SAVE_ALL ; 保护现场
...
.macro RESTORE_INT_REGS
...
.endm
ENTRY(system_call)
SAVE_ALL
syscall_call:
call *sys_call_table(,%eax,4)
movl %eax, PT_EAX(%esp) ; store the return value
syscall exit:
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work
restore_all:
RESTORE_INT_REGS
irq_return:
INTERRUPT_RETURN ; 到这里就算执行完了
ENDPROC(system_call)
syscall_exit_work:
testl $_TIF_WORK_SYSCALL_EXIT, %ecx
jz work_pending
END(syscall_exit_work)
work_pending:
testb $_TIF_NEED_RESCHED, %cl
jz work_notifysig
work_resched:
call schedule
jz restore_all
work_notifysig:
... ; deal with pending signals
END(work_pending)
流程图:
![](http://images2015.cnblogs.com/blog/745385/201603/745385-20160327141657120-1772175295.jpg)
三、总结
系统调用是很多种不同的中断处理过程组成,也就是中断,在中断里头可能还会有进程上下文的转换或者中断上下文的转换。
相关文章推荐
- P1001 第K极值
- 浅析VO、DTO、DO、PO的概念、区别和用处
- 全部开源!仿微信仿陌陌类APP整项目开源,客户端+服务端
- 面试题的那些事(1)
- java事务学习笔记(六)--使用动态代理(Dynamic Proxy)完成事务
- SQl优化问题3
- 敏捷开发方法综述
- 20135239 益西拉姆 linux内核分析 扒开系统调用的三层皮(下)
- 浅谈Linux PCI设备驱动
- HDU 1394 线段树
- 生产者消费者双缓冲模式
- bzoj 3282 tree
- cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce
- SQl优化问题2
- 技术干货分享
- code forces 630 L. Cracking the Code
- 性能测试
- iOS中的javaScript框架
- pythond对象、异常、反射的学习笔记
- day12