You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指令可以正常执行,不会触发异常。
提出问题如下:

  1. 该触发异常的行为是否符合预期?
  2. 还有其他需要设置或检查的系统寄存器吗?
    不同地址的访问测试结果如下:
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:15:03