首页 > 其他分享 >FreeRTOS 基于 ARMv8-M 对 MPU 的应用

FreeRTOS 基于 ARMv8-M 对 MPU 的应用

时间:2023-08-05 18:13:25浏览次数:42  
标签:kernel task FreeRTOS wrapper mpu MPU ARMv8

一、前言

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 中。

标签:kernel,task,FreeRTOS,wrapper,mpu,MPU,ARMv8
From: https://www.cnblogs.com/MoralHao/p/17608344.html

相关文章

  • Vue进阶(幺肆幺):Vue 计算属性 computed 方法内传参
    (文章目录)一、前言在前期博文《Vue进阶(八十四):vue中Computed和Watch的使用和区别》中,讲解了vue中Computed和Watch的使用和区别,其中,只是介绍了computed如何计算元素属性,并未介绍如何方法传参。本篇博文主要讲解下如何利用computed的计算属性进行传参。二、场景引入在前端项......
  • 瑞萨电子MCU和MPU产品线将支持Microsoft Visual Studio Code
    全球半导体解决方案供应商瑞萨电子宣布其客户现可以使用MicrosoftVisualStudioCode(VSCode)开发瑞萨全系列微控制器(MCU)和微处理器(MPU)。瑞萨已为其所有嵌入式处理器开发了工具扩展,并将其发布在MicrosoftVSCode网站上,使习惯于使用这款流行的集成开发环境(IDE)和代码编辑器的大量......
  • Fusioncompute添加IPSAN
    IPSAN: 1.创建LUN 2.创建LUN组 3.添加主机( 注意:FC测逻辑接口地址为对接IPSAN的存储平面地址,添加去往IPSAN存储平面的路由,下一条给到FC测用于对接IPSAN存储平面的接口网关,即下图的168.10.1.1/24存储测WWPN/IQN为Fusioncompute中CNA节点的存储适配器WWN号  ......
  • M5ATOMS3基础02传感器MPU6886
    M5ATOMS3基础01按键简洁版本MPU6886是一款6轴IMU单元,具有3轴重力加速度计和3轴陀螺仪。它采用16位ADC,内置可编程数字滤波器和片上温度传感器,并通过I2C接口(地址为0x68)与上位机通信。MPU6886支持低功耗模式,并具有高性能规格,包括陀螺仪灵敏度误差±1%、陀螺仪噪声±4mdps/√Hz、加速......
  • watch和computed的区别
    官方文档vue-计算属性computed——>计算属性官方对于计算属性的解释是:对于任何复杂逻辑,你都应当使用计算属性。计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。个人理解:计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计......
  • 三维空间中的刚体运动、MPU6050、DMP姿态解算、卡尔曼滤波
    坐标系空间中三个正交的轴组成,构成线性空间的一组基($......
  • 2. CUDA--Heterogeneous data parallel computing
    UsingCUDACtodevelopasimpledataparallelprogram2.1DataparallelismTakinganexampleaboutCalculateimage.2.2CUDACprogramstructureCUDAC的代码包括:Host端(CPU)和Device端(GPU);CUDA程序执行流程:Host⇒Device⇒等待Device执行完毕⇒Host2.3A......
  • 记录--为啥面试官总喜欢问computed是咋实现的?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助从computed的特性出发computed最耀眼的几个特性是啥?1.依赖追踪import{reactive,computed}from'vue'conststate=reactive({a:1,b:2,c:3,})constsum=computed(()=>{returnstat......
  • Armv8-A 虚拟化学习
    Armv8-A虚拟化参考文献:Armv8-Avirtualization.pdfArm中,常使用的虚拟机监视器有Xen(type1)和KVM(type2)。全虚拟化和半虚拟化全虚拟化是指一般的虚拟机,它可以完全模拟物理机器。但性能差,每次对寄存器的操作都得经过监视器。半虚拟化是为了提升性能的,如GuestOS,它好像运行在一......
  • vue3组合式 API_为 computed() 标注类型
    computed() 会自动从其计算函数的返回值上推导出类型<template><h3>{{doubleCount}}</h3></template><scriptsetuplang="ts">import{ref,computed}from"vue"constcount=ref<number>(100)//推导得到的类型:ComputedRef&l......