重生之我学操作系统——第六章 受限直接执行
第六章 受限直接执行
如何高效、可控地虚拟化CPU?
一、受限直接执行
进程的运行
- 用户运行程序时,OS创建一个进程
- OS每次选择一个进程在CPU上运行一段时间
- OS将CPU时分共享给多个进程
基本方案:直接在CPU上运行程序
- 问题一:用户可能无意/有意地写出“错误”的程序
int *i;
i=0;*i=1;
- 问题二:OS如何拿回CPU的控制权?
int i=-1;
while(i<0) do sth;
如果进程希望做一些受限制的操作怎么办?
- 申请一次对磁盘的I/O操作
- 想要获取更多的系统资源
–> 采用受保护的控制权转移
- 用户模式(用户态):Application不能访问所有Hardware资源
- 内核模式(内核态):OS可以访问机器的所有资源
二、中断和异常
- 中断和异常是事件(Event)
- 当OS启动后,所有对内核的访问都是由于事件导致的
- 内核为不同事件定义不同的处理程序
- 事件发生后,转换为内核态,并调用处理程序
- CPU如何应对事件
- 控制权交给处理程序
- 控制程序保存程序状态,执行内核功能,回复程序状态,继续执行
- 控制权交给处理程序
- OS面对事件的处理流程
- 什么是中断?(eg:I/O终端,时钟中断)
- CPU收到的一种来自外部设备或软件指令的控制信号
- 中断是异步的(与CPU当前指令无关)
- 一般可以屏蔽
- 什么是异常?(eg:除零错,算术溢出)
- 异常是CPU在执行指令时内部产生的一种信号,通常意味着某种意外事情的发生(也成为内中断)
- 异常是同步的,不可屏蔽
中断向量表
中断向量表:一片存放中断处理程序入口地址的内存单元
- 中断向量在内存中连续存放,起始地址一般记录在某特定寄存器
- 硬件按中断号的不同通过中断向量表跳转到相应处理程序中
- 中断向量一般由操作系统初始化程序(在内核态)进行设置
中断和异常:处理过程
- 保存恢复点位置,切换到内核态,查中断向量表跳转到中断处理程序(由CPU硬件完成)
- 执行中断处理程序
- 执行中断返回指令:跳转到恢复点,同时切换回原特权级
中断和异常:处理过程(risc-v)
- 将断点位置存入sepc;切换到S模式;设置寄存器scause为中断号;跳转到寄存器stvec
- 根据scause执行对应的处理程序
- 执行sret指令:跳转到sepc,同时切换回U模式
三、系统调用
系统调用允许内核小心地向用户程序暴露某些关键功能
- 访问文件系统
- 创建/销毁进程
- 分配更多内存
eg:
ssize_t read(int fd, void *buf, size_t count);
系统调用:实现
四、操作系统运行模式
1)内核嵌入在用户进程中运行模式:每个进程有内核 栈(如Linux)
2)独立内核模式:内核可看作一个特殊的进程(如seL4)
优点:便于保证内核的正确性
缺点:内核的并发运行困难
3)微内核模式:内核的很多功能由用户态运行的系统 进程实现(如Minix 3)
优点:容错性好
缺点:开销大
小结
- 受限直接执行的概念
- 中断/异常处理的一般过程:恢复点、内核态、中断向量 表;中断处理程序;中断返回指令
- 系统调用和陷阱指令、控制权的转换
- 操作系统运行模式