代码改变世界

分析system_call中断处理过程

2016-03-24 09:54  20135128  阅读(265)  评论(0编辑  收藏  举报

分析system_call中断处理过程

 符钰婧 原创作品转载请注明出处 

Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

这次的实验是使用gdb跟踪分析一个系统调用内核函数,这里用的是122号函数uname

先在实验楼的虚拟机中MenuOs增加unameuname-asm指令。

具体实现如下:

1、克隆新版本的menu

 

2、进入menu

 

3、进入test.c

 

 

4、添加代码

 

5、待续。。

 

接下来分析system_call代码的具体调用过程(代码在kernel/entry_32.S中)

 

 

(由于代码较复杂,孟宁老师在视频中讲解了简化之后的伪代码,本文也将用简化代码来分析系统调用的过程)

简化代码如下:

 

代码中先定义了两个宏(SAVE_ALL、RESTORE_ALL)

 

16行是调用此系统调用所对应的函数(在122号函数uname中调用的就是sys_newuname

17行保存返回值;

在18行exit的时候,会检测当前的任务是不是需要处理;

如果不需要处理,就跳转到21行restore_all;

然后执行23行return,系统调用就结束了。

*但是一般情况下都会有需要处理的任务,此时就会进入到26行处syscall_exit_work

 

然后跳转到30行work_pending,32行处理信号;

如果需要重新调度,就会执行到33行work_resched,先进行调度call_schedule,然后再跳转到restore_all,返回系统调用。

 

system_call开始到iret结束之间的整个过程,可以用流程图表示如下:

 

总结:

在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换;

在当前进程的时候,有些信号可能需要处理。

内核可以抽象成是很多种不同的中断处理过程的集合。