mpu如何实现内存保护?

strongerHuang strongerHuang     2023-03-07     689

关键词:

关注+星标公众,不错过精彩内容

作者 | strongerHuang

微信公众号 | 嵌入式专栏

MPU有很多含义,我们常见的有:

MPU:Memory Protection Unit,内存保护单元(本文描述的内容);

MPU:Microprocessor Unit,微处理器;

这里说的是内存保护,所以,大家不要把MPU搞混了。

为什么要使用MPU?

如果你开发的嵌入式项目,因内存溢出,或者内存故障等一些原因,造成了重大经济损失,或者造成了重大事故,你就能体会为什么要使用内存保护单元(MPU)了。

在嵌入式系统中使用内存保护单元(MPU)可以在开发早期及时发现因内存而导致的Bug,节省更多开发时间。

同时,在项目后期修改Bug,或者增加功能,可以减少修改文档和测试所需的时间。

也就是说,使用MPU,会避免因为修改一个bug,而引起多个bug的情况(0生1,1生万物)。

MPU如何实现内存保护

简单来说就是保护与当前执行的代码不相关的所有数据。

拿RTOS任务A和B来说:

任务A和B不应相互交互数据,但是存在一个错误,任务A可能会意外地写入任务B偶尔使用的某些数据,不会影响任务A的正确操作。但是,当任务B尝试使用损坏的数据时,任务B可能会意外故障。

如果没有配置MPU来阻止任务A写入任务B的数据,则该错误可能需要很长的时间供开发人员跟踪。如果错误很小,或者如果任务B很少使用该数据,则将很难解决该bug。但是,如果使用了MPU,则该bug就会及早被发现。

在某些体系结构上,MPU甚至可以帮助你检测NULL指针引用,因为你可以设置MPU区域以防止非特权代码访问内存0x0。

应用程序中一组设计良好的MPU区域可以很好的保护重要的内存区域,以防止出现特定的问题。

一个很好的例子是通过在MPU区域的末尾放置缓冲区来防止缓冲区溢出,你还可以将任务堆栈放置在任何非特权代码都无法访问的区域。如果这样做,则每个任务必须使用自己的MPU区域之一来设置自己对自己的堆栈的访问权限。

使用MPU的好处

无论是操作系统,还是裸机系统,如果没有防止恶意访问错误内存的能力,系统将有重大安全问题,以及安全漏洞的雷区。

使用的内存保护单元(MPU)有很多优势,MPU通常允许你以特权或非特权模式运行,并使用一组“区域”来确定当前正在执行的代码是否具有访问代码和数据的权限。

每个区域都是一个连续的内存块,具有该内存的一组权限,特权和非特权访问。与非特权代码的子集相比,特权代码往往可以访问大部分(但不是全部)内存。

在整个系统运行时中,这些区域不必相同。MPU区域可以根据每个任务进行修改,每个任务可以具有自己独特的区域集,这些区域在任务移至运行状态时进行配置。

这使你可以仅对需要代码和数据的任务设置访问权限,利用MPU的嵌入式操作系统将在每次上下文切换期间管理每个任务的区域和特权级别。

比如设置RTOS两个任务不同的内存保护区域:

上面这张图,大家都能看懂吧?Flash和内存区域被分别设置保护。

两个全局保护区域:Flash开头、RAM开头;

在Flash中,一部分仅限任务1访问,这部分不能被任务访问;同时,在Flash另外区域,仅限任务2访问,不能被任务1访问。如果这两部分区域被对方访问,则会生成生成MPU故障。

在RAM区域,同一部分区域,一个只能被读,一个只能被写入,如果不按约定操作,同样也会生产MPU故障。

什么时候不使用MPU?

通常有两种情况可以不使用处理器上的MPU功能:

  • 一个简单的项目

  • 一个对性能至关重要的项目

第1个很简单:一个非常简单的应用程序基本上没必要使用MPU,反而增加了系统的复杂性。不设置内存保护,RAM和外围设备的MPU区域,你自己一眼就能找到bug。

第2个对性能要求高的项目,在上下文切换时,设置内存保护,堆栈那些操作,有可能影响系统的实时性,从而导致系统异常。这个需要结合项目实际情况考虑用,还是不用MPU功能。

------------ END ------------


●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

stm32--mpu内存保护单元

...f09;提供保护,从而提高系统可靠性通过这些规则可以实现如下功能防止不受信任的应用程序访问受保护的内存区域。防止用户应用程序破坏操作系统使用的数据。通过阻止任务访问其它任务的数据区。允许将内存区域定义为... 查看详情

stm32--mpu内存保护单元(二)(代码片段)

上一篇我们说了MPU内存保护单元的基本原理跟寄存器,这一篇我们来说下HAL库的函数及基本配置本章说的一些HAL库参数,请参照上篇寄存器说明部分:STM32–MPU内存保护单元(一)首先我们来看一下在stm32h7xx_hal_cortex.h中... 查看详情

stm32--mpu内存保护单元(二)(代码片段)

上一篇我们说了MPU内存保护单元的基本原理跟寄存器,这一篇我们来说下HAL库的函数及基本配置本章说的一些HAL库参数,请参照上篇寄存器说明部分:STM32–MPU内存保护单元(一)首先我们来看一下在stm32h7xx_hal_cortex.h中... 查看详情

mpu:鸿蒙轻内核的任务栈的溢出检察官(代码片段)

摘要:MPU(MemoryProtectionUnit,内存保护单元)把内存映射为一系列内存区域,定义这些内存区域的维洲,大小,访问权限和内存熟悉信息。本文分享自华为云社区《鸿蒙轻内核M核源码分析系列十六MPU内存保护单元》... 查看详情

为什么rtos系统要使用mpu?

...,我们常见的有:MPU:MemoryProtectionUnit,内存保护单元(本文描述的内容);MPU:MicroprocessorUnit,微处理器;还有,可能有人会与MPU-6050这类模块联系在一起。所以,大家不要把MPU搞... 查看详情

为什么rtos系统要使用mpu?

...,我们常见的有:MPU:MemoryProtectionUnit,内存保护单元(本文描述的内容);MPU:Mic 查看详情

freertosmpu使系统更健壮!

...不错过精彩内容转自|麦克泰技术MPU(MemoryProtectionUnit,内存保护单元)在Cortex-M内核中是可选模块,带MPU的微控制器允许内存映射(包括Flash、RAM和外围设备)细分为若干区域,分别给每个区域分配不同的访问权... 查看详情

linux是如何保护内存的?

】linux是如何保护内存的?【英文标题】:Howdoeslinuxprotectmemory?【发布时间】:2012-04-2807:31:09【问题描述】:我感兴趣的是从汇编的角度来看linux如何在保护模式下运行。在将cpu置于i386:0x86_64机器的保护模式时,使用了哪些寄存器... 查看详情

STM32H7 MPU 可共享内存属性和强序内存类型

】STM32H7MPU可共享内存属性和强序内存类型【英文标题】:STM32H7MPUshareablememoryattributeandstronglyorderedmemorytype【发布时间】:2020-08-2220:08:39【问题描述】:我对STM32H7MPU的一些属性感到困惑。我已经阅读了几篇文档:STM32H7参考和编程... 查看详情

(王道408考研操作系统)第三章内存管理-第一节2:内存管理的基本概念

...配与回收操作系统需要负责内存空间的分配与回收,例如如何标记哪些区域已经被划分出去了,哪些又还是空闲的?当进程运行结束之后,如何将进程占用的内存空间回收?进程应该放在内存哪个位置?… 查看详情

安卓rk3399编译驱动mpu6050,实现内核层与hal层驱动(代码片段)

新手编译安卓驱动学习今天我们一起学习一下如何实现对一款有驱动代码的传感器适配安卓系统开发板:某AR眼镜公司的开发板RK3399文章目录新手编译安卓驱动学习安卓驱动开发常用知识(非新手可以跳过):1.什... 查看详情

在java中,如何清除每个方法中的字节[]数组以保护值免受内存转储?

】在java中,如何清除每个方法中的字节[]数组以保护值免受内存转储?【英文标题】:Injava,howtoclearbyte[]arrayinsideeverymethodtoprotectthevaluefrommemorydump?【发布时间】:2018-05-2107:51:19【问题描述】:在java中,如果我在下面运行代码,pwd... 查看详情

如何强制实现受保护的静态函数

】如何强制实现受保护的静态函数【英文标题】:Howtoforceanimplementationofaprotectedstaticfunction【发布时间】:2014-05-1515:33:48【问题描述】:我正在尝试编写一个抽象类(或接口),它强制扩展类实现受保护的静态函数。但这对于抽... 查看详情

GPU上是不是有内存保护

...存保护,一个内核可以轻松写入另一个内核。这个问题是如何解决的? 查看详情

tic66xdsp四种内存保护问题-之-cpu訪问corepac内部资源时的内存保护问题

CPU訪问corePac内部资源(L1。L2)时的内存保护(通过设置内存的訪问权限实现)等问题请參考以下两个blog。已经叙述的非常具体。"TIC66xDSP系统events及其应用-2","TIC66xDSP系统events及其应用-3"。 查看详情

如何进行 MPU6050 加速度计温度校准?

】如何进行MPU6050加速度计温度校准?【英文标题】:HowtoperformMPU6050AccelerometerTemperatureCalibration?【发布时间】:2017-06-2313:14:13【问题描述】:我正在使用MPU6050加速度计做一个项目。首先我只计算一次执行thesketchofLuisRódenas的MPU的... 查看详情

MIPS 内存执行预防

...题描述】:我正在对MIPS架构进行一些研究,并且想知道如何使用mips提供的有限指令和内存保护来实现操作系统。我特别想知道操作系统如何阻止某些地址范围被执行。例如,操作系统如何限制PC在特定范围内运行?换句话说,... 查看详情

MPU-9250如何配置通过I2C

】MPU-9250如何配置通过I2C【英文标题】:MPU-9250howtoconfigurepassthroughI2C【发布时间】:2015-07-1109:35:48【问题描述】:我有一个MPU-9250通过I2C连接到英特尔爱迪生arduino板(引脚A4/A5)。我可以阅读,并且可以完美地阅读加速器和陀螺... 查看详情