【问题标题】:Using OpenOCD to determine RAM usage in microcontroller (ARM Cortex-M3)使用 OpenOCD 确定微控制器 (ARM Cortex-M3) 中的 RAM 使用情况
【发布时间】:2020-02-20 13:26:31
【问题描述】:

我想通过编写已知模式来查看固件使用了多少 RAM,并比较 RAM 内容以查看已修改多少。

我试过了

reset halt
load_image pattern.bin 0xaddress
resume
(let target run for a bit)
halt
dump_image sram.bin 0xaddress 0xsize

但似乎我已经获得了闪存内容并且在任何地方都看不到测试图案。 我是否使用了正确的命令?如果我通过加载和转储手动“验证”,数据是相同的。 halt 会影响 RAM 内容吗?否则,是否可以假设应用程序实际上初始化了所有 RAM,从而使分析变得困难/不可能?


我应该指出我只有一个固件的“转储”,即我没有构建它。

【问题讨论】:

  • 您能否提供您正在使用的 Cortex-M3 的准确参考,例如 ST Microelectronics STM32F103C8T6 ?这将有助于确定应该在 load_image/dump_image 命令中使用哪些确切地址。
  • 链接器生成的映射文件可以告诉您程序正在使用多少 RAM。
  • 您的链接描述文件是什么样的? .text、.data 和 .bss 在哪里?对于 RAM 使用情况,您不仅要检查 .text 区域,还要检查所有 RAM。
  • @kkrambo 我没有构建固件。
  • @Frant 谢谢,但地址不是问题。

标签: arm embedded reverse-engineering microcontroller openocd


【解决方案1】:

我必须执行soft_reset_halt 才能让 PC 到达复位向量地址。 我的 OpenOCD 版本警告我该命令已弃用。 然后我能够在 RAM 转储中发现一些我的测试模式。 此外,RAM 映像和固件之间存在显着差异,因此看来固件确实使用了大部分 RAM。

(如果您的接口使用物理复位线,这可能不是问题?)

【讨论】:

  • 如果您为 mcu 构建,.text 将在 ram 中作为 .data 的副本,您复制到 ram 和 .bss 您在引导程序中归零。因此,一般来说,大多数 ram 都不会是程序。但也有例外。 mcus 通常比 ram 拥有更多闪存是有原因的
  • @old_timer - 我没有构建固件。
  • 如果您使用的是物理重置线,那么 .text 会进入闪存等...我写错了...
  • 根据您关于重置行的问题,.text .data 的副本以及 .bss 将在闪存中的位置和数量。引导程序复制 .data 并将 .bss 归零。因此,一般来说,大多数 ram 都不会是程序。但也有例外。 mcus 通常比 ram 拥有更多闪存是有原因的
  • 您可以恢复 0xaddress,如果您使用 elf 文件,则在二进制文件中的加载图像行上不需要 0xaddress。从技术上讲,它应该是恢复 0xaddress|1。必须将二进制文件构建为在 ram 中运行与从重置后在闪存中运行,两种不同的入口点/方法。 (或软重置的东西)
猜你喜欢
  • 2013-09-07
  • 2014-06-18
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多