EDN China > 技术文章 > 微处理器与DSP > CPU/GPU > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

采用闪存的微控制器在代码发布中的代码保护

21ic?? 2011年02月15日 ?? 收藏0

  如果解密引擎成功地解码数据, 它将把数据交给在闪存中对实际闪存块进行编程的程序例程。当然,对于不同产家,这个程序是不同的,在后面的设计实例中将给出COP8的程序。这个程序保留了一个128字节的RAM用于更新闪存。当然,这块RAM在装载程序完成后可以存放应用程序的数据。

  设计实例

  图3是一个具备解密功能的固件装载程序的流程图。装载程序使用在编程器和系统模拟程序中广泛使用的修改版Intel HEX数据格式。这将使应用程序现有架构支持标准并易于使用。装载固件程序用COP8汇编语言编写,以简少代码,并利用器件全部的闪存特性。

具备解密功能的固件装载程序的流程图

  简单来说,Intel HEX格式是一种用ASCII编码表示的数据记录格式,用于向设备的存储器编程对象代码或数据。该格式由下列字段组成:使用ASCII字符0x3A或者即“:”记录起始字段、长度范围为0x00-0xFF的数据长度字段(两个ASCII字符)、偏移字段、记录类型字段、信息或数据字段以及校验和字段。每个字段都由标准的可打印ASCII字符表示。例如,“10”代表十六进制0x10或者十进制16,可表示长度字段。实际上它的编码是0x31、0x30,这是“0” 和“1” 的ASCII码。因为内容是可打印的ASCII字符,能被文本编辑器查看,所以需要加密。

  表里包括了标准的Intel HEX格式记录类型。注意该标准只定义了6种记录类型。为利用现有的结构,装载程序采用Intel HEX 格式,并指定加密数据为一种新的记录类型。记录类型0x10将被用于代表加密数据,这是不能变的。

  代码装载程序也需要一个流程控制方法,以保证在下一个记录装载之前,写闪存的周期已经完成。在大多数的情况下,应用程序会产生可分成16个字节一组的文件,以方使阅读。通常闪存是以128或256字节进行分块,因此必须有一个装载程序的命令要求从主机来的数据允许可变记录大小。装载程序必须能处理256字节的数据,因为按照标准,这是最大的记录大小。表的底部显示了本例中新扩展的记录类型。因为COP8系列器件只有16位地址,无法执行记录类型0x02到0x05。对于具备更大闪存的处理器,例如CR16,它能直接访问16M字节的内存,就需要有扩展线性地址的记录类型。

  观察图3中的流程图,重新设置后的第一个任务是检验闪存的内容。这是通过读取各个128字节的页面(除了位于闪存顶部的自举验证代码和装载程序代码)来完成的。只验证应用程序的代码这使计算校验和非常容易。但如果需要,它也可以包括检测装载程序部件。当通过校验和检查,控制就被向量转移到应用程序固件的入口。入口保持不变非常重要。如果它发生了移动,装载程序会把向量转到一个不正确的入口,并可能出现崩溃。另外,装载程序可以从代码中读出进入向量,把向量压入堆栈并返回,以迫使从那个地址开始执行。这个方案允许入口点可变。

  如果校检和失败,装载程序将保持控制并不断地往主机发送信号,用硬件设计实现的任何手段开始装载。装载程序也可以控制用户接口通知这种状态。在调试系统时,一个表示“固件装载” 的简单的LED灯非常有用。

  装载程序将持续地向主机请求记录,直到主机通过EOF记录表明没有记录了。检测到的0x10类型记录 将被送到解码引擎,并适当解码数据。这使得实际向闪存写数据的代码,既可以操作加密数据,也可操作对未加密数据。对开发和内部测试来说,未加密的数据通路很有价值。当收到EOF记录后,所有新固件数据都被写入闪存。然后,装载程序把控制交还给自举测试,以验证新代码未被破坏。

  如上所述,现场可更新设备可以在不曝露IP的情况下得到实现。使用一个简单的密码, 制造商的固件就能得到保护,客户可以在世界各地能够访问因特网的地方更新他们的设备。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

闪存? 微控制器? COP8? 固件装载?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈