🐳
uCore OS(on RISC-V64)实验指导书
  • Introduction
  • LAB0:ready~go!
    • 实验目的
    • 实验内容
    • 前导知识
      • 了解uCore
      • 了解RISC-V
      • 了解OS实验
      • 了解实验环境
      • 了解开发调试基本工具
      • 了解硬件模拟器
    • 配置环境
      • 安装虚拟环境
      • 安装开发工具
      • 安装硬件模拟器
      • 安装调试工具
  • LAB0.5:最小可执行内核
    • 实验目的
    • 实验内容
    • 练习
    • 内存布局
    • 链接脚本
    • 真正的入口点
    • 从SBI到stdio
    • 编译运行
    • 项目组成与执行流
  • LAB1:中断机制
    • 实验目的
    • 实验内容
    • 练习
    • RISC-V中断相关
    • 上下文处理
    • 中断处理程序
    • 时钟中断
    • 项目组成与执行流
  • LAB2:物理内存管理
    • 实验目的
    • 实验内容
    • 练习
    • 地址与页表
    • 物理内存探测
    • 以页为单位管理物理内存
    • 页面分配算法
    • 项目组成与执行流
  • LAB3:虚拟内存管理
    • 实验目的
    • 实验内容
    • 练习
    • 页面置换
    • PageFault
    • 使用多级页表
    • 页面置换机制
    • FIFO置换算法
    • 项目组成与执行流
  • LAB4:进程管理
    • 实验目的
    • 实验内容
    • 练习
    • 进程与线程
    • 相关结构体
    • 进程模块初始化
    • 进程切换
    • 项目组成与执行流
  • LAB5:用户程序
    • 实验目的
    • 实验内容
    • 练习
    • 用户进程
    • 用户程序
    • 创建并执行用户进程
    • 系统调用
    • 用户进程的退出和等待
    • 项目组成与执行流
  • LAB6:进程调度
    • 实验目的
    • 实验内容
    • 练习
    • 进程状态
    • 再次认识进程切换
    • 调度算法框架
    • 项目组成与执行流
  • LAB7:同步互斥
    • 实验目的
    • 实验内容
    • 练习
    • 同步互斥的基本概念
    • 信号量
    • 条件变量与管程
    • 项目组成与执行流
  • LAB8:文件系统
    • 实验目的
    • 实验内容
    • 练习
    • 文件系统介绍
    • 文件系统抽象层VFS
    • 硬盘文件系统SFS
    • 设备即文件
    • 从中断到终端
    • 项目组成与执行流
由 GitBook 提供支持
在本页
  • 寄存器
  • 特权指令

这有帮助吗?

  1. LAB1:中断机制

RISC-V中断相关

上一页练习下一页上下文处理

最后更新于4年前

这有帮助吗?

寄存器

除了32个通用寄存器之外,RISCV架构还有大量的 控制状态寄存器 Control and Status Registers(CSRs)。其中有几个重要的寄存器和中断机制有关。

有些时候,禁止CPU产生中断很有用。(就像你在做重要的事情,如操作系统lab的时候,并不想被打断)。所以,sstatus寄存器(Supervisor Status Register)里面有一个二进制位SIE(supervisor interrupt enable,在RISCV标准里是2^1 对应的二进制位),数值为0的时候,如果当程序在S态运行,将禁用全部中断。(对于在U态运行的程序,SIE这个二进制位的数值没有任何意义),sstatus还有一个二进制位UIE(user interrupt enable)可以在置零的时候禁止用户态程序产生中断。

在中断产生后,应该有个中断处理程序来处理中断。CPU怎么知道中断处理程序在哪?实际上,RISCV架构有个CSR叫做stvec(Supervisor Trap Vector Base Address Register),即所谓的”中断向量表基址”。中断向量表的作用就是把不同种类的中断映射到对应的中断处理程序。如果只有一个中断处理程序,那么可以让stvec直接指向那个中断处理程序的地址。

对于RISCV架构,stvec会把最低位的两个二进制位用来编码一个“模式”,如果是“00”就说明更高的SXLEN-2个二进制位存储的是唯一的中断处理程序的地址(SXLEN是stval寄存器的位数),如果是“01”说明更高的SXLEN-2个二进制位存储的是中断向量表基址,通过不同的异常原因来索引中断向量表。但是怎样用62个二进制位编码一个64位的地址?RISCV架构要求这个地址是四字节对齐的,总是在较高的62位后补两个0。

手册P110

机器和监管者自陷向量(trap-vector)基地址寄存器( mtvec和 stvec) CSR。他们是位宽为 XLEN的读 /写寄存器,用于保存自陷向量的配置,包括向量基址( BASE)和向量模式 (MODE)。 BASE域中的值必须按 4字节对齐。 MODE = 0表示所有异常都把 PC设置为 BASE。 MODE = 1会在一部中断时将 PC设置为 (𝑩𝑨𝑺𝑬+(𝟒×𝒄𝒂𝒖𝒔𝒆))(𝑩𝑨𝑺𝑬+(𝟒×𝒄𝒂𝒖𝒔𝒆))(BASE+(4×cause)) 。

当我们触发中断进入 S 态进行处理时,以下寄存器会被硬件自动设置,将一些信息提供给中断处理程序:

sepc(supervisor exception program counter),它会记录触发中断的那条指令的地址;

scause,它会记录中断发生的原因,还会记录该中断是不是一个外部中断;

stval,它会记录一些中断处理所需要的辅助信息,比如指令获取(instruction fetch)、访存、缺页异常,它会把发生问题的目标地址或者出错的指令记录下来,这样我们在中断处理程序中就知道处理目标了。

特权指令

RISCV支持以下和中断相关的特权指令:

ecall(environment call),当我们在 S 态执行这条指令时,会触发一个 ecall-from-s-mode-exception,从而进入 M 模式中的中断处理流程(如设置定时器等);当我们在 U 态执行这条指令时,会触发一个 ecall-from-u-mode-exception,从而进入 S 模式中的中断处理流程(常用来进行系统调用)。

sret,用于 S 态中断返回到 U 态,实际作用为pc←sepc,回顾sepc定义,返回到通过中断进入 S 态之前的地址。

ebreak(environment break),执行这条指令会触发一个断点中断从而进入中断处理流程。

mret,用于 M 态中断返回到 S 态或 U 态,实际作用为pc←mepc,回顾sepc定义,返回到通过中断进入 M 态之前的地址。(一般不用涉及)

关于上面提及的内容,要去手册里找相关内容,然后看明白!