闪存在执行时会发生变化吗?

Does flash memory ever change on execution?

我需要使用 CRC 进行代码验证。在这种情况下,我所做的就是通过一种算法将找到的每个字节传递给闪存,以计算 CRC 并将结果与​​预定义的 CRC 值进行比较。

但是,我对闪存可能会在某个时候发生变化,导致 CRC 验证失败的想法挂断了。

假设代码没有被再次触及,闪存是否有可能在执行过程中发生变化?如果是这样,什么会导致它发生变化?我该如何避免上述变化?

闪存仅表示它在断电时保留其内容;闪存绝对是可擦除/可重新编程的。单独的术语只读存储器 (ROM) 表示在初始写入后无法更改。

但是内存不会改变,除非 CPU 指令触及它或者它降级或受到外部因素的影响。闪存内容可能会持续十年而不受干扰。通常是 read/write 周期数使闪存在老化之前降级。高静电荷可能会损坏闪光灯,但磁场应该影响不大。

如果您对硬件规格有任何影响,如果这是主要目的,则应考虑 ROM;为此,它比闪存有几个优点。

最后,您注意到您将通过 CRC 算法传递 "every byte" 内存。如果要将正确的校验和存储在同一存储介质中,则会遇到一个递归问题,即尝试预先计算包含它自己的校验和的校验和。在大多数情况下,有效的校验和应该位于内存的某个段中,该段本身不受扫描。

无论如何,如果 自发更改,这正是您的代码验证旨在捕获的内容,并且您希望并期望 CRC 失败,因此没有问题 - 它正在做它的工作

这主要不是自发更改的问题,而是一开始就没有正确编写,或者可能防止恶意或意外篡改的问题。如果闪存的一部分用于可变的非易失性存储,您显然不会将该区域包括在您的 CRC 中。如果您 将同一个闪存分区为代码 space 和 NV 存储,NV 存储代码中的潜在错误可能会无意中修改代码 space,因此您的 CRC 保护反对那个和外部篡改(例如通过 JTAG)。

闪存受制于 erase/write 循环耐久性,经过多次循环后,某些位可能会保留 "high"。部件之间的耐久性从大约 10000 到 100000 不等,并且很少成为代码存储的问题。闪存也有标称数据保留时间;这通常以 10 年为单位进行报价;但这是最坏情况下的极端条件评级 - 您的 CRC 再次防止这些影响。