Linux内核分析第四周学习总结——系统调用的工作机制

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

原文地址:https://www.cnblogs.com/20135319zl/p/5292048.html