4

在嵌入式系统上工作时有两种情况。嵌入式系统资源有限,例如带有 12 K 闪存的 ARM Cortex M0 微控制器。

案例 1: Bootloader 和 Firmware 的通用功能/模块使用:Bootloader 和 Firmware 可能需要使用相同的模块和功能以防止代码重复。否则,相同的代码将包含两次固件和引导加载程序。我们可以通过指定函数地址来防止这种情况,并通过地址调用函数来调用这个函数。这是解决方案之一。

有什么聪明的方法来提供常用的功能用法吗?

案例2: 有时,我们需要升级固件。引导加载程序的职责之一是固件升级。我们可以通过覆盖旧固件轻松升级固件。

正如我们所见,两种情况可以分别实现。但是当我们合并它们时,就会出现一些问题。

问题: 引导加载程序通常是静态对象,但固件可以修改。因此,常用函数一般位于 Bootloaders。但是当我们需要更新一个通用的模块/功能时,我们该怎么做呢?

引导加载程序、固件结构化嵌入式系统的通用或智能方法是什么?此外,对于有限的资源。

对于离散的常用模块/功能,一个或多个附加区域可以解决这个问题吗?固件、引导加载程序和库(新区域)?

我想学习一般方法。有没有关于高级固件管理的论文、书籍和资源?

谢谢

4

3 回答 3

2

如果您在引导加载程序和主线固件应用程序之间共享代码,则引导加载程序在刷新应用程序空间时将使用此代码。为了防止这种情况,您必须牺牲更新公共代码的能力,否则您的引导加载程序将崩溃。

只有 12k 的闪存,期望引导加载程序和主线应用程序适合是非常雄心勃勃的。您可能会考虑在汇编中编写引导加载程序(喘气!)。一些 Cortex M0 部件(例如 NXP LPC11xx 系列)有一个额外的引导 ROM,用于存储一些有用的功能并有助于缓解一些内存限制。

于 2013-08-01T02:55:51.747 回答
2

您的问题正确地说明了问题-您不能吃蛋糕。要么:
1. 您选择较小的内存占用,并且在引导加载程序中不包含固件升级逻辑(即引导加载程序可能只是验证应用程序映像 CRC 等,但没有更复杂的)。在这里您可以共享功能以节省空间。或
2. 引导加载程序具有固件升级功能。在这里,您必须将共享函数编译到应用程序和引导加载程序中。共享函数应该很小——可能不是很大的开销,但你需要占用的空间——如果你没有它,那么你需要更多的内存。
无法共享功能并可靠地从引导加载程序进行固件升级。

于 2015-05-22T07:33:38.353 回答
2

鉴于当前有关固件更新过程中的安全性的讨论,我想添加以下内容以进行澄清:在引导加载程序和应用程序之间共享代码将为潜在的攻击打开另一扇门,所以你真的想避免这种情况。

引导加载程序部分是您实际上不想更改的部分,这应该尽可能是静态的。如果引导加载程序被破坏,现场更新几乎是不可能的,或者至少是不安全的。

话虽如此,您可能想要使用不同的方法。您可以为您的设备创建维护模式。该模式打开 JTAG 接口并允许直接访问存储器。服务技术人员可以应用更新。

现在您“只”需要安全激活维护模式。以下方法可行: 使用 UART 接口来传达激活信息。

  1. 维护系统通过UART发送自己的id并请求维护模式
  2. 维护系统的 id、一个随机数和一个唯一的系统 id 被发送回维护系统。
  3. 维护系统将此 id-sequence 发送到您的认证服务器。
  4. 如果唯一系统 id 和维护系统 id 正确,服务器将对收到的信息创建签名并将其发送回维护系统。
  5. 您的系统现在将通过 UART 接收签名
  6. 您的系统使用在生产期间存储的公钥验证先前发送的 id 字符串的签名
  7. 成功验证进入维护模式

为了增加安全性,您肯定希望按照类似的方案在维护系统 ID 上投入一些精力。ID 应该基本上取决于 MAC 地址或另一个唯一的硬件 ID 和相同的签名。ID应该在维护系统的生产过程中在安全的环境中创建。唯一的硬件 id 应该是外界可见的东西,因此服务器可以实际验证接收到的 ID 是否与与服务器通信的维护系统匹配。

整个设置将为您提供无需引导加载程序的安全固件更新。要获得安全的固件更新,通常的理解是,您需要一个基于非对称加密(如 RSA)的身份验证系统。如果您仍然需要验证码,上述将交换能够接受更新的引导加载程序与一个简单的 UART 接口,在此过程中节省一些资源。

这是你要找的东西吗?

根据我的经验,商业引导加载程序使用 4 到 8k 的闪存,具体取决于闪存算法和其他一些东西。在我的整个职业生涯中,我一直坚持使用同一个供应商,所以这可能与您的经验有所不同。

为嵌入式系统优化的数字签名系统在闪存中使用大约 4.5kByte(例如,请参见此处:https ://www.segger.com/emlib-emsecure.html ),并且 RAM 不超过堆栈。

你看,就拥有可以在现场安全更新的系统而言,12k 真的很低。更重要的是,如果您希望使用引导加载程序更新系统。

于 2015-08-11T14:10:16.583 回答