TI Stellaris片上flash代码保护
简介
代码的安全性已成为现代嵌入式系统极为重要部分。代码保护要求的范围也越来越广,从标记为只读的flash存储区块,完全禁止来自外部硬件设备调试的访问。 Stellaris®系列微控制器包含内置的代码保护功能,以满足客户多样化的保护需要。本应用笔记讨论一些这些保护功能及其局限性。
Flash区块保存
Stellaris微控制器可以通过软件配置,将片上flash的每一块(每块大小为2KB)均进行安全设置。位于系统控制地址区域里的flash读保护使能寄存器(FMPRE)与flash编程保护使能寄存器(FMPPE)控制着片上flash的安全属性。每2K的flash块在FMPRE与FMPPE寄存器里都有相对应的位,因此可以组合出多种flash读写安全属性。片上flash只能在永久锁定之间进行debug调试测试。

想了解更多关于片上保护寄存器的编程信息,请访问该系列datasheet的“片上内存”章节。
只运行保护
只运行保护使用片上flash只能运行,但是不允许再次编程与读取。该模式的典型应用于器件仍需要调试,但是某部分代码需要保护而不被外部调试器读取的情况。例如某公司欲出售其已经预编程的stellaris芯片,这样用户不仅可以调试其自己的代码,也可以保护公司的源代码不泄露,诸如内置了电机驱动模块在flash上,用户自己来配置自己的电机控制方案。
接下来介绍一下保护机制下的缺陷及解决方案。当C代码编译并链接后,编译器会将常量等文本数据类型的数据放在各个函数之间的数据区域。文本数据在程序运行时通过LDR指令来调用并加载入内存。LDR指令会在Cortex-M3的DCODE总线上执行操作,但受限于“只运行保护”机制。如果要访问的区域被“只运行保护”机制保护,那么此操作将会被禁止,处理器将不会加载所需要的常量,因此,正确的运行将被中止。可以通过以下三种方案来解决此模式下的正常读写文本数据:
方法一:通过对编译器的相关参数配置,将文本数据存入于一个单独可读的flash区块。注意LDR指令使用了PC指针的偏移地址,因此,要保证文本数据区域在偏移指令指向的地址范围内。
方法二:使用编译器,通过算术指令生成需要的文本数据。
方法三:如果编译器不支持上述两种方法,就使用汇编完成上述两种方法。
很遗憾,在此篇文章撰写时,尚无编译器支持方法一、二。也许现在的编译器可以达到了。