你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】理解与应用MPU的特权与用户模式

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
& o# ]9 e) Z3 r
前言: Y# g; x! m' f4 _8 n1 `$ g
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。7 v- e+ _3 B, Q+ l

/ l5 n) X  x* R4 ?. F( r3 y& Z. UMPU(Memory Protection Unit). l, _' U8 |4 Q  D
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
4 W( E& s0 {3 `用来设置内存属性的 MPU_RASR寄存器字段描述如下:
% F. S5 g1 w8 [0 _* q! x7 V
11.jpg
* h. H% ^0 Q* \* ~8 ?, i, D图表 1 MPU_RASR字段
3 L& ~; c: I' ^! R3 ?
7 H; c' p8 ~5 X" M! q: o在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: - N' q' W/ `4 r* p9 J
12.jpg
8 u. E$ ], c9 w0 Q5 \图表 2 内存访问权限设置# ~" s4 e/ s( S; [  {% Q8 g) s: N

# r4 ?2 I9 ~3 Q- @- f特权模式(Privileged mode)与用户模式(UnPrevileged mode)
/ G5 s5 [2 D8 N5 f特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
% _% u# o! Q% f/ T$ F从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
! j8 v+ j3 [' ^. Y/ |: J如下图所示:# X) X1 q. z' A) K6 V
13.jpg 1 l& z" A6 D: i' N1 I4 ^8 V1 @1 x

4 k# t5 H: q9 A. _6 }8 [在代码中结合特权与用户模式使用MPU; }6 o" R. l+ }+ z' y1 t6 H5 _
1. 开发环境' k/ k- U: D5 |8 x8 r6 Q. R9 }( {
开发板: STM32 L476RG NUCLEO
) n. p; W8 t5 a" T- F- }) p8 L: m2 a开发工具:STM32Cube_FW_L4_V1.7.0; G$ Y* W, U, m# h) T
                IAR/Keil, q* _$ ?; L: F! C5 _1 X* \
注:也可以选择其他STM32系列并选择相应的开发板与固件库。3 G* V9 o8 Z) T
   
% c2 j* [) O0 |) b& ^2. 开发目标定义$ W* l9 w0 ]5 g5 ]: k" }- F
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。
+ F  H; V* p6 N& F- `/ }- [: M$ [5 s
14.jpg % l& I8 j6 u' s8 \& |
图表 3 特权模式与用户模式的切换
7 s' }  d; u/ I1 f9 r% B
3 z# t* `: U/ L9 b* b9 H3. 代码资源与整合& w, D. W/ U; p
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。
0 y! T5 w2 S6 a  o( u0 P
15.jpg - F9 J. D! F: Z

# _" g: H) E9 v) e: n我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
/ k1 Z8 ?0 v% e; Q& y+ R复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
6 ^4 O5 O/ E& r4 W7 T! _
16.jpg
; s7 g( M. I' ]  H复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
& G, Z. N, B0 h  o; L4 d  o, Y
17.jpg
0 v" V% p0 ~6 X- B5 i7 X9 D7 H打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。8 [+ Y- |7 L2 |5 j+ z: c
. L" ^$ X" n* `, B- f6 w
( Q8 ^- ?0 a" {) j4 t
4. 修改与增加代码/ {- V, O$ [/ J  b/ ]$ z
新增加的代码以红色表示" l* \" N! z4 D' A8 p+ u
●在主程序中包含stm32_mpu.h
$ Y' ^+ |5 U* N  Y/ A( C" }
18.png
% R; q/ p5 f$ C7 R●在主程序里调用MPU配置函数
$ U8 p2 b* Q( \, p7 I% a) l+ |要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。
( u) M  i7 F( _% j
19.jpg " d$ c4 ~) ~& K  B- k; S' v$ L
●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。
7 r0 h1 K! e0 Y% AMPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
4 f" C, K; @% K0 l7 J1 C
21.jpg % e' l' q5 ^4 R/ A! ?
22.jpg
: b  S* N2 b( j●在用户模式下尝试读写数组
. Y! X  B4 H; Q) v参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。 6 r7 {4 j8 J0 _$ n/ y
23.jpg
7 \' t. i+ L1 b: `  n+ ?
24.jpg 5 q5 D/ i7 c6 C4 h" H4 P, D3 B0 h
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。
) a8 C5 A% {2 s+ z& k7 Z: D5 ^+ w7 g+ t+ g# m: u% N' u

* j; j" y1 W* B, ~5. 关键代码分析' P9 Q" Z0 O) t% z+ Q( ?
●从特权模式进入用户模式。直接设置CONTROL寄存器。
. U$ A7 A( X) b  m0 z
25.jpg & D4 m% K" g5 u* g& O- M" s
●从用户模式回到特权模式,需要触发异常处理
% d; ]6 l. M, Y. L+ s
26.jpg ( K6 G4 L; W, |  {/ b2 W
●在异常处理中将线程回到特权模式执行5 G( |; Z7 |5 J: K+ s
27.jpg 9 Y; M; `4 G4 e! q; \' i
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 ( `1 r' d3 ^/ e9 o/ j2 f
28.png
( h0 m" y) Q$ h* X' x
$ z* S7 A+ j8 s1 S3 H/ N  [6 v8 z结论; A1 A9 x9 g# z5 |- {/ {
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
, J7 f* N2 |3 d* I
. L4 n( _: ?: B5 W: Z

) u1 l( @" B# y( N/ S' {/ S文档下载
& r. k8 h/ ]9 v* n" X; h, b
) Y. X$ J6 u# B5 i8 X  p更多实战经验) m0 k0 L! m$ ]7 v
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~1 x6 A1 e. N* a" f6 p% M
creep 回答时间:2017-6-21 20:43:11
实战技术很有用。
epochal 回答时间:2017-6-21 21:23:57
谢谢分享!
崔洪玮 回答时间:2019-2-17 16:49:59
谢谢分享
Kevin_G 回答时间:2019-2-18 09:38:03

. \; i8 T2 h# m+ L' {. a5 f谢谢分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版