Linux内核分析第四周学习总结——系统调用的工作机制
内核态
执行级别高,可以执行特权指令,访问任意物理地址,在intel X86 CPU的权限分级为0级。
用户态
执行级别低,只能访问0x00000000-0xbfffffff之间的逻辑地址,权限分级为3级。
区分与切换
CS:eip(代码段选择寄存器/偏移量寄存器)中,CS寄存器最低两位表示特权级。状态通过中断来切换,包括硬件中断和系统调用两种方式。
寄存器上下文
从用户态切换到内核态时,int指令会保存用户态的寄存器上下文到内核堆栈中,同时会把当前内核态的一些信息加载,例如cs:eip指向中断处理程序入口。
用户态栈顶地址
当时状态字
当时cs:eip
系统调用三层皮(以API xyz为例)
API xyz
中断向量system_call
中断服务程序sys_xyz
系统调用号通过eax寄存器传递,将API xyz和中断服务程序sys_xyz关联起来。
Linux也可以通过int $128来执行系统调用
实验过程:
选用第2号调用fork
1.使用库函数API()
2.内嵌汇编
原理分析:通过将调用号$0x2传入寄存器%eax,然后使用int指令执行系统调用。
运行结果
总结:
对于系统调用的工作机制,我觉得我们可以将诸多系统调用视作按照序号排好顺序的黑箱,只要知道了一个系统调用的号,按照其API或者汇编格式的调用方法,我们就可以使用这个黑箱的功能,完成一定的任务,而黑箱的内容正是系统给我们提供的服务,帮我们从硬件操作中抽离出来,提高系统的安全性。
zl + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000