上传者: 26642481
|
上传时间: 2021-09-19 13:53:30
|
文件大小: 8.85MB
|
文件类型: PDF
会有非对齐的 load 和 store 地址异常。原因有两个,首先,第六章的原子内存操作需要自
然对齐的地址;其次,一些实现者选择省略对于非对齐的常规 load 和 store 的硬件支持,
因为它是一个难以实现的不常用特性。没有这种硬件的处理器依赖于异常处理程序,用一
系列较小的对齐 load 和 store 来模拟软件中非对齐的 load 和 store。应用程序代码并没有变
得更好:虽然速度很慢,非对齐访存操作仍按预期进行,而硬件仍然很简单。或者,在更
高性能的处理器中可以硬件实现非对齐的 load 和 store。这种实现上的灵活性归功于 RISC-
V 允许非对齐 load 和 store 与常规 load 和 store 共用操作码。这遵照了第一章将架构和具体
实现隔离开的准则。
有三种标准的中断源:软件、时钟和外部来源。软件中断通过向内存映射寄存器中存
数来触发,并通常用于由一个 hart 中断另一个 hart(在其他架构中称为处理器间中断机
制)。当 hart 的时间比较器(一个名为 mtimecmp 的内存映射寄存器)大于实时计数器
mtime 时,会触发时钟中断。外部中断由平台级中断控制器(大多数外部设备连接到这个
中断控制器)引发。不同的硬件平台具有不同的内存映射并且需要中断控制器的不同特
性,因此用于发出和消除这些中断的机制因平台而异。所有 RISC-V 系统的共同问题是如
何处理异常和屏蔽中断,这是下一节的主题。
10.3 机器模式下的异常处理
八个控制状态寄存器(CSR)是机器模式下异常处理的必要部分:
⚫ mtvec(Machine Trap Vector)它保存发生异常时处理器需要跳转到的地址。
⚫ mepc(Machine Exception PC)它指向发生异常的指令。
⚫ mcause(Machine Exception Cause)它指示发生异常的种类。
⚫ mie(Machine Interrupt Enable)它指出处理器目前能处理和必须忽略的中断。
⚫ mip(Machine Interrupt Pending)它列出目前正准备处理的中断。
⚫ mtval(Machine Trap Value)它保存了陷入(trap)的附加信息:地址例外中出错
的地址、发生非法指令例外的指令本身,对于其他异常,它的值为 0。
⚫ mscratch(Machine Scratch)它暂时存放一个字大小的数据。
⚫ mstatus(Machine Status)它保存全局中断使能,以及许多其他的状态,如图
10.4 所示。
图 10.4:mstatus 控制状态寄存器。在仅有机器模式且没有 F 和 V 扩展的简单处理中,有效的域只有全
局中断使能、MIE 和 MPIE(它在异常发生后保存 MIE 的旧值)。RV32 的 XLEN 时 32,RV64 是 40。
(来自[Waterman and Asanovic 2017]中的表 3.6;有关其他域的说明请参见该文档的第 3.1 节。)
处理器在 M 模式下运行时,只有在全局中断使能位 mstatus.MIE 置 1 时才会产生中
断.此外,每个中断在控制状态寄存器 mie 中都有自己的使能位。这些位在 mie 中的位置