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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
' {8 @$ u" S: k4 m3 P! O4 W
前言
/ y- f! I/ L" @/ X/ j0 K4 x  VSTM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。
3 E8 q' z+ l4 W: K  h& l3 w2 A" G2 C0 C! K
MPU(Memory Protection Unit)" ~. Y4 d1 H: r/ Y5 I& c# t0 J
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
# t: M" Q8 L( ~' S  W# J( ^" L用来设置内存属性的 MPU_RASR寄存器字段描述如下:
' R3 Z! N* T  u
11.jpg
; Z) N, }/ C- K% l9 ^# O4 y" G图表 1 MPU_RASR字段( {% k2 k% K6 x! a1 Y* g- b- @
8 V$ i2 b; Y. r0 Q* w6 ]
在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: " f  f+ r/ |5 {) L' Z
12.jpg
( k+ s5 F  ]' X( h图表 2 内存访问权限设置
6 I( l, c; |- L* v( R3 S2 q1 M$ B: a
特权模式(Privileged mode)与用户模式(UnPrevileged mode)) X# l- s, V" r4 i; h' [: ^- J
特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
# H6 n3 g* W! {  c: W从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。4 o( L# z3 t+ p. b+ M5 Q9 B$ m
如下图所示:+ z- r, S' G  X) o- d
13.jpg
, m4 z& w8 r6 |; y5 k) J/ n! \$ ^
在代码中结合特权与用户模式使用MPU
( _, u* A- n) X5 L" Q: P5 T1. 开发环境5 G% z' t& f  @8 \  U% e% X
开发板: STM32 L476RG NUCLEO
8 x  G, J: l: `: r开发工具:STM32Cube_FW_L4_V1.7.0
4 t7 v4 v/ \8 S+ d                IAR/Keil+ B4 I) Y# ^$ `# X
注:也可以选择其他STM32系列并选择相应的开发板与固件库。
# G4 Y# b# T9 n0 L9 ?; U    / X( s5 f6 u1 Q3 a+ {; U" d
2. 开发目标定义
# H. P2 K: W+ k在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。 ; T% A  o8 f4 u; R4 Z
14.jpg 1 r- S2 t+ u& I! V
图表 3 特权模式与用户模式的切换6 s3 j1 X! D. _" ]+ ^* r
" K( V# c; `/ {; k  L7 x7 @
3. 代码资源与整合
* H. n$ Q8 B% L. E1 m! `STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。: S7 f2 ^% {9 o" j1 i
15.jpg . G1 c1 O. {; l" M" c6 s* Y. J% }) i

2 ?1 t9 l( F8 ?我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。8 L' g4 `2 e8 I$ m% E
复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
/ m' }1 B. o. p" Y+ L7 G  U$ R
16.jpg ' P; a8 r! j' p
复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下  R" h) G+ S" L0 h3 D% m* N
17.jpg
1 n6 E7 @6 l4 I! i& H# \) ]$ S0 C打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。6 l' D' D0 X. Q6 H6 p6 D0 ?
7 n( Q) h: l4 s7 v1 Z
4 H- V2 s7 l, C% e# P, l  f
4. 修改与增加代码5 Q/ ?+ N9 J& c7 f5 |
新增加的代码以红色表示+ x& Z, j- `; a/ h$ b
●在主程序中包含stm32_mpu.h( {' X, [* V( v
18.png 0 E1 ^. @, M+ Q+ A7 ~, a6 S
●在主程序里调用MPU配置函数
( v6 x. O, }" z1 [要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。6 ~1 I( V$ ~! i; W
19.jpg # k1 J9 \) V! l- k
●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。
. [1 [( p4 E, \2 QMPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。7 X2 H- d( {, }9 ^" i1 A
21.jpg   @! U9 U5 |/ A* R% h/ A9 {
22.jpg
8 R' s! F$ E% t' H6 U6 I0 R3 y●在用户模式下尝试读写数组9 w0 ^- Z2 E( {; Y9 l% i* a2 Y
参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。 ' u0 {' e. F6 B  t# u
23.jpg ( @  y0 y6 j( {" f; _& c
24.jpg / e/ Y4 `1 r0 w4 k1 q3 b
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。
1 ?* n8 a! n# U2 Z; E  k& p2 ^. s! k
8 n4 z4 C& ~: K9 G8 @1 T- m
5. 关键代码分析0 ]% L8 B5 T- q, g  `
●从特权模式进入用户模式。直接设置CONTROL寄存器。
6 _  ^* X% `8 A
25.jpg
. B* @" h( h; g" @# T' d% u ●从用户模式回到特权模式,需要触发异常处理0 V5 E2 X" g0 A0 {# |0 P' i5 d
26.jpg
& Z0 g' o5 _& Y3 y- V, }●在异常处理中将线程回到特权模式执行! ^9 H1 W  T( ]" Y
27.jpg $ |. o8 s% L2 t/ S3 l; ^4 F
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。
. Y  A$ R  `% a4 r% \
28.png
4 b9 P! t: d' N1 q" V9 \1 Q3 h( r# B# F- d3 w3 H- T. X$ r3 z
结论
- s# p0 V1 |) m" s2 q本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
; N! G8 a: K4 {$ v3 d0 a

+ M" J- M& }! g$ w# h% e9 P: E; `) \" A2 N" i; ]* M, p3 ]
文档下载1 r, \) G/ Q/ N, B  m+ U9 \
0 [) q9 }/ ~1 w& Y1 p$ e5 ~/ v' ?
更多实战经验
7 j9 w9 ?* p8 u3 L: G( F: f
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~0 C$ U, Q/ g6 C% y
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
8 ~) u' g$ ?+ a4 V6 @2 |
谢谢分享

所属标签

相似分享

官网相关资源

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