一、前言

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 的应用的更多相关文章

  1. Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)

    Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32) 作者:猾蚁 QQ:7376220一.Bootloader 程序1. 准备好升级程序项目,可以使用 STM32 ...

  2. 基于ARMv8的固件系统体系结构

    基于ARMv8的固件系统体系结构 The architecture of ARMv8-based firmware systems 自2011年发布以来,ARMv8处理器架构在移动设备市场上已经相当普 ...

  3. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  4. Cortex-A15架构解析:它为什么这么强(转)

    今年的新手机趋势无异是全面向四核靠拢,不过同样是四核,在实际的性能上其实是千差万别.例如针对入门级主流市场的四核手机普遍采用的都是Cortex-A7以及 Cortex-A9 级别的CPU内核,这类内核 ...

  5. [百家号]华为:最强ARM服务器芯片,华为鲲鹏920处理器发布

    华为:最强ARM服务器芯片,华为鲲鹏920处理器发布   泡泡网 百家号2019-01-0716:11 https://baijiahao.baidu.com/s?id=162198839753232 ...

  6. 什么是OPTEE-OS

    1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...

  7. STM32开发(一):简介及开发环境

    1. 背景 STM32是意法(ST)公司开发的基于ARM Cortex-M系列的一系列微控制器(MCU). 有两种库 标准外设库(StdPeriph_Driver.Standard Periphera ...

  8. [转帖]华为PC端台式机电脑来啦!自研主板及自研CPU处理器

    华为PC端台式机电脑来啦!自研主板及自研CPU处理器 在性能上,4核版相当于酷睿i5 ,8核版相当于酷睿i5 8300H. https://www.bilibili.com/read/cv376376 ...

  9. 将linux和uboot集成到Android编译框架中

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  10. Android.mk走读与Cmake配置

    Android.mk认识: 在上一次[https://www.cnblogs.com/webor2006/p/9946061.html]中学会了用NDK提供的交叉编译工程编译成Android能运行的可 ...

随机推荐

  1. 【漏洞分析】ReflectionToken BEVO代币攻击事件分析

    前言 BEVO代币是一种Reflection Token(反射型代币),并且拥有通缩的特性.关于Reflection Token更为详细的说明可参考这篇文章.然后目前浏览到的很多分析报告没有指出其漏洞 ...

  2. 2022-08-28:把字符串 s 看作 “abcdefghijklmnopqrstuvwxyz“ 的无限环绕字符串, 所以 s 看起来是这样的: ...zabcdefghijklmnopqrstuv

    2022-08-28:把字符串 s 看作 "abcdefghijklmnopqrstuvwxyz" 的无限环绕字符串, 所以 s 看起来是这样的: -zabcdefghijklmn ...

  3. 2022-08-27:以下go语言代码输出什么?A:[0];B:panic;C:7;D:不清楚。 package main import ( “fmt“ ) func main() { a

    2022-08-27:以下go语言代码输出什么?A:[0]:B:panic:C:7:D:不清楚. package main import ( "fmt" ) func main() ...

  4. 2020-11-08:在Mysql中,三个字段A、B、C的联合索引,查询条件是B、A、C,会用到索引吗?

    福哥答案2020-11-08: 会走索引,原因是mysql优化器会把BAC优化成ABC. CREATE TABLE `t_testabc2` ( `id` int(11) NOT NULL AUTO_ ...

  5. 2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置。现在需要依次的从 0 号点走到 N-1 号点。但是除了 0 号点和 N-1 号点,他可以在其余的 N-2 个位置中选出一个点,并直接将这个点忽略掉,问从起点到终点至少走多少距离?

    2021-03-10:一个数组上共有 N 个点,序号为0的点是起点位置,序号为N-1 的点是终点位置.现在需要依次的从 0 号点走到 N-1 号点.但是除了 0 号点和 N-1 号点,他可以在其余的 ...

  6. 2021-11-15:四数相加 II。给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i,

    2021-11-15:四数相加 II.给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= ...

  7. 2021-10-12:验证回文串。给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串 。输入: “A man, a plan

    2021-10-12:验证回文串.给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写.说明:本题中,我们将空字符串定义为有效的回文串 .输入: "A man, a ...

  8. OData WebAPI实践-兼容OData集合响应

    本文属于 OData 系列文章 引言 OData 是一个开放标准,已经在 oasis 组织标准化,因此我们可以在标准的官网查询到 OData 的标准请求与返回形式:OData JSON Format ...

  9. uni-app Flex布局

    Flexbox #Flex 容器 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. nvue布局模型基于 CSS Flexbox, ...

  10. 「P4」试下1个半月能不能水出个毕设

    期间的一些感想 对于这个时间的把控,前一个月实际上我什么都没做,现在都堆在最后的半个月了 在做毕业设计的阶段,我总结了一个教训,就是:「慢就是快」,我想这句话可能对我以后的学习都会有比较大的影响.我是 ...