程序运行状态

对于用户程序而言,中断的处理应当是不留任何痕迹的:只要中断处理改动了一个寄存器,都可能导致原本正在运行的线程出现错误。因此,在处理中断之前,必须要保存所有可能被修改的寄存器,并且在处理完成后恢复。因此,我们需要保存所有通用寄存器,sepcscausestval 这三个会被硬件自动写入的 CSR 寄存器,以及 sstatus。因为中断可能会涉及到权限的切换,以及中断的开关,这些都会修改 sstatus

Context

我们把在中断时保存了各种寄存器的结构体叫做 Context,他表示原来程序正在执行所在的上下文(这个概念在后面线程的部分还会用到),这里我们和 scause 以及 stval 作为一个区分,后两者将不会放在 Context 而仅仅被看做一个临时的变量(在后面会被用到),Context 的定义如下:

os/src/interrupt/context.rs

use riscv::register::{sstatus::Sstatus, scause::Scause};

#[repr(C)]
#[derive(Debug)]
pub struct Context {
    pub x: [usize; 32],     // 32 个通用寄存器
    pub sstatus: Sstatus,
    pub sepc: usize
}

这里我们使用了 rCore 中的库 riscv 封装的一些寄存器操作,需要在 os/Cargo.toml 中添加依赖。

os/Cargo.toml

[dependencies]
riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] }

results matching ""

    No results matching ""

    results matching ""

      No results matching ""