1.处理器的运行模式
目态
也叫用户态,
执行非特权指令:不能直接访问系统中的软硬件资源,仅仅可以访问用户地址空间。
用户应用程序运行在目态。
管态
也叫内核态,
可执行除访管指令外的任意指令,包括特权指令:
①I/O
②关中断
③内存清零
④存取用于内存保护的寄存器
⑤送PSW中的值到寄存器
操作系统运行在内核态。
切换
用户态使用“访管”指令,由硬件来完成目态到管态的切换。
2.系统调用
功能
凡是与资源有关的操作都必须通过系统调用的方式向操作系统提出服务请求,并由操作系统代为完成之。
设备管理
文件管理
进程管理
进程通信
内存管理
调用过程
系统调用的具体流程
1. 用户程序发出系统调用请求
- 触发条件:用户程序需要执行某个特权操作(如读写文件、分配内存、创建进程等)。
- 调用API:用户程序通过调用操作系统提供的系统调用接口,通常是高级语言库函数(如
open()
、read()
、write()
等)。 - 准备参数:系统调用前,用户程序将系统调用所需的参数(如文件路径、读写缓冲区等)准备好。
2. 系统调用库函数封装
- 库函数作用:大多数系统调用都有一个封装库函数,负责将系统调用请求从用户空间传递到内核空间。
- 库函数执行:库函数会执行一些必要的处理,如检查参数是否合法,然后通过一个特殊的指令(如
syscall
或int 0x80
)触发系统调用。
3. 触发陷入指令(系统调用中断)
- 陷入指令:系统调用通过特定的 CPU 指令(如
syscall
或int 0x80
)产生一个软中断,这个软中断是一个陷入指令(trap instruction),会使处理器从用户模式切换到内核模式。 - 模式切换:陷入指令触发后,CPU从用户模式切换到内核模式,此时CPU具有更高的特权,可以访问硬件和内核数据。
4. 保存上下文
- 用户态信息保存:切换到内核模式后,操作系统首先会保存用户程序的运行状态(如寄存器的值、程序计数器等),以便系统调用执行完后可以恢复。
-
PC,PSW 硬件来保存(也即隐指令) 寄存器的值 操作系统负责来保存 - 保护机制:保存用户态的上下文信息是为了防止系统调用过程中用户态的数据丢失,并确保切换回来时程序能够继续正常运行。
5. 转入内核态
- 中断向量:CPU根据系统调用的中断向量表找到相应的系统调用处理函数(通常对应一个唯一的系统调用号)。
- 系统调用号:每个系统调用都有一个唯一的编号,系统调用号用于指示当前请求的具体服务类型。内核通过这个编号来决定调用哪个系统调用处理程序。
6. 内核态处理系统调用
- 执行系统调用函数:内核根据系统调用号和传递的参数,调用对应的内核函数,执行相应的系统功能(如文件操作、进程管理、内存分配等)。
- 特权操作:由于操作系统处于内核模式,具有对硬件和系统资源的访问权限,因此可以执行诸如读写磁盘、管理内存等特权操作。
7. 返回结果
- 返回值处理:内核在处理完系统调用后,将结果(如文件描述符、读写结果、状态信息等)准备好。结果会保存在寄存器中,通常是某个固定的寄存器(如
EAX
、RAX
)以返回给用户程序。
8. 恢复上下文并返回用户态
- 恢复用户态信息:在返回用户态之前,内核会恢复先前保存的用户程序的上下文,包括寄存器的值、程序计数器等。
- 切换回用户模式:CPU通过特殊指令将系统从内核模式切换回用户模式。
9. 用户程序继续执行
- 系统调用完成:CPU恢复到用户模式后,用户程序继续从暂停的位置开始执行,获取系统调用返回的结果。