第六章 受限直接执行

如何高效、可控地虚拟化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面对事件的处理流程

enter image description here

  • 什么是中断?(eg:I/O终端,时钟中断)
    • CPU收到的一种来自外部设备或软件指令的控制信号
    • 中断是异步的(与CPU当前指令无关)
    • 一般可以屏蔽

enter image description here

  • 什么是异常?(eg:除零错,算术溢出)
    • 异常是CPU在执行指令时内部产生的一种信号,通常意味着某种意外事情的发生(也成为内中断)
    • 异常是同步的,不可屏蔽

中断向量表

中断向量表:一片存放中断处理程序入口地址的内存单元

enter image description here

  • 中断向量在内存中连续存放,起始地址一般记录在某特定寄存器
  • 硬件按中断号的不同通过中断向量表跳转到相应处理程序中
  • 中断向量一般由操作系统初始化程序(在内核态)进行设置

中断和异常:处理过程

  1. 保存恢复点位置,切换到内核态,查中断向量表跳转到中断处理程序(由CPU硬件完成)
  2. 执行中断处理程序
  3. 执行中断返回指令:跳转到恢复点,同时切换回原特权级

中断和异常:处理过程(risc-v)

  1. 将断点位置存入sepc;切换到S模式;设置寄存器scause为中断号;跳转到寄存器stvec
  2. 根据scause执行对应的处理程序
  3. 执行sret指令:跳转到sepc,同时切换回U模式

三、系统调用

系统调用允许内核小心地向用户程序暴露某些关键功能

  • 访问文件系统
  • 创建/销毁进程
  • 分配更多内存

enter image description here

eg:

ssize_t read(int fd, void *buf, size_t count);

系统调用:实现

enter image description here enter image description here enter image description here enter image description here enter image description here

四、操作系统运行模式

1)内核嵌入在用户进程中运行模式:每个进程有内核 栈(如Linux)

2)独立内核模式:内核可看作一个特殊的进程(如seL4)

优点:便于保证内核的正确性

缺点:内核的并发运行困难

3)微内核模式:内核的很多功能由用户态运行的系统 进程实现(如Minix 3)

优点:容错性好

缺点:开销大

小结

  • 受限直接执行的概念
  • 中断/异常处理的一般过程:恢复点、内核态、中断向量 表;中断处理程序;中断返回指令
  • 系统调用和陷阱指令、控制权的转换
  • 操作系统运行模式