2

在嵌入式系统中,引导加载程序用于初始化电路板并加载映像。通常,boot-loader 在第一阶段在 norflash 中运行,需要将自身(.txte+.date 代码)从 flash 复制到 ram,然后跳转到 ram 执行代码。

我的问题是:当将代码从闪存复制到 RAM 并启用缓存时,我们是否必须刷新数据缓存并使指令缓存无效?我发现 uboot 和其他 bootloader 执行了这个操作,但是如果我不这样做,系统仍然可以启动成功,为什么我们必须在将代码从 flash 复制到 ram 后刷新数据缓存?

4

2 回答 2

3

简单的嵌入式 MCU 通常没有任何方法来“窥探”总线,检查是否有人(甚至它自己)通过写入缓存的内存地址使缓存内容无效。

如果您的 MCU 具有单独的数据和指令缓存(大多数现代 MCU 都有)并且您将代码作为数据从闪存复制到 RAM,则需要刷新数据缓存(以确保您复制的所有内容都物理写入 RAM)并使指令无效缓存(可能包含复制之前的“旧”信息)以真正执行您刚刚复制的代码,而不是执行之前存在的代码,并且仍然驻留在指令缓存中。

如果您可以确定您的 MCU 在您刚刚复制之前从未“看到”内存区域(因为它不会缓存任何内容并且无论如何都需要物理读取 RAM),那么您可能会侥幸不做后者,但这是一个很好的做法数据缓存刷新和指令缓存失效仍然保持安全。

将代码从闪存复制到 RAM自修改代码的一种特殊情况,作为程序员,您需要确保它没有造成任何损坏。

于 2015-04-20T05:48:53.747 回答
0

我认为一个主要原因可以在“多核”CPU中找到。在不对称核心的情况下非常重要,例如。i.MX6SoloX(单芯片上的 Cortex A9 和 Cortex M4)。

例如,在 i.MX6SoloX 中,如果从内核(M5)RAM (DDR)上运行,则主内核 (A9)是主 CPU,它必须提供加载到RAM中正确位置的M4 内核代码。这些核心有不同的 D 缓存,它们彼此看不到。如果 A9 内核在 FLASH 复制到 RAM 后没有刷新它的 D-Chache,则某些代码实际上并未复制到 RAM,因为仍在 D-Cache 内存中。如果您从 u-boot 执行此复制,您可以看到 A9(正在运行 U-Boot)看到正确复制的所有数据,但 M4 看到所有代码,但看不到仍在 A9 核心的 D-Cache 中的代码。

在您的情况下(我猜是像您这样的单个内核)U-Boot 刷新 D-cache 不是强制性的(我猜是在内核复制之后),因为 D-cache 的所有者是内核本身:它可以看到它的代码在它所有的记忆中。

最后的原因是,要授予执行的数据副本将数据完全写入特定地址,您必须刷新 D-Cache,否则某些数据仍然可以在缓存中。

于 2015-04-20T10:35:25.017 回答