lab4 trap
1.
陷阱(trap)表示的则是,由异常或者中断引起的控制权转移到陷阱处理程序的过程
2.
陷阱的触发有三种情况:系统调用,严重错误(比如除0错误),设备中断。陷阱可以分为从用户态陷阱和从内核态陷阱。用户态陷阱包含上面的三种触发情况,而内核态陷阱只包含后两种情况。系统调用作为用户态陷阱中最具有代表性的类型。系统调用中的ecall指令和程序执行中的异常都属于RISC-V标准中定义的异常情况。
3.
中断分为本地中断,全局中断。本地中断包括软件中断和定时器中断,本地中断由CLINT(Core-Local Interruptor, 核心本地中断器)来控制。全局中断是外部设备引起的中断,由PLIC(Platform-Level Interrupt Controller,平台级中断控制器)来控制。
4.
stvec:内核在这里写入其陷阱处理程序的地址;RISC-V跳转到这里处理陷阱。
sepc:当发生陷阱时,RISC-V会在这里保存程序计数器pc(因为pc会被stvec覆盖)。
sret(从陷阱返回)指令会将sepc复制到pc。内核可以写入sepc来控制sret的去向。
scause: RISC-V在这里放置一个描述陷阱原因的数字。scause中的异常码: scause的值为8时,表示陷阱原因是系统调用, 它会表明当前状态的原因是中断
sscratch:内核在这里放置了一个值,这个值在陷阱处理程序一开始就会派上用场。在进入到用户空间之前,内核会将trapframe page(trapframe是一个专门用来存放上下文状态的专用物理内存区域)的地址保存在这个寄存器。sscratch寄存器的作用就是保存另一个寄存器的值,并将自己的值加载给另一个寄存器
sstatus:其中的SIE位控制设备中断是否启用。如果内核清空SIE,RISC-V将推迟设备中断,直到内核重新设置SIE。SPP位提示了CPU在进入supervisor模式之前的运行模式, 指示陷阱是来自用户模式还是管理模式,并控制sret返回的模式。SPP为0表示陷阱源于用户模式,1表示其他模式
satp:保存了内核页表的地址。
SIP(Supervisor Interrupt Pending)寄存器。当发生中断时,处理器可以通过查看这个寄存器知道当前是什么类型的中断
IR(Instruction Register,指令寄存器)
SP(Stack Pointer,堆栈指针寄存器)用户态和内核态各自拥有独立的堆栈
PC(Program Counter,程序计数器): 程序计数器某一时刻只能存储一个地址,该地址指向下一条将要执行的指令。是控制指令执行流程的关键,确保指令按照正确的顺序执行。
PSW(Program Status Word, 程序状态字 ): PSW 通常包含更广泛的状态信息,包括程序执行状态、特权级别、中断使能状态、程序计数器(PC)的值、堆栈指针(SP)的值等。它涵盖了与程序执行和控制相关的多个方面。
SR(Status Register,状态寄存器)SR 通常包含与运算状态相关的标志位,如零标志、溢出标志、进位标志等。它主要用于存储最近一次运算结果的状态信息,以便在条件分支和逻辑判断中使用。
5.
无论是异常还是中断,它们所导致的硬件陷阱流程都是一样的。
1.改变控制流。将PC的值保存在sepc寄存器中,而将stvec寄存器中保存的陷阱处理函数地址放入PC。
2.更新相关CSR的值。sstatus,stval,scause。
6.陷阱的委派
在机器模式M-Mode下可以配置寄存器,从而使得监管者模式S-Mode下的所有陷阱都被S-Mode下的陷阱处理函数自动接管。
medeleg和mideleg两个寄存器,分别用来管理异常和中断的委派。
陷阱从不会从高优先级移交到低优先级:M-Mode下发生异常,即使它被托管到S-Mode,这个异常也不会被移交给S-Mode去处理,而是在M-Mode完成处理。
如果一个属于S-Mode的中断从M-Mode委托给S-Mode(比方我们后面要看到的外部中断),这个中断在M-Mode下就会被屏蔽掉,一定要等到进入S-Mode时才会被处理。
负责管理中断委派的是mideleg寄存器。
1.sstatus寄存器
supervisor status register,反映S-Mode下处理器的工作状