大多数 Cortex-M MCU,无论是在现场还是在开发中,都具有内存保护单元 (MPU)。然而,由于交付产品的时间紧迫以及使用 Cortex-M MPU 的困难,这些 MPU 要么使用不足,要么根本没有使用。由于 MPU 要求 MPU 区域的大小为 2 的幂并且它们在大小边界上对齐,因此明显的大量内存浪费是内存有限的系统采用的另一个障碍。
然而,对于这些 MCU,MPU 和 SVC 指令是实现可接受安全性的唯一手段。因此,我一年半前就着手确定 MPU 的问题是否可以克服,是否可以设计一种实用的方法来升级后期和后期开发项目,以及使用 MPU 的新项目安全。我发现这样做是可行的,并且已经开发了 MPU-Plus 来简化这个过程。
分步 MPU 安全转换
首先确定您希望与系统其余部分隔离的最不可信或易受攻击的任务或分区。这可能是网络分区或第三方 SOUP [1]。它可能是最近黑客攻击的网站,在那里已经确定隔离易受攻击的代码比修复它更容易。我们建议采用增量方法来提高系统安全性。一次隔离一名不良行为者可以取得显着收益。但是,如果需要或需要,这种方法也适用于一次移植多个分区。图 4 说明了转换过程:
1.开始
首先,在启动代码的开头附近调用 sb_MPUInit()。这会打开 MPU 并启用其背景区域。您的应用程序应该正常运行。注意:在 sb_MPUInit() 中禁止将 sys_code 加载到 MPU[5] [2]和 sys_data 到 MPU[6],因为这些区域尚未定义。
- 系统区域
接下来,定义 .sys_code 和 .sys_data 部分。sys_code 应包含所有处理程序和 ISR shell [3]代码。如果 ISR 不使用 shell,则必须包含 ISR 本身。这是按照以下示例完成的,首先是汇编代码:
部分.sys_code
:代码:NOROOTTHUMBsmx_PendSV_Handler:smx_MPU_BR_ON;打开 MPU 背景区域……;处理程序代码 smx_MPU_BR_OFF ;关闭 MPU 后台区域 cpsid f sb_INT_ENABLE pop {pc}then for C 代码:#pragma default_function_attributes = @ ".sys_code"void sb_OS_ISR0(void) /* ISR shell /{ smx_ISR_ENTER(); / 打开 MPU 后台区域 / / ISR body 或在此处调用 ISR smx_ISR_EXIT(); /* 关闭 MPU 背景区域 */}#pragma default_function_attributes =
sys_data 包含系统堆栈 (SS) [4]。只要 sys_code 和 sys_data 是 ISR 或处理程序运行所需的全部,就可以消除 BR 宏。
然后在链接器命令文件中:
定义导出符号scsz = 0x1000;定义导出符号sdsz = 0x400&