1. AArch64异常处理机制深度解析
在Armv8架构中,异常处理是系统可靠性和安全性的基石。AArch64异常模型通过分层机制实现了从用户空间到安全监控程序的完整保护体系。让我们先看一个典型的异常处理流程伪代码实现:
c复制AArch64.TakeException(bits(2) target_el, ExceptionRecord exception,
bits(64) preferred_exception_return, integer vect_offset)
{
// 上下文同步
SynchronizeContext();
// 保存处理器状态
spsr = GetPSRFromPSTATE();
SPSR[] = spsr;
// 设置返回地址
if IsAccessToCapabilitiesEnabledAtEL(PSTATE.EL) then
CELR[] = CapSetValue(PCC, preferred_exception_return);
else
ELR[] = preferred_exception_return;
// 切换异常级别
PSTATE.EL = target_el;
PSTATE.nRW = '0'; // 切换到AArch64状态
PSTATE.<D,A,I,F> = '1111'; // 屏蔽所有异步异常
// 跳转到异常向量表
BranchTo(VBAR[]<63:11>:vect_offset<10:0>, BranchType_EXCEPTION);
}
1.1 异常分类与编码
AArch64架构将异常分为三大类,每种类型在ESR_ELx寄存器中有独特的编码:
| 异常类别 | ESR_EC值范围 | 典型场景 | 处理优先级 |
|---|---|---|---|
| 同步异常 | 0x00-0x3F | 指令中止、数据中止、SVC调用 | 最高 |
| IRQ异步异常 | 0x40-0x7F | 外设中断请求 | 高 |
| FIQ异步异常 | 0x80-0xBF | 快速中断请求 | 中 |
| 系统错误(SError) | 0xC0-0xFF | 总线错误、ECC校验失败 | 低 |
在Watchpoint异常处理中,硬件会自动记录关键信息:
c复制AArch64.WatchpointException(bits(64) vaddress, FaultRecord fault)
{
exc
