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