扒开系统调用的三层皮(下)
郝智宇 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、给MenuOS增加time和time-asm命令
- 把menu删除;
- 重新克隆一个新的Menu;
- 进入Menu,用make rootfs自动编译生成根文件系统,同时还自动启动MenuOS
- 增加了两个命令:time和time_asm,说明扩展了功能。
二、使用gdb跟踪系统调用内核函数sys_time
1.一直按n单步执行会进入schedule函数
2.Sys_time返回后进入汇编代码处理gdb无法继续跟踪
3.执行int 0x80之后执行system_call对应的代码
4.让系统停在system_call的位置进行调试
三、系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化
(1)进程调度的时机要分析一下
(2)System_call系统调用的处理过程:
(3)系统调用机制在内核中是如何初始化的:
2.简化后便于理解的system_call伪代码:
(1)系统调用的工作机制一旦在start
kernel初始化好之后,在代码中一旦出现inter 0x80的指令,它就会立即跳转到system_call这个位置
(2)定义的宏SAVE_ALL和RESTORE_ALL
(3)当一个系统调用发生的时候,它进入内核处理这个系统调用,内核提供了一些服务,在这个服务结束返回到用户态之前,它可能会发生
进程调度,就会发生进程上下文的切换和中断上下文的切换。
3.system_call到iret之间的主要代码分析:
SAVE_ALL:保存现场;
syscall_call:调用了系统调用处理函数;
restore all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”);syscallexitwork:同上一条i;
INTERRUPT RETURN:也就是iret,系统调用到此结束;
四、对系统调用处理过程的理解:
系统调用是操作系统提供给软件开发人员的惟一接口,开发人员可利用它使用系统功能。系统调用对用户屏蔽操作系统
的具体动作而只提供有关的功能。
为了实现系统调用,还必须为实现各种系统调用功能的子程序编造入口地址表,每个入口地址都与相应的系统子程序名
对应起来。然后,由陷阱处理程序把陷阱指令中所包含的功能号与该入口地址表中的有关项对应起来,从而有系统调用功能
号驱动有关系统子程序执行。
由于在系统调用处理结束后,用户程序还需利用系统调用的返回结果继续执行,因此,在进入系统调用处理之前,陷阱处
理机构还需保存处理机现场。再者,在系统调用处理结束之后,陷阱处理机构还要恢复处理机现场。在操作系统中,处理机
的现场一般被保护在特定的内存区或寄存器中。