首页>资讯 > 正文

FreeRTOS 基于 ARMv8-M 对 MPU 的应用

2023-08-06 02:31:13    出处:博客园
一、前言

ARMv8-M 支持 MPU,FreeRTOS 也添加了对这些 MPU 的应用代码。这里用来记录 FreeRTOS 对 MPU 应用方式的探究结果。

二、ArmV8-M MPU 介绍

ARMv8-M MPU 支持每个安全状态(non-secure 和 secure)0-8个区域的配置。MPU 的主要特性如下:

区域最小大小为32字节,最大为4GB,但必须为32字节的整数倍所有的区域必须以32字节对齐每个区域对两个处理器模式(privileged 和 unprivileged)拥有独立的读/写权限eXecure Never(XN)属性可以用来分割代码段和数据段三、FreeRTOS 对 MPU 的应用

FreeRTOS 对 MPU 的配置主要体现在2个方面:


(相关资料图)

配置 MPU Region,隔离 code / data提供 unpriviliged task 调用 priviliged api 的机制MPU Region 划

以 8个 MPU Region 为例,FreeRTOS 对 MPU 的使用情况如下:

在该配置下,要求同一个 section 的 code / data 放在连续的地址空间;若实际硬件上有多块不连续的 flash 或 sram,则需要控制链接文件让相同 section 的数据位于连续空间;若实在无法满足上述约束,则需要改造 FreeRTOS 的 MPU 配置(可能需要减少用户自定义 Region 数量)。

系统调用方式

在 MPU 开启后,kernel api 处于 privileged section, unprivilege task 会被MPU屏蔽而无权直接访问;FreeRTOS 提供了 wrapper 层,用于间接调用 kernel api,其命名为 MPU_xxx(xxx 是 kernel api 名称)。为了确保兼容性,减少用户调用的复杂性,FreeRTOS 还通过 mpu_wrapper.h 将 xxx 映射为 MPU_xxx。

系统调用目前有2个版本,分为 mpu_v1 和 mpu_v2。

1、MPU V1

mpu_v1 的工作流程如下:

可以看到,task 需要先调用 wrapper 层的接口 MPU_xxx,再由 wrapper 层调用 kernel api;在 mpu_wrapper 中,会对 task 的权限做检查:

privileged task : task 有权访问 kernel privileged function,mpu_wrapper 直接调用 kernel api;unprivileged task : task 无权直接访问 kernel privileged function,mpu_wrapper 需要先通过 svc 临时提升任务权限,然后调用 kernel api,最后在 mpu_wrapper 返回前恢复原始任务权限;2、MPU V2

mpu_v2 的工作流程如下:

与 mpu_v1 相比,mpu_v2 有如下改动:

添加了转换层(mpu_wrapper_v2),用于隐藏内核对象句柄(FreeRTOS的内核对象句柄是内核对象的指针);unprivileged task 调用 kernel api 时,会将栈切换到专用的 system call stack;

根据讨论,这么做的主要目的是为了防止泄露信息给 unprivileged task.

四、MPU 对 FreeRTOS 的其他影响pxTopOfStack 的变化

pxTopOfStack 是 TCB 中的首个成员,主要用于任务切换时记录栈的位置。

在未开启 MPU 时,pxTopOfStack 直接指向任务栈,cpu 上下文信息存储在任务栈上;

在开启 MPU 后,pxTopOfStack 指向 TCB 中的 ulContent 区域,cpu 上下文信息存储在 ulContent 中,而任务的栈指针则存储在 ulContent 中。

关键词:

消费
产业
中央气象台8月5日18时发布大风蓝色预警 中央气象台8月5日18时发布大风蓝色预警:预计,8月5日20时至6日20时,
探访暴雨后千灵山景区及后莆营村:重建家园,每个人自信而有力量 7月29日以来,受台风“杜苏芮”影响全市出现极端连续强降雨,城六区累
哈登去快船不如加盟绿军?美媒晒2换2交易方案:联手双探花可冲冠 具体交易方案是:76人送出哈登和科尔克马兹,得到凯尔特人的布罗格登和
“变身”宇航员、学习“建”地铁……四川这些留守儿童参加夏令营充实过暑假 “原来地铁是这样建设的”“原来水资源可以分解出氧气”,8月2日,“千
基金