ARMv8 EL3关闭对齐检查后非对齐LDR触发数据中止异常问题
ARMv8 EL3等级非对齐访问触发异常问题
问题描述
现有运行在FPGA上的ARMv8裸机启动代码,用于测试数据对齐访问:
.section .text.boot .global _start _start: mrs x0, mpidr_el1 and x0, x0, #0xff cbz x0, master b proc_hang master: ldr x1, =stack_top mov sp, x1 // test unaligned assess mov x4, #0x3e61 mov x1, xzr ldr w0, [x4, x1, lsl #0x2] bl main b . proc_hang: wfe b proc_hang
设备重启/复位后处于EL3等级,上述代码中的ldr w0, [x4, x1, lsl #0x2]指令会触发EL3异常,PC跳转至0x200(默认VBAR_EL3基地址0x0的第5个入口,对应CURR_EL_SPX_SYNC,即当前EL3使用SP3的同步异常)。
此时ESR_EL3的值为0x96000021,其中EC位(异常类型,bit31:26)为0b100101,代表“数据中止”。
当前SCTLR_EL3的值为0x40c50838,其bit1为0,意味着对齐检查已禁用,预期对齐检查关闭后上述LDR指令可以正常执行,不会触发异常。
提出问题如下:
- 该触发异常的行为是否符合预期?
- 还有其他需要设置或检查的系统寄存器吗?
不同地址的访问测试结果如下:
- 0x3e60:正常
- 0x3e61:触发异常(PC=0x200)
- 0x3e62:同上
- 0x3e63:同上
- 0x3e64:正常
- 0x3e65:触发异常(PC=0x200)
- 0x3e66:同上
- 0x3e67:同上
- 0x3e68:正常
问题解答
1. 该触发异常的行为是否符合预期?
该行为符合ARMv8架构规范预期。
SCTLR_ELx寄存器的A位(bit1)仅控制**普通内存(Normal Memory)**的对齐检查开关,若访问地址对应的内存属性为设备内存(Device Memory)或强序内存(Strongly-ordered Memory),无论A位是否为0,非对齐的加载/存储操作都会触发数据中止异常。
从测试结果来看,仅4字节对齐的地址可正常访问,非4字节对齐的地址全部触发异常,完全匹配非对齐访问设备/强序内存的报错特征,说明你当前访问的0x3e6x地址段的内存属性不属于普通内存。
2. 还有其他需要设置或检查的系统寄存器吗?
需要检查的配置项如下:
- 检查内存属性配置:如果已经开启MMU,检查EL3转换表中0x3e6x地址段的内存属性配置,确认是否被标记为设备内存/强序内存;如果未开启MMU,查询FPGA所用ARMv8核心的默认内存映射规则,确认该地址段是否属于外设寄存器映射区间,这类区间默认采用不支持非对齐访问的内存属性。若要测试普通内存的非对齐访问,需将对应内存段配置为普通内存属性。
- 检查HCR_EL3寄存器的AMO位(bit5):该位为1时会强制所有特权等级的内存访问开启对齐检查,需确认该位配置为0。
- 验证ESR_EL3的ISS字段:你提供的ESR_EL3值为0x96000021,其中ISS字段的bit0为1,明确代表本次数据中止由对齐错误导致,可排除其他异常触发原因。
内容的提问来源于stack exchange,提问作者bruin
相关产品推荐
相关产品推荐

