ARM非对齐操作异常解决过程

简介:

在测试MF固件时,发生一个非常诡异的异常,代码如下:

    CLR_DBG_Commands::Monitor_EraseMemory* cmd = (CLR_DBG_Commands::Monitor_EraseMemory*)msg->m_payload;

    debug_printf("EraseMemory addr=0x%08x len=%d\r\n", cmd->m_address, cmd->m_length);

指定第二行代码时,会跳到异常处理程序,发生了6号异常(用法异常Usage Fault)

我对ARM还是非常陌生,不知道怎么可能发生这个问题。
在今天之前,这行代码执行了无数次也未曾出错,最近也没有修改该函数或者相关函数的代码,昨天倒是大量修改了其它代码。

1,百度找资料
关键点是用法异常Usage Fault,以此为关键字搜索。有资料(http://www.docin.com/p-633872264.html)指出,用法异常包括:执行未定义指令、非对齐操作、除零。
前后两个显然不可能,中间这个非对齐操作倒是引起了我的注意。因为阅读MFPK代码的时候看到很多对齐操作的设计。

2,Keil调试
在Keil中调试这两行代码

复制代码
0x080071DA 6A74      LDR      r4,[r6,#0x24]
  1350:         debug_printf("EraseMemory addr=0x%08x len=%d\r\n", cmd->m_address, cmd->m_length); 
  1351:  
0x080071DC A012      ADR      r0,{pc}+4  ; @0x08007228
0x080071DE E9D41200  LDRD     r1,r2,[r4,#0]
0x080071E2 F001FD93  BL.W     debug_printf (0x08008D0C)
复制代码

抛出异常的是0x080071DE这一行,代码是LDRD r1,r2,[r4,#0],大意是把r4开始,偏移#0的数据加载到r1,下一个字加载到r2
从寄存其中看到,r4此时是0x200006D2,这是半字对齐而不是字对齐。
奇怪了,MDK为啥编译一个半字对齐的呢?
回到第一行代码的
msg->m_payload,它是关键。因为它就是0x200006D2,如果r4没有字对齐,那么肯定跟这个msg->m_payload有关。
我们看看
msg->m_payload是哪里分配的!

3,寻根
从代码中看到
msg->m_payload来自msg->m_payload = pThis->m_receptionBuffer;
而
m_receptionBuffer的声明

 

    COM_HANDLE    m_port;
    UINT8         m_receptionBuffer[ 2048 ];
    UINT32        m_flags;
    UINT32        m_lastPacketSequence;
    WP_Controller m_controller;

 

到这里,就明白了!
因为我昨天把typedef INT32 COM_HANDLE;改为了typedef INT16 COM_HANDLE;

非对齐操作相关资料
http://www.docin.com/p-218037008.html

 

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
分类: 物联网

本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/7462758.html,如需转载请自行联系原作者
目录
相关文章
|
5天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
2354 14
|
5天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1041 3
|
云安全 安全 网络安全
|
4天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
6天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
18天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3196 49
|
12天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2115 2

热门文章

最新文章