FreeRTOS 基于 ARMv8-M 对 MPU 的应用
一、前言
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 中。
FreeRTOS 基于 ARMv8-M 对 MPU 的应用的更多相关文章
- Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)
Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32) 作者:猾蚁 QQ:7376220一.Bootloader 程序1. 准备好升级程序项目,可以使用 STM32 ...
- 基于ARMv8的固件系统体系结构
基于ARMv8的固件系统体系结构 The architecture of ARMv8-based firmware systems 自2011年发布以来,ARMv8处理器架构在移动设备市场上已经相当普 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型
1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性 2. 存储系统体系结构 2.1. 地址空间 指令地址空间溢出 指令地址计算((address_of ...
- Cortex-A15架构解析:它为什么这么强(转)
今年的新手机趋势无异是全面向四核靠拢,不过同样是四核,在实际的性能上其实是千差万别.例如针对入门级主流市场的四核手机普遍采用的都是Cortex-A7以及 Cortex-A9 级别的CPU内核,这类内核 ...
- [百家号]华为:最强ARM服务器芯片,华为鲲鹏920处理器发布
华为:最强ARM服务器芯片,华为鲲鹏920处理器发布 泡泡网 百家号2019-01-0716:11 https://baijiahao.baidu.com/s?id=162198839753232 ...
- 什么是OPTEE-OS
1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...
- STM32开发(一):简介及开发环境
1. 背景 STM32是意法(ST)公司开发的基于ARM Cortex-M系列的一系列微控制器(MCU). 有两种库 标准外设库(StdPeriph_Driver.Standard Periphera ...
- [转帖]华为PC端台式机电脑来啦!自研主板及自研CPU处理器
华为PC端台式机电脑来啦!自研主板及自研CPU处理器 在性能上,4核版相当于酷睿i5 ,8核版相当于酷睿i5 8300H. https://www.bilibili.com/read/cv376376 ...
- 将linux和uboot集成到Android编译框架中
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...
- Android.mk走读与Cmake配置
Android.mk认识: 在上一次[https://www.cnblogs.com/webor2006/p/9946061.html]中学会了用NDK提供的交叉编译工程编译成Android能运行的可 ...
随机推荐
- Prism Sample 4 View Discovery
前三节算是弄明白了Region是什么,但是定义了区域,怎样向区域中添加内容呢?内容是UserControl,即ViewA. 添加内容的方式有2种,一种叫View Discovery,一种叫View I ...
- spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题
NEVER 不使用事务,如果当前事务存在,则抛出异常 验证: @Service public class PrService { @Autowired PrDao dao; @Transactiona ...
- 2015年5月最新win7纯净版系统(32位)补丁最新
下载地址: http://yunpan.cn/cVN9e679hZ2Pe 访问密码 203a 一.系统安装工具 √ 自由天空最新万能驱动 √ 一键GHOST备份还原系统 √ 硬盘安装系统安装器,增 ...
- 2022-04-25:给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。 输入: nums = [1,3,1] k = 1 输出:
2022-04-25:给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 输入: nums = [1,3,1] k = 1 输出: ...
- 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
2021-03-30:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的.返回其长度. 福大大 答 ...
- Requested setting INSTALLED_APPS, but settings are not configured. You must either define the env...
解决办法 在test.py文件的最头部加上以下代码,配置环境 import os,django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djb ...
- AcWing 278. 数字组合
给定 N 个正整数 A1,A2,-,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案. 输入格式 第一行包含两个整数 N 和 M. 第二行包含 N 个整数,表示 A1,A2,-,AN. 输 ...
- 【密码学】为什么不推荐在对称加密中使用CBC工作模式
引言 这篇文章是我在公司内部分享中一部分内容的详细版本,如标题所言,我会通过文字.代码示例.带你完整的搞懂为什么我们不建议你使用cbc加密模式,用了会导致什么安全问题,即使一定要用需要注意哪些方面的内 ...
- js通过className删除元素
有时候难免需要使用js进行 dom 操作:如在删除地图feature时同时得清除提示框 这个就需要使用 .parentNode.removeChild(元素) let chArr = document ...
- Volo.Abp升级小记(二)创建全新微服务模块
@ 目录 创建模块 领域层 应用层 数据库和仓储 控制器 配置微服务 测试微服务 微服务注册 添加资源配置 配置网关 运行项目 假设有一个按照官方sample搭建的微服务项目,并安装好了abp-cli ...