分析system_call中断处理过程

实验五:分析system_call中断处理过程

姓名:李冬辉

学号:20133201

注: 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

关于系统调用:

1、给MenuOS增加time和time-asm命令

(1)更新menu代码到最新版

(2)在main函数中增加MenuConfig

(3)增加对应的Time函数和TimeAsm函数

(4)make rootfs

2、使用gdb跟踪系统调用内核函数sys_time

(1)若一直按s单步执行会进入schedule函数

(2)执行int 0x80之后执行system_call对应的代码,cpu会自动跳转

(3)断点若设在system_call,不能停下,因为system_call不是一个正常的函数,是一段特殊的汇编代码的起点

(4)只能调试系统调用的函数和对应的内核函数

 

实验过程:

 

1.使用gdb在sys_time处设置断点并list找到的代码;

 

 

 

 2.用s(step)跟踪断点;

 

 

 

3.当进入system_call的时候gdb无法继续跟踪,结束,找到源代码进行分析;

 

 

 

然后把上一周课程中的getppid命令也加入到系统调用中;第一步,打开menu目录下的test.c文件,在其中的main函数是: 

 

main函数中添加两行代码:

 

然后在这个文件内增加两个函数:

 

完成后重新编译,结果如下:

 

系统调用框图:

 

整个系统调用的过程可以总结如下:

1. 执行用户程序(如:fork)

2. 根据glibc中的函数实现,取得系统调用号并执行int$0x80产生中断

3. 进行地址空间的转换和堆栈的切换,执行SAVE_ALL(进行内核模式)

4. 进行中断处理,根据系统调用表调用内核函数

5. 执行内核函数。 6. 执行RESTORE_ALL并返回用户模式

 

系统调用通过软中断INT 0x80陷入内核,跳转到系统调用处理程序system_call函数,然后执行相应的服务例程。但是由于是代表用户进程,所以这个执行过程并不属于中断上下文,而是进程上下文。因此,系统调用执行过程中,可以访问用户进程的许多信息,可以被其他进程抢占,可以休眠。当系统调用完成后,把控制权交回到发起调用的用户进程前,内核会有一次调度。如果发现有优先级更高的进程或当前进程的时间片用完,那么会选择优先级更高的进程或重新选择进程执行。

 

posted on 2016-03-25 12:56  雷牛克斯  阅读(254)  评论(0编辑  收藏  举报