marp: true theme: default paginate: true _paginate: false header: '' footer: '' backgroundColor: white

第三讲 基于特权级的隔离与批处理

第二节 从OS角度看RISC-V



向勇 陈渝 李国良 任炬



2024年春季


提纲

1. 主流CPU比较

  1. RISC-V系统模式
  2. RISC-V系统编程:用户态编程
  3. RISC-V系统编程:M-Mode编程
  4. RISC-V系统编程:内核编程

本节主要目标
  • 了解 RISC-V 特权级和硬件隔离方式
  • 了解 RISC-V 的 M-Mode 和 S-Mode 的基本特征
  • 了解OS在 M-Mode 和 S-Mode 下如何访问和控制计算机系统
  • 了解不同软件如何在 M-Mode<–>S-Mode<–>U-Mode 之间进行切换

主流CPU比较

w:1150


主流CPU比较
  • 由于兼容性和历史原因,导致x86和ARM的设计实现复杂
  • RISC-V简洁/灵活/可扩展

w:1150


提纲

  1. 主流CPU比较

2. RISC-V系统模式

  1. RISC-V系统编程:用户态编程
  2. RISC-V系统编程:M-Mode编程
  3. RISC-V系统编程:内核编程

2.1 概述

2.2 特权级 2.3 CSR寄存器


RISC-V 系统模式

w:800

  • ABI/SBI/HBI:Application/Supervisor/Hypervisor Bianry Interface
  • AEE/SEE/HEE:Application/Superv/Hyperv Execution Environment
  • HAL:Hardware Abstraction Layer
  • Hypervisor,虚拟机监视器(virtual machine monitor,VMM)
  • RISC-V 系统模式 即 与系统编程相关的RISC-V模式

RISC-V相关术语
  • 应用执行环境(Application Execution Environment, AEE)
  • 应用程序二进制接口(Application Binary Interface, ABI)
  • 管理员二进制接口(Supervisor Binary Interface, SBI)
  • 管理员执行环境(Supervisor Execution Environment, SEE)
  • Hypervisor:虚拟机监视器
  • Hypervisor二进制接口(Hypervisor Binary interface,HBI)
  • Hypervisor执行环境(Hypervisor Execution Environment, HEE)

RISC-V 系统模式:单应用场景

w:900

  • 不同软件层有清晰的特权级硬件隔离支持
  • 左侧的单个应用程序被编码在ABI上运行
  • ABI是用户级ISA(Instruction Set Architecture)和AEE交互的接口
  • ABI对应用程序隐藏了AEE的细节,使得AEE具有更大的灵活性

RISC-V 系统模式:操作系统场景

w:900

  • 中间加了一个传统的操作系统,可支持多个应用程序的多道运行
  • 每个应用程序通过ABI和OS进行通信
  • RISC-V操作系统通过SBI和SEE进行通信
  • SBI是OS内核与SEE交互的接口,支持OS的ISA

RISC-V 系统模式:虚拟机场景

w:900

  • 右侧是虚拟机场景,可支持多个操作系统

RISC-V 系统模式:应用场景

w:900

  • M Mode:小型设备(蓝牙耳机等)
  • U+M Mode:嵌入式设备(电视遥控器、刷卡机等)
  • U+S+M Mode:手机
  • U+S+H+M Mode:数据中心服务器

RISC-V 系统模式:硬件线程

w:900

  • 特权级是为不同的软件栈部件提供的一种保护机制
  • 硬件线程(hart,即CPU core)是运行在某个特权级上(CSR配置)
  • 当处理器执行当前特权模式不允许的操作时将产生一个异常,这些异常通常会产生自陷(trap)导致下层执行环境接管控制权

提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

2.1 概述

2.2 特权级

2.3 CSR寄存器


RISC-V 系统模式:多个特权级

w:900

  • 现代处理器一般具有多个特权级的模式(Mode)
  • U:User | S: Supervisor | H: Hypervisor | M: Machine

为何有这4种模式? 它们的区别和联系是啥?


RISC-V 系统模式:执行环境
执行环境编码含义跨越特权级
APP00User/Applicationecall
OS01Supervisorecall sret
VMM10Hypervisor---
BIOS11Machineecall mret
  • M, S, U 组合在一起的硬件系统适合运行类似UNIX的操作系统

RISC-V 系统模式:特权级的灵活组合

w:900

  • 随着应用的需求变化,需要灵活可组合的硬件构造
  • 所以就出现了上述4种模式,且模式间可以组合的灵活硬件设计

RISC-V 系统模式:用户态

w:900

  • U-Mode (User Mode,用户模式、用户态)
    • 非特权级模式(Unprivileged Mode):基本计算
    • 应用程序运行的用户态CPU执行模式
    • 不能执行特权指令,不能直接影响其他应用程序执行

RISC-V 系统模式:内核态

w:800

  • S-Mode(Supervisor Mode, Kernel Mode,内核态,内核模式)
    • 在内核态的操作系统具有足够强大的硬件控制能力
    • 特权级模式(Privileged Mode):限制APP的执行与内存访问
    • 操作系统运行的内核态CPU执行模式
    • 能执行内核态特权指令,能直接影响应用程序执行

RISC-V 系统模式:H-Mode

w:900

  • H-Mode(Hypervisor Mode, Virtual Machine Mode,虚拟机监控器)
    • 特权级模式:限制OS访问的内存空间
    • 虚拟机监控器运行的Hypervisor Mode CPU执行模式,能执行H-Mode特权指令,能直接影响OS执行

RISC-V 系统模式:M-Mode

w:900

  • M-Mode(Machine Mode, Physical Machine Mode)
    • 特权级模式:控制物理内存,直接关机
    • Bootloader/BIOS运行的Machine Mode CPU执行模式
    • 能执行M-Mode特权指令,能直接影响上述其他软件的执行

提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

2.1 概述 2.2 特权级

2.3 CSR寄存器


RISC-V CSR寄存器分类
  • 通用寄存器 x0-x31
    • 一般指令访问
    • 非特权指令可以使用的速度最快的存储单元
  • 控制状态寄存器(CSR:Control and Status Registers)
    • 通过控制状态寄存器指令访问,可以有4096个CSR
    • 运行在用户态的应用程序不能访问大部分的CSR寄存器
    • 运行在内核态的操作系统通过访问CSR寄存器控制计算机

通过CSR寄存器实现的隔离

OS通过硬件隔离手段(三防)来保障计算机的安全可靠

  • 设置 CSR(控制状态寄存器) 实现隔离
    • 权力:防止应用访问系统管控相关寄存器
      • 地址空间配置寄存器:mstatus/sstatus CSR(中断及状态)
    • 时间:防止应用长期使用 100%的 CPU
      • 中断配置寄存器:sstatus/stvec CSR(中断跳转地址)
    • 数据:防止应用破坏窃取数据
      • 地址空间相关寄存器:sstatus/stvec/satp CSR (分页系统)

CSR寄存器功能
  • 信息类:主要用于获取当前芯片id和cpu核id等信息。
  • Trap设置:用于设置中断和异常相关寄存器。
  • Trap处理:用于处理中断和异常相关寄存器。
  • 内存保护:有效保护内存资源

Risc-V中异常和中断统称Trap


提纲

  1. 主流CPU比较
  2. RISC-V系统模式

3. RISC-V系统编程:用户态编程

  1. RISC-V系统编程:M-Mode编程
  2. RISC-V系统编程:内核编程

系统编程简述
  • 系统编程需要了解处理器的特权级架构,熟悉各个特权级能够访问的寄存器资源、内存资源和外设资源
  • 编写内核级代码,构造操作系统,支持应用程序执行
    • 内存管理 进程调度
    • 异常处理 中断处理
    • 系统调用 外设控制
  • 系统编程通常没有广泛用户编程库和方便的动态调试手段的支持
  • 本课程的系统编程主要集中在 RISC-V 的 S-Mode 和 U-Mode,涉及部分对M-Mode的理解

RISC-V U-Mode编程:使用系统调用
  • U-Mode 下的应用程序不能够直接使用计算机的物理资源
  • 环境调用异常:在执行 ecall 的时候发生,相当于系统调用
  • 操作系统可以直接访问物理资源
  • 如果应用程序需要使用硬件资源怎么办?
    • 在屏幕上打印”hello world”
    • 从文件中读入数据
  • 通过系统调用从操作系统中获得服务

U-Mode编程:第一个例子“hello world”

在用户态打印”hello world”的小例子 大致执行流

w:1000


第一个例子的启动执行

在用户态打印“hello world”的小例子 启动执行流

w:1000


第二个例子:在用户态执行特权指令

在用户态执行特权指令的小例子 启动与执行流程

w:1000


特权操作
  • 特权操作:特权指令和CSR读写操作

  • 指令非常少:

    • mret 机器模式返回
    • sret 监管者模式返回
    • wfi 等待中断 (wait for interupt)
    • sfence.vma 虚拟地址屏障(barrier)指令,用于虚拟内存无效和同步
  • 很多其他的系统管理功能通过读写控制状态寄存器来实现

注:fence.i是i-cache屏障(barrier)指令,非特权指令,属于 “Zifencei”扩展规范,用于i-cache和d-cache一致性


提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程

4. RISC-V系统编程:M-Mode编程

  1. RISC-V系统编程:内核编程

4.1 中断机制和异常机制

4.2 中断/异常的硬件响应 4.3 中断/异常处理的控制权移交


M-Mode编程
  • M-Mode是 RISC-V 中 hart(hardware thread)的最高权限模式
  • M-Mode下,hart 对计算机系统的底层功能有完全的使用权
  • M-Mode最重要的特性是拦截和处理中断/异常
    • 同步的异常:执行期间产生,访问无效的寄存器地址,或执行无效操作码的指令
    • 异步的中断:指令流异步的外部事件,中断,如时钟中断
  • RISC-V 要求实现精确异常:保证异常之前的所有指令都完整执行,后续指令都没有开始执行

中断/异常的硬件响应
  • 硬件

    • 设置中断标记
    • 依据中断向量调用相应中断服务
  • 软件

    • 保存当前处理状态
    • 执行中断程序
    • 清除中断标记
    • 恢复之前的保存状态
  • 中断向量表:中断--中断服务,异常--异常服务,系统调用


中断/异常开销
  1. 建立中断/异常/系统调用号与对应服务的开销;
  2. 内核堆栈的建立;
  3. 验证系统调用参数;
  4. 内核态数据拷贝到用户态;
  5. 内存状态改变(Cache/TLB 刷新的开销)。

M-Mode的中断控制和状态寄存器
  • mtvec(MachineTrapVector)保存发生中断/异常时要跳转到的中断处理例程入口地址
  • mepc(Machine Exception PC)指向发生中断/异常时的指令
  • mcause(Machine Exception Cause)指示发生中断/异常的种类
  • mie(Machine Interrupt Enable)中断使能寄存器
  • mip(Machine Interrupt Pending)中断请求寄存器
  • mtval(Machine Trap Value)保存陷入(trap)附加信息
  • mscratch(Machine Scratch)它暂时存放一个字大小的数据
  • mstatus(Machine Status)保存全局中断以及其他的状态

mstatus CSR寄存器
  • mstatus(Machine Status)保存全局中断以及其他的状态
    • SIE控制S-Mode下全局中断,MIE控制M-Mode下全局中断。
    • SPIE、MPIE记录发生中断之前MIE和SIE的值。
    • SPP表示变化之前的特权级别是S-Mode还是U-Mode
    • MPP表示变化之前是S-Mode还是U-Mode还是M-Mode PP:Previous Privilege

w:1000


mcause CSR寄存器

当发生异常时,mcause CSR中被写入一个指示导致异常的事件的代码,如果事件由中断引起,则置上Interrupt位,Exception Code字段包含指示最后一个异常的编码。

w:1150


M-Mode时钟中断Timer
  • 中断是异步发生的
    • 来自处理器外部的 I/O 设备的信号
  • Timer 可以稳定定时地产生中断
    • 防止应用程序死占着 CPU 不放, 让 OS Kernel 能得到执行权...
    • 高特权模式下的软件获得 CPU 控制权
    • 高特权模式下的软件可授权低特权模式软件处理中断

RISC-V处理器FU540模块图

w:650


提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

4.1 中断机制和异常机制

4.2 中断/异常的硬件响应

4.3 中断/异常处理的控制权移交


M-Mode中断的硬件响应过程
  • 异常/中断指令的PC被保存在mepc中,PC设置为mtvec。
    • 对于同步异常,mepc指向导致异常的指令;
    • 对于中断,指向中断处理后应该恢复执行的位置。
  • 根据异常/中断来源设置 mcause,并将 mtval 设置为出错的地址或者其它适用于特定异常的信息字
  • 把mstatus[MIE位]置零以禁用中断,并保留先前MIE值到MPIE中
    • SIE控制S模式下全局中断,MIE控制M模式下全局中断;
    • SPIE记录的是SIE中断之前的值,MPIE记录的是MIE中断之前的值
  • 保留发生异常之前的权限模式到mstatus 的 MPP 域中,然后更改权限模式为M。(MPP表示变化之前的特权级别是S、M or U模式)

M-Mode中断分类

通过 mcause 寄存器的不同位(mie)来获取中断的类型。

  • 软件中断:通过向内存映射寄存器写入数据来触发,一个 hart 中断另外一个hart(处理器间中断)
  • 时钟中断:hart 的时间计数器寄存器 mtime 大于时间比较寄存器 mtimecmp
  • 外部中断:由中断控制器触发,大部分情况下的外设都会连到这个中断控制器

RISC-V 的中断/异常

通过 mcause 寄存器的不同位来获取中断源的信息。 第一列1代表中断,第2列代表中断ID,第3列中断含义 w:1000


M-Mode RISC-V异常机制

通过 mcause 寄存器的不同位来获取导致异常的信息。 第一列0代表异常,第2列代表异常ID,第3列异常含义 w:900


M-Mode中断/异常的硬件响应
  • 中断/异常的指令的 PC 被保存在 mepc 中, PC 被设置为 mtvec。
    • 对于异常,mepc指向导致异常的指令
    • 对于中断,mepc指向中断处理后应该恢复执行的位置
  • 根据中断/异常来源设置 mcause,并将 mtval 设置为出错的地址或者其它适用于特定异常的信息字。

M-Mode中断/异常的硬件响应
  • 把控制状态寄存器 mstatus[MIE位]置零以禁用中断,并保留先前的 MIE 值到 MPIE 中。
    • SIE控制S-Mode下全局中断,MIE控制M-Mode下全局中断;
    • SPIE记录的是SIE中断之前的值,MPIE记录的是MIE中断之前的值)
  • 发生异常之前的权限模式保留在 mstatus 的 MPP 域中,再把权限模式更改为M
    • MPP表示变化之前的特权级别是S、M or U-Mode
  • 跳转到mtvec CSR设置的地址继续执行

提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

4.1 中断机制和异常机制 4.2 中断/异常的硬件响应

4.3 中断/异常处理的控制权移交


M-Mode中断/异常处理的控制权移交
  • 默认情况下,所有的中断/异常都使得控制权移交到 M-Mode的中断/异常处理例程
  • M-Mode的中断/异常处理例程可以将中断/异常重新导向 S-Mode,但是这些额外的操作会减慢中断/异常的处理速度
  • RISC-V 提供一种中断/异常委托机制,通过该机制可以选择性地将中断/异常交给 S-Mode处理,而完全绕过 M-Mode

M-Mode中断/异常处理的控制权移交
  • mideleg/medeleg (Machine Interrupt/Exception Delegation)CSR 控制将哪些中断/异常委托给 S-Mode处理
  • mideleg/medeleg 中的每个位对应一个中断/异常
    • 如 mideleg[5] 对应于 S-Mode的时钟中断,如果把它置位,S-Mode的时钟中断将会移交 S-Mode的中断/异常处理程序,而不是 M-Mode的中断/异常处理程序
    • 委托给 S-Mode的任何中断都可以被 S-Mode的软件屏蔽。sie(Supervisor Interrupt Enable) 和 sip(Supervisor Interrupt Pending)CSR 是 S-Mode的控制状态寄存器

中断委托寄存器mideleg
  • mideleg (Machine Interrupt Delegation)控制将哪些中断委托给 S 模式处理
  • mideleg 中的每个为对应一个中断/异常
    • mideleg[1]用于控制是否将核间中断交给s模式处理
    • mideleg[5]用于控制是否将定时中断交给s模式处理
    • mideleg[9]用于控制是否将外部中断交给s模式处理

异常委托寄存器medeleg
  • medeleg (Machine Exception Delegation)控制将哪些异常委托给 S 模式处理
  • medeleg 中的每个为对应一个中断/异常
    • medeleg[1]用于控制是否将指令获取错误异常交给s模式处理
    • medeleg[12]用于控制是否将指令页异常交给s模式处理
    • medeleg[9]用于控制是否将数据页异常交给s模式处理

中断/异常处理的控制权移交
  • 发生中断/异常时,处理器控制权通常不会移交给权限更低的模式
    • 例如 medeleg[15] 会把 store page fault 委托给 S-Mode
    • M-Mode下发生的异常总是在 M-Mode下处理
    • S-Mode下发生的异常总是在 M-Mode,或者在 S-Mode下处理
    • 上述两种模式发生的异常不会由 U-Mode处理

Why?


思考题
  • 如何通过断点异常来实现调试器的断点调试功能?
  • 如何实现单步跟踪?

提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程

5. RISC-V系统编程:内核编程

5.1 中断/异常机制

5.2 中断/异常的处理 5.3 虚存机制


S-Mode的中断控制和状态寄存器
  • stvec(SupervisorTrapVector)保存发生中断/异常时要跳转到的地址
  • sepc(Supervisor Exception PC)指向发生中断/异常时的指令
  • scause(Supervisor Exception Cause)指示发生中断/异常的种类
  • sie(Supervisor Interrupt Enable)中断使能寄存器
  • sip(Supervisor Interrupt Pending)中断请求寄存器
  • stval(Supervisor Trap Value)保存陷入(trap)附加信息
  • sscratch(Supervisor Scratch)不同mode交换数据中转站
  • sstatus(Supervisor Status)保存全局中断以及其他的状态

sstatus寄存器
  • sstatus的SIE 和 SPIE 位分别保存了当前的和中断/异常发生之前的中断使能状态

w:1100


S-Mode中断/异常机制

sie & sip 寄存器是用于保存待处理中断中断使能情况的CSR

  • sie (supervisor interrupt-enabled register)
  • sip(supervisor interrupt pending)

w:1150


scause寄存器

当发生异常时,CSR中被写入一个指示导致中断/异常的事件编号,记录在Exception Code字段中;如果事件由中断引起,则置Interrupt位。 scause 寄存器

w:1150


mtvec & stvec 寄存器

中断/异常向量(trap-vector)基地址寄存器stvec CSR用于配置trap_handler地址

  • 包括向量基址(BASE)和向量模式(MODE):BASE 域中的值按 4 字节对齐
    • MODE = 0 表示一个trap_handler处理所有的中断/异常
    • MODE = 1 表示每个中断/异常有一个对应的trap_handler

mtvec & stvec 寄存器 w:1000


提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

5.1 中断/异常机制

5.2 中断/异常的处理

5.3 虚存机制


S-Mode中断/异常的硬件响应

硬件执行内容

hart 接受了中断/异常,并需要委派给 S-Mode,那么硬件会原子性的经历下面的状态转换

  1. 发生中断/异常的指令PC被存入 sepc, 且 PC 被设置为 stvec
  2. scause 设置中断/异常类型,stval被设置为出错的地址/异常相关信息
  3. 把 sstatus中的 SIE 位置零,屏蔽中断SIE位之前的值被保存在 SPIE 位中

S-Mode中断/异常的硬件响应
  1. 发生例外前的特权模式被保存在 sstatus 的 SPP(previous privilege) 域,然后设置当前特权模式为S-Mode
  2. 跳转到stvec CSR设置的地址继续执行

S-Mode中断/异常的软件处理
  • 初始化
    • 编写中断/异常的处理例程(如trap_handler)
    • 设置trap_handler地址给stvec
  • 软件执行
    1. 处理器跳转到trap_handler
    2. trap_handler处理中断/异常/系统调用等
    3. 返回到之前的指令和之前的特权级继续执行

提纲

  1. 主流CPU比较
  2. RISC-V系统模式
  3. RISC-V系统编程:用户态编程
  4. RISC-V系统编程:M-Mode编程
  5. RISC-V系统编程:内核编程

5.1 中断/异常机制 5.2 中断/异常的处理

5.3 虚存机制


S-Mode虚拟内存系统
  • 虚拟地址将内存划分为固定大小的页来进行地址转换内容保护
  • satp(Supervisor Address Translation and Protection,监管者地址转换和保护)S模式控制状态寄存器控制分页。satp 有三个域:
    • MODE 域可以开启分页并选择页表级数
    • ASID(Address Space Identifier,地址空间标识符)域是可选的,避免了切换进程时将TLB刷新的问题,降低上下文切换的开销
    • PPN 字段保存了根页表的物理页号 w:900

S-Mode虚存机制
  • 通过stap CSR建立页表基址
  • 建立OS和APP的页表
  • 处理内存访问异常

bg right:55% 85%


S-Mode虚存的地址转换

S、U-Mode中虚拟地址会以从根部遍历页表的方式转换为物理地址:

  • satp.PPN 给出了一级页表基址, VA [31:22] 给出了一级页号,CPU会读取位于地址(satp. PPN × 4096 + VA[31: 22] × 4)页表项。
  • PTE 包含二级页表基址,VA[21:12]给出了二级页号,CPU读取位于地址(PTE. PPN × 4096 + VA[21: 12] × 4)叶节点页表项。
  • 叶节点页表项的PPN字段和页内偏移(原始虚址的最低 12 个有效位)组成了最终结果:物理地址(LeafPTE.PPN×4096+VA[11: 0])

S-Mode虚存的地址转换

w:650


小结

  • 了解 RISC-V 特权级和硬件隔离方式
  • 了解 RISC-V 的 M-Mode 和 S-Mode 的基本特征
  • 了解OS在 M-Mode 和 S-Mode 下如何访问控制计算机系统
  • 了解不同软件如何在 M-Mode<–>S-Mode<–>U-Mode 之间进行切换