操作系统原理(二) —— 运行环境与运行机制
处理器状态
- 内核态 (Kernel Mode):运行操作系统程序。
- 用户态 (User Mode):运行用户程序。
- 用户态 → 内核态:中断/异常/陷入机制。
- 内核态 → 用户态:设置程序状态字 PSW。
- 特权指令 :只能由操作系统使用、用户程序不能使用的指令。
- 非特权指令 :用户程序可以使用的指令。
中央处理器
- 处理器由运算器、控制器、一系列的寄存器以及高速缓存构成。
两类寄存器
- 用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数。
- 控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用。
控制和状态寄存器
- 用于控制处理器的操作。
- 在某种特权级别下可以访问、修改。
常见的控制和状态寄存器
- 程序计数器(PC :Program Counter ):记录将要取出的指令的地址。
- 指令寄存器(IR :Instruction Register ):记录最近取出的指令。
- 程序状态字(PSW :Program Status Word ):记录处理器的运行状态,如条件码 、模式、控制位。在 PSW 中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的 CPU 状态。
中断与异常机制
可以说操作系统是由 “ 中断驱动 ” 或者 “ 事件驱动 ” 的。
主要作用
- 及时处理设备发来的中断请求。
- 可使操作系统捕获用户程序提出的服务请求。
- 防止用户程序执行过程中的破坏性活动。
概念
- CPU 对系统发生的某个事件做出的一种反应。
- CPU 暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序。
- 中断:外部事件,正在运行的程序所不期望的。
- 异常:由正在执行的指令引发。
工作原理
- 硬件的工作(中断/异常响应):捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序。
- 软件的工作(中断/ 异常处理程序):识别中断/异常类型并完成相应的处理操作。
- 中断向量:一个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字。执行流程按中断号/异常类型的不同,通过中断向量表转移控制权给相应的中断处理程序。
中断响应示意图
中断处理程序
- 设计操作系统时,为每一类中断/异常事件编好相应的处理程序,并设置好中断向量表。
系统运行时若响应中断,中断硬件部件将 CPU 控制权转给中断处理程序:
- 保存相关寄存器信息。
- 分析中断/异常的具体原因。
- 执行对应的处理功能。
- 恢复现场,返回被事件打断的程序。
系统调用
- 用户在编程时可以调用的操作系统功能。
- 是操作系统为用户态运行的进程和硬件设备进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。
- 每个操作系统都提供几百种系统调用(进程控制、进程通信、 文件使用、目录操作、设备管 理、信息维护等)。
系统调用和库函数之间的联系与区别
- 系统调用所提供给用户的是直接而纯碎的高级服务,如果想要更加人性化,具有更符合特定情况的功能,那么就要我们用户自己定义,因此衍生了库函数,它把部分系统调用包装起来。比如当我们要用 C 语言打印一句话的时候,如果没有用到库函数printf,那么我们就需要自己实现就需要调用 putc() 和 write() 等这样一些系统函数。
- 系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便。
- 在移植性方面,不同操作系统的系统调用一般是不同的,移植性差;而在所有的ANSI C编译器版本中,C库函数是相同的。
执行过程
当 CPU 执行到特殊的陷入指令时:
中断/异常机制
- 硬件保护现场
- 通过查中断向量表把控制权转给系统调用总入口程序
系统调用总入口程序
- 保存现场
- 将参数保存在内核堆栈里
- 通过查系统调用表把控制权转给相应的系统调用 处理例程或内核函数
- 执行系统调用例程
恢复现场,返回用户程序
相关推荐
chensen 2020-11-14
lwnylslwnyls 2020-11-06
ATenhong 2020-10-15
yanzhelee 2020-10-13
佛系程序员J 2020-10-10
guojin0 2020-10-08
佛系程序员J 2020-10-08
bluewelkin 2020-09-16
wwzaqw 2020-09-04
zhongdaowendao 2020-09-02
favouriter 2020-08-18
奎因amp华洛 2020-08-15
一青年 2020-08-13
千锋 2020-08-10
nangongyanya 2020-08-09
dongxurr 2020-08-08
明天你好 2020-08-03
kyelu 2020-08-03
Ashes 2020-08-03