【问题标题】:Storing/Validating against checksum in an embedded system在嵌入式系统中存储/验证校验和
【发布时间】:2017-06-20 13:38:58
【问题描述】:

我有一个带有闪存的嵌入式系统。程序存储在闪存中。我有一个函数可以计算存储我的非易失性代码的闪存的 .text 部分的校验和。我想将计算的校验和与在编译时存储在闪存中的固定值和已知值进行比较。我在链接器中创建了一个新的闪存部分。我想用 0xABCD 填充它,这是校验和。我怎样才能在链接器中做到这一点?编译器是GCC

【问题讨论】:

  • 那么,你真的需要在链接时比较校验和吗?如果它们不匹配会发生什么?
  • 这听起来像是你要为引导加载程序而不是链接器添加一些检查,因为后者与引导目标系统无关。
  • 受控系统故障。基本上不启动向用户抛出消息。 - 什么系统?哪个用户?链接发生在主机上,而不是嵌入式系统上。
  • 顺便问一下什么样的校验和?纯内存故障校验和?或者加密校验和作为防篡改的一部分?像 CRC 这样的简单校验和允许设置闪存,以便校验和始终为 0(或任何其他选择的常数)。然后验证它可以被硬编码,而不需要从任何地方读取校验和。

标签: c linker embedded checksum


【解决方案1】:

您正在校验和的代码是由链接器生成的,因此无法让链接器一次性直接生成它。

一种更简单的方法可能是简单地在未编程的链接描述文件 (0xFFFF) 中保留校验和存储区域,然后使用诸如SRecord utilities 之类的工具在链接后计算和添加校验和。基本上做你的 PROM 刻录机(在评论中提到)曾经做的事情。

【讨论】:

  • 出于愚蠢的 IT 原因,安装 SREC 会让人头疼。有没有办法我可以做到以下几点?通过在链接器中定义一个空的 4 字节部分来留出部分,不做任何事情。在调试中运行我的代码,在调试时实时计算 crc,并记下该值。返回链接器并用该值填充空白部分?
  • 编写自己的后处理器来修补校验和非常简单,但我建议将其应用于原始二进制或十六进制文件而不是 elf 文件。如果检查由单独的引导加载程序执行,这很简单,但如果代码是自检的,则需要在调试时跳过或忽略检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多