找回密码
 注册
关于网站域名变更的通知
查看: 173|回复: 3
打印 上一主题 下一主题

FreeRTOS MPU使系统更健壮!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-17 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
MPU(Memory Protection Unit,内存保护单元)在 Cortex-M内核中是可选模块,带MPU的微控制器允许内存映射(包括Flash、RAM和外围设备)细分为若干区域,分别给每个区域分配不同的访问权限。
! [; Q% e2 ^6 \FreeRTOS-MPU是FreeRTOS针对MPU实现的一个安全版本,支持ARMv7-M(Cortex-M3, Cortex-M4 和 Cortex-M7)和ARMv8-M (Cortex-M23和Cortex-M33) 内核的微控制器。
; s0 N3 _" P: p3 X% D# e针对ARMv7-M的FreeRTOS移植存在两个版本,一个支持MPU,一个不支持。针对ARMv8-M只有一个移植版本,通过编译开关控制是否支持MPU。
' [8 c! L" l- mFreeRTOS通过将任务分为特权和非特权运行模式和限制对RAM、外设、可执行代码、任务堆栈内存的访问,使得应用更健壮和安全。例如,防止代码从RAM中执行可以获得巨大的好处,因为这样做可以防止许多攻击向量,如缓冲区溢出漏洞或加载到RAM中的恶意代码的执行。& o4 @2 u3 o7 J! {# R4 |
使用MPU必然会使应用程序设计更加复杂,首先必须确定MPU的内存区域限制并向RTOS进行描述,其次MPU限制应用程序任务可以做什么和不能做什么。9 a; S& z4 ]5 U! L

) s; O2 d2 q  GMPU的策略
. e* i* \  a1 u' p. z创建一个将每个任务限制在其自己的内存区域的应用程序可能是最安全的,但它也是设计和实现最复杂的。通常最好使用一个MPU来创建一个伪进程和线程模型——允许线程组共享内存空间。例如,创建一个可被可信的第一方代码访问的内存空间,以及一个仅可被不可信的第三方代码访问的内存空间。
! B& K, l( E* H1 h  M7 I. u: B7 u0 O$ n# I$ b3 Q. Q4 O
FreeRTOS-MPU特性, |) e; F& M/ h2 @5 q
兼容ARM Cortex-M3和Cortex-M4F标准移植。
! G  |0 T5 p* q& p+ [$ N3 ]可以创建以特权模式或非特权模式运行的任务。非特权任务只能访问它们自己的堆栈和最多三个用户可定义的内存区域(每个任务三个)。用户可定义内存区域是在创建任务时分配给任务的,如果需要,可以在运行时重新配置。
  Z! X/ I: o; v$ C# O用户可定义的内存区域可以单独参数化。例如,一些区域可能被设置为只读,而另一些区域可能被设置为不可执行(在ARM术语中简称为XN),等等。# B" _$ @- ]3 B) _) f4 i. e
非特权任务之间不共享数据内存,但非特权任务可以使用标准队列和信号量机制相互传递消息。可以通过使用用户可定义的内存区域显式地创建共享内存区域,但是不建议这样做。0 N7 l& c8 ^; j
特权模式任务可以将自己设置为非特权模式,但一旦进入非特权模式,它就不能再将自己设置为特权模式。
1 W& S; n# S: F; }) ~* DFreeRTOS API位于Flash的一个区域,该区域只能在微控制器处于特权模式(调用API函数导致临时切换到特权模式)时访问。
. E( c& t6 Y! j. F+ F1 N$ W# Y内核维护的数据位于RAM的一个区域,只有在微控制器处于特权模式时才能访问。! M  @* H& m$ ~' q  R6 }" X* u
系统外设只能在微控制器处于特权模式时访问。任何代码都可以访问标准外设(UART等),但是可以使用可定义的内存区域显式地对其进行保护。, b" s/ i8 c! ]. b+ x2 U# [
FreeRTOS-MPU可以创建两种类型的任务:
& O" M% s0 A, D! Q) g2 n特权任务:特权任务可以访问整个内存映射。特权任务可以使用xTaskCreate()或xTaskCreateRestricted() API函数来创建。
% w, \7 }- _) P* I9 I' q; Q非特权任务:非特权任务只能访问它的堆栈。此外,可以授予它最多三个用户可定义内存区域的访问权限(每个任务三个)。非特权任务只能使用xTaskCreateRestricted()创建。注意,xTaskCreate()不能用于创建非特权任务。
$ K5 H4 O/ T* ?9 k5 }如果一个任务想要使用MPU,那么必须提供以下附加信息:
1 ?# m2 z: ^) \1 J" G
2 X2 _- G# @& h# \4 N7 i# w& F/ i; M( p& p

, v# r. U9 C0 g; _1 T) J" p6 h2 Z
' H) d' ?3 X* p0 n4 {1 g) L: h
5 b3 r+ O- ]4 _0 s: h! W) w+ `" j1 b0 e3 b
" ~1 R- n/ a  Y  Y, }

* @! G* z0 _) ?) y2 s( f! y3 p* g3 v6 c6 @" B# l+ k4 J# W

7 X0 r- f1 j% ^  Z% C

该用户从未签到

3#
发表于 2022-6-17 13:48 | 只看该作者
X86的实模式,保护模式,虚拟模式。

该用户从未签到

4#
发表于 2022-6-17 15:57 | 只看该作者
X86的实模式,保护模式,虚拟模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 14:49 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表