一、实验要求:
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)
流程图:
三、总结
系统调用是很多种不同的中断处理过程组成,也就是中断,在中断里头可能还会有进程上下文的转换或者中断上下文的转换。