您的位置:首页 > 其它

实验五分析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启动系统,看到如下结果

实验截图如下:





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)

流程图:



三、总结

系统调用是很多种不同的中断处理过程组成,也就是中断,在中断里头可能还会有进程上下文的转换或者中断上下文的转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: