实现完全 MCU 分区隔离:MPU 管理

这是关于为基于 MCU 的系统实现高安全性的系列文章中的第二篇。在这篇文章中涉及的安全基础,划分MCU软件,父/子任务,utasks和ptasks的优势。在本文中,我们将详细介绍 MPU 管理。如第一篇文章所述,这不是教程。为此,建议参考文章末尾的参考资料。

图 1 显示了任务控制块 (TCB)内存保护阵列 (MPA)MPA 模板之间的关系


图 1:模板、MPA 和 TCB 关系。(来源:作者) 

请注意,MPA 模板可能适用于单个 MPA 和任务,也可能在任务及其 MPA 之间共享。通常,在后一种情况下,任务将在同一分区中。还有一个不需要模板的默认 MPA。当没有为任务创建 MPA 时使用它。在接下来的部分中,我们将讨论如何定义模板。

定义区域

正如本系列的第一篇文章中所讨论的,定义分区的第一步是定义分区需要的代码、数据和 IO 区域以及某些标准区域,这些区域将在下面讨论。为此,第一步是定义部分

部分

为了定义部分,没有必要重新组织包含来自其他分区的代码或数据的模块。为此,可以使用编译指示,如下(注意:所有代码和说明均针对 IAR EWARM 工具套件)

#pragma default_function_attributes = @ ".t2a_text"
无效 ttCD18_t2a(无效)
{
…
}
#pragma default_function_attributes =

同样,对于数据:

#pragma default_variable_attributes = @ ".t2a_data"
u32 irq;
TCB_PTR 父级;
u32 tskctr;
#pragma default_variable_attributes =

分散在许多模块中的同一节 pragma 定义由链接器合并为一个节。如果模块在各处的编译指示变得过于混乱,那么可以将一个分区的代码和数据分组到相同的分区模块中。然后,可以使用命令行选项,而不是编译指示。例如,在一个分区模块的项目文件中的 Options / C/C++ Compiler / Extra Options 中,如下:

--section.bss=.t2a_bss
--section.data=.t2a_data
--section.text=.t2a_text
--section.rodata=.t2a_rodata
--section.noinit=.t2a_noinit

只需重命名编译器分配的节名称。(一定要覆盖Inherited settings。)如果一个分区的几个模块被分组到一个项目文件节点中,那么上面的内容只需要放在那个节点的选项中。或者,代替上述内容,将以下内容放入额外选项中:

-f $PROJ_DIR$\..\..\..
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值