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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式

$ B5 a- c9 y' `/ W前言
) V  h7 A, X* l  `' F5 v8 q8 S7 TSTM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。/ J' h. m; S" N& L. U6 t

1 z! h& W2 @) T* q$ wMPU(Memory Protection Unit)3 E3 s: i& |9 P$ ^
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
. d7 v- ^6 d& n9 _, P6 N用来设置内存属性的 MPU_RASR寄存器字段描述如下:
, S( i0 }9 g$ k5 w: w3 Q( e
11.jpg % S. u4 F. z% I; C2 v  C
图表 1 MPU_RASR字段
, z& B, K. _8 P3 h% R" f
) E. \- |6 S6 U6 i) E1 M7 c# ^& T在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: ) a& l4 S* B) D
12.jpg
$ H- B: Y! ~/ Y; |8 X1 \7 D3 P2 m6 J6 e图表 2 内存访问权限设置/ ]" n# n3 ^& q' y. a0 u

5 W$ `% e% ~- f/ X特权模式(Privileged mode)与用户模式(UnPrevileged mode)
; P- L( Y4 c, r! d特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
5 `# I- G9 b8 i! {" C$ Q2 _* m$ b从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
' s4 M3 @: }7 o! h$ }7 h如下图所示:
3 v3 ]- D+ n$ M# l
13.jpg 5 x  [, c9 r7 }. I" x/ U6 i

, d+ @) x8 ?* c4 V# v4 ~在代码中结合特权与用户模式使用MPU
* I  @- f8 h. d! ~. v2 A( X/ g9 z1. 开发环境
& Q: w7 J" i3 f! h0 |* z4 ~开发板: STM32 L476RG NUCLEO, a* \4 R( g, t1 G( d: u. b
开发工具:STM32Cube_FW_L4_V1.7.0
1 m0 \2 e: I1 ?& x                IAR/Keil
$ U3 p; Z: M* Y: g4 g) o+ |注:也可以选择其他STM32系列并选择相应的开发板与固件库。
% U" g$ S7 T  n  g8 n. M' t% ]    $ o7 N1 @: V& S* z  W4 ?  F8 {0 }
2. 开发目标定义# M! T# n+ z' ~. a" p. W% ]+ n; e
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。 8 `% w3 E8 [4 q; t* v$ @9 r
14.jpg ) X% o( ^& I( g  x) E
图表 3 特权模式与用户模式的切换
2 B% [: P: ?. D  T! @2 _; e. ]; v4 `4 }. s+ X
3. 代码资源与整合; `/ [' `2 z2 l: @. p- j7 W
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。  {. m( a+ ]8 ~4 q  `/ _
15.jpg . V: x+ t4 G3 Q- K
. k8 {1 \( U$ C- A
我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
; T9 H* z6 ]# U复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
; I/ p: T6 [, Y9 c0 l  ]( ?  |
16.jpg
3 X& k* S0 e- @复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下% G& n: a1 I: d6 B" y3 M7 I2 v
17.jpg
% R3 P0 w4 a6 m+ G# q; H" J' `打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。: [4 H3 h4 u# }4 @& J# Q5 E

' q7 ~" Y/ r" T9 w- ~6 I6 u  \$ u& w2 V
4. 修改与增加代码
0 M0 P) m" a% R: p0 `新增加的代码以红色表示. H3 i* E5 e' K# S/ G1 n
●在主程序中包含stm32_mpu.h8 P5 c4 W! }$ ]* X5 p5 @6 c
18.png
3 v. ^' W. ?+ S6 X# j# x0 e& s●在主程序里调用MPU配置函数
, ~6 V1 ~7 F: `, p% V4 y. @  Q要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。" w. }- B* V" [# z- ^  I% _5 P: \
19.jpg 1 J/ W" ^5 |9 v6 M( g9 Z
●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。, m) _# t+ ?, e3 E- b
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
: `& s) {9 e& v3 J% W# ?$ v% H$ H
21.jpg
& X: r$ o( V. h6 `, s! S
22.jpg
; O- I3 {; b9 F2 `# }●在用户模式下尝试读写数组
2 U' R" P/ J  O3 p9 s: x3 f. n参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。
5 e  O8 R  O0 W! i% q
23.jpg
' G; Q' V2 g! u  X$ o% T; \
24.jpg ; l# C) ]$ w$ s$ I: l0 ~
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。
& j8 G0 g, o2 D9 D0 I6 D( Q0 t
; V4 A, q* m6 G& Y
5. 关键代码分析
9 t( ?5 V( K( T7 k% n●从特权模式进入用户模式。直接设置CONTROL寄存器。
# y! V1 Z9 a* w( I8 \6 B
25.jpg
! Z* I% G  i; o/ N  N7 W: b6 T ●从用户模式回到特权模式,需要触发异常处理
, t7 a5 H, U" V/ U; _* C9 K+ Y
26.jpg
/ h+ |( R1 J( u8 A8 U●在异常处理中将线程回到特权模式执行' k7 i, [6 R; [) U0 S
27.jpg , I: f8 V9 k+ V: F: d
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 ' t5 J8 u) S1 v, a
28.png
" m3 T8 X# I9 Z( _3 }' G, h/ M9 J# F  \4 N1 h/ Q! t* L1 u( e
结论" s% k( l  B1 m! k# A
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
+ J  X( b( Y0 i! n5 D+ T% H
! L4 q8 ]/ B9 j5 I; P

- s& N# ~7 B, Z* i1 x4 M6 l文档下载
/ N; r9 m; y% _, e7 F- Z4 t6 G" T) P! m. V/ B1 ~' l% p7 r" a1 J! H% h
更多实战经验
: J# l( y( ^3 b5 H* @+ i
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~
& v+ H' {  b  [4 I+ G: s7 k
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
/ S7 m8 W0 L! o1 n" s3 ~
谢谢分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版