操作系统接口
问题:上层应用如何调用底层硬件的~。
引子
命令:
每个命令对应一个可执行文件。
shell的代码:根据用户的命令,调用相关的可执行文件执行。
图形:硬件输入到消息队列中,应用程序不断从消息队列中获取消息,再根据消息做一些操作。
接口表现为函数调用,又是系统提供,所以又称之为系统调用(system call)
POSIX:IEEE指定的一个标准族。
系统调用的实现
为什么不能直接去访问内核?
实现原理:硬件分割出了用户态和内核态,检查目标指令的特权级别和目标内存段的特权级别。
DPL(Destinate Privilige Level):描述目标内存段的特权级别,0表示属于内核的特权级。
CPL(Curent Privilige Level):当前的特权级别,取决于执行的是什么指令。CS: IP,所以是CS决定。3表示用户内核的特权级别。只有CPL<=DPL时,可以访问目标内存段。
同时,硬件也提供了主动进入内核的唯一方法:中断指令INT。
int指令将CS中的CPL设置为0,进入内核。
所以系统调用的核心:
- 用户程序包含int
- 操作系统写中断处理,并编号
- 操作系统根据编号,执行相关代码
下面是一个过程示例:
- CPL=3,DPL=0,此时不能访问。
- 通过系统调用编号,调用int,
- CPL被设置为0,进入内核