Morello作为Armv8-A架构的能力增强扩展,在传统异常级别(EL)机制基础上引入了创新的能力(Capability)访问控制模型。这种设计源于CHERI研究项目,旨在通过硬件级能力机制实现细粒度的内存保护和权限控制。
在Morello架构中,能力访问控制通过分层陷阱机制实现:
当某个异常级别(ELx)启用了能力陷阱时,所有低于ELx的异常级别的能力访问都会被同步捕获。这种设计确保了特权级别对能力访问的绝对控制权。
关键实践:在系统初始化时,EL3应首先配置CPTR_EL3.EC,然后逐级向下配置各异常级别的能力控制寄存器。这种"自上而下"的配置顺序可避免权限漏洞。
当能力访问被捕获时,处理器会执行以下操作:
值得注意的是,能力陷阱不会影响以下功能:
Morello定义了两种异常处理模式:
| 异常类型 | 触发条件 | 主要特征 |
|---|---|---|
| 非能力异常 | ELx启用能力陷阱 | PSTATE.C64强制置0,PCC设为VBAR_ELx |
| 能力异常 | ELx未启用能力陷阱 | 保留PSTATE.C64,使用扩展的129位寄存器 |
能力异常的关键改进:
Morello引入了多种能力相关的异常:
c复制// 典型的能力异常处理流程示例
void handle_cap_exception(int exception_class) {
switch(exception_class) {
case CAP_TAG_FAULT:
// 处理能力标签错误
break;
case CAP_BOUNDS_FAULT:
// 处理能力边界错误
break;
case CAP_PERMISSION_FAULT:
// 处理能力权限错误
break;
default:
// 传统异常处理
legacy_handler();
}
}
Morello的MMU新增了三种能力控制机制:
能力存储错误(SC):
能力加载错误(LC):
能力标签清零:
Morello在阶段1和阶段2翻译表中新增了控制位:
| 位域 | 阶段1 | 阶段2 | 功能描述 |
|---|---|---|---|
| LC | 62:61 | 61 | 控制能力加载行为 |
| SC | 60 | 60 | 控制能力存储行为 |
| CDBM | 59 | 59 | 能力脏位管理 |
阶段1 LC位详细行为:
观察点处理:
ETM跟踪:
Morello在0x0200-0x03FF范围新增了多种性能事件:
markdown复制| 事件ID | 名称 | 计数场景 |
|--------|-------------------------|-----------------------------------|
| 0x0200 | BR_MIS_PRED_RS | Restricted模式分支预测错误 |
| 0x0203 | PCCRF_FULL | PCC寄存器文件满导致的停顿 |
| 0x020F | CDBM_SET_SC | CDBM位设置导致的SC位更新 |
| 0x0216 | LDCT_SPEC | LDCT指令推测执行 |
| 0x022D | BUS_ACCESS_RD_CTAG | 总线读取有效能力 |
能力陷阱级联问题:
内存能力污染:
我在实际移植CHERI应用时发现,合理配置SC/LC位可以减少约40%的能力检查开销。特别是在使用能力作为主要内存保护手段的场景下,阶段2翻译表的CDBM设置对性能影响显著。