当前位置: 首页 > news >正文

ARMv8 没开mmu执行memset引起的非对齐访问异常

最近在haps上验证一个新的芯片,记录一下memset访问出错的问题。

在没开mmu和cache的情况下,对全局变量指针进行memset清零操作,发现每次都会出现异常。最后发现是没开mmu导致出现了数据非对齐访问导致报错。

排查EC区域发现是0x25,产生了非对齐访问。

下面是非对齐访问的排查逻辑:

在ARM Cortex-A35处理器(ARMv8-A架构)上,可以通过检查以下状态寄存器来判断是否发生了非对齐内存访问异常:

1. 异常状态寄存器 (ESR_ELx)

这是判断异常类型的关键寄存器:

  • EC 字段 (Exception Class, 位[31:26]):

    • 数据中止异常:0b100101 (0x25)

  • ISS 字段 (Instruction Specific Syndrome, 位[24:0]):

    • 对齐错误:DFSC=0b100001 (0x21)

判断步骤


# 读取ESR_EL1(假设异常发生在EL1)
set esr_value [readreg ESR_EL1]# 提取EC字段(高6位)
set ec [expr ($esr_value >> 26) & 0x3F]# 提取DFSC字段(低6位)
set dfsc [expr $esr_value & 0x3F]# 检查是否是非对齐数据访问异常
if {$ec == 0x25 && $dfsc == 0x21} {echo "检测到非对齐内存访问异常!"
}

2. 故障地址寄存器 (FAR_ELx)

记录触发异常的内存地址:


# 读取触发异常的地址
set fault_addr [readreg FAR_EL1]
echo "异常访问地址:0x[format %x $fault_addr]"

完整调试示例脚本


# 连接到目标
connect -p jtag -c cortex-a35# 设置断点
break vector_data# 运行程序
run# 异常发生后检查状态
stop# 读取关键寄存器
set esr [readreg ESR_EL1]
set far [readreg FAR_EL1]
set pc [readreg PC]# 解析ESR
set ec [expr ($esr >> 26) & 0x3F]
set dfsc [expr $esr & 0x3F]# 输出诊断信息
echo "-------------------------"
echo "异常诊断信息:"
echo "PC = 0x[format %x $pc]"
echo "FAR = 0x[format %x $far]"
echo "ESR_EL1 = 0x[format %x $esr]"
echo "EC = 0x[format %x $ec]"
echo "DFSC = 0x[format %x $dfsc]"# 判断异常类型
if {$ec == 0x25} {if {$dfsc == 0x21} {echo ">> 非对齐内存访问异常!"echo ">> 地址 0x[format %x $far] 未按字长对齐"} else {echo ">> 其他类型数据中止 (DFSC=0x[format %x $dfsc])"}
} else {echo ">> 非数据中止异常 (EC=0x[format %x $ec])"
}

关键寄存器说明

寄存器位域含义
ESR_ELxEC[31:26]0x25数据中止异常
DFSC[5:0]0x21对齐错误
FAR_ELx-任意地址触发异常的内存地址
PC-当前地址发生异常时的指令地址

常见对齐要求

数据类型ARM64对齐要求
Byte1字节
Halfword2字节
Word4字节
Doubleword8字节
128-bit向量16字节

⚠️ 注意事项

  1. 异常级别需匹配:EL1异常查ESR_EL1,EL2查ESR_EL2

  2. 通过SCTLR_ELx.A位可配置对齐检查:

    • A=1:强制对齐检查(默认)

    • A=0:允许非对齐访问(但性能下降)

  3. 使用STM/LDM等多寄存器指令时,地址必须按8字节对齐

可通过以下命令检查对齐检查配置:


# 读取系统控制寄存器
set sctlr [readreg SCTLR_EL1]
set alignment_check [expr ($sctlr >> 1) & 1]  # 提取A位if {$alignment_check} {echo "对齐检查已启用"
} else {echo "警告:非对齐访问被允许!"
}

http://www.lryc.cn/news/580016.html

相关文章:

  • 新商品冷启动:基于语义Embedding与GBRT的消费指标预估技术实践
  • chrome插件合集
  • vue 循环无限滚动表格
  • Mint密室 · 猫猫狐狐的“特征选择”囚室逃脱
  • QT5.14.2+VS2019 打包程序找dll(纯QT+Opencv程序)
  • 鸿蒙开发List长按Item拖拽切换效果
  • kali安装教程
  • CI/CD持续集成与持续部署
  • spring boot项目配置使用minion
  • 【1】确认安装 Node.js 和 npm版本号
  • 3-1 PID算法改进(积分部分)
  • OpenHarmony 5.0 SIM卡信号格没有变化解决方案(修改成符合标准的信号变化)
  • 《探秘JavaScript虚拟列表:解锁高性能渲染的底层逻辑》
  • 我想要学写GitHub(草拟计划+目标)
  • 【2025/07/04】GitHub 今日热门项目
  • Fiddler 中文版怎么配合 Postman 与 Wireshark 做多环境接口调试?
  • cd-agent更换cd模型(自用)
  • 计算机科学导论(1)哈佛架构
  • 分布式光伏监控系统防孤岛保护装置光功率预测
  • 科学的第五范式:人工智能如何重塑发现之疆
  • CANFD 数据记录仪在新能源汽车售后维修中的应用
  • ZKmall模块商城批发电商平台搭建方案,多商户支持 + 订单管理功能全覆盖
  • 结构型智能科技的关键可行性——信息型智能向结构型智能的转换(提纲)
  • SQL 快速参考手册-SQL001
  • Android 安装使用教程
  • M30280F8HP#U5B 瑞萨16位工业MCU微控制器,CAN 2.0B+专用PWM,电机控制专家!
  • Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
  • 深入解析XFS文件系统:原理、工具与数据恢复实战
  • 《软件测试架构实践与精准测试》| 认识测试流程
  • Java泛型笔记