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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
; |) l4 N2 K- c! ^" X% j
前言; R" L' M1 V, f) P
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。
1 m9 x. @& C: a" ?  m" g& e6 j/ |$ d& ~
MPU(Memory Protection Unit)
) I3 N0 w9 o8 ]3 ?6 B2 h" Q+ TMPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。4 m% m6 Q/ K( ~- f4 ^* V( y
用来设置内存属性的 MPU_RASR寄存器字段描述如下:
4 x$ B, ~+ m5 n# e. ]+ Q8 l
11.jpg + x( D3 y# F0 y: }
图表 1 MPU_RASR字段5 c5 u4 ~% h, u. i

7 `& _9 L7 b2 v7 l5 s1 l在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: ) c' r, x6 R$ j2 o7 g$ `, L, R% N
12.jpg
- Y; T  U* W' o, [! J% \图表 2 内存访问权限设置# D. |  G" _6 S# {
' w  q/ c7 m8 z# I. E# U) f
特权模式(Privileged mode)与用户模式(UnPrevileged mode)
/ q1 z" T, w) Y! o特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
( H+ G2 I/ \* L" |0 s6 v9 G从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
( x8 O" j8 ?. ?9 j2 n如下图所示:' u% h+ G) A: N/ j0 v9 W
13.jpg ; O3 K' p4 I  x/ A: V( d" v

, a- k2 K3 L( Y1 A. Z8 I在代码中结合特权与用户模式使用MPU2 ]1 T; A) n. g
1. 开发环境
/ i' o; @9 Z: N5 Z5 d5 B" K开发板: STM32 L476RG NUCLEO# h; c* K2 u& j; Y; B1 x
开发工具:STM32Cube_FW_L4_V1.7.07 v7 _3 [3 L4 V8 s
                IAR/Keil. R) r* O# H2 P; W
注:也可以选择其他STM32系列并选择相应的开发板与固件库。
, z# R& @- f1 c3 r    - K( G# ^. S4 C: k# F- y! \+ E
2. 开发目标定义/ C3 ~3 Z# s4 [8 Y# L
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。
5 a3 O5 T& O. }. C- H
14.jpg
, s% R, y. k" y; W图表 3 特权模式与用户模式的切换# p2 \  \: [" S6 g/ f/ q- t8 T  W

6 F  t  T$ _/ O) l( K' w7 c3. 代码资源与整合: T/ n- z2 W, l; x  p6 I+ |8 V
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。
0 D& H3 U$ N& k: ]/ N8 G; F
15.jpg
! e1 c1 C$ R4 ]$ T8 ~9 S+ x6 i+ ]8 a
- R/ y9 t$ I1 u; |/ L我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
7 r( y5 Y/ r$ |& g复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下0 D& B( t7 E% t  J3 ~% N
16.jpg & E2 H; J0 ?$ E( B( _: J! \
复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
) q# q; b6 n8 ]$ u
17.jpg ! g; Y4 S+ |2 l- V5 L- ?
打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。
  a0 w; C0 N( S8 ~- `& Z3 P
# k+ H5 L' L( Y3 U$ x+ r8 O- Z% f: {' ]7 [
4. 修改与增加代码
9 c. a: M8 U# H2 p) ~新增加的代码以红色表示+ h. d- M; x1 M7 G3 s8 S  U
●在主程序中包含stm32_mpu.h* p: M: N# r9 T
18.png 2 H0 `4 M& K  l/ J3 k& {/ I1 _* A
●在主程序里调用MPU配置函数) _: @0 X1 G2 c  e' Q1 _9 \4 R
要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。
1 S1 @, p5 h: Y% Q/ E  A
19.jpg
7 [8 B8 [: z% S3 l& t. c●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。8 G( h8 F4 ^# V; X
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
' {7 P- j5 s9 \. j$ \
21.jpg
6 z& u. n$ D& n5 B  }
22.jpg ( z* e; P& l' [  L
●在用户模式下尝试读写数组
2 V. c  B& \- @3 r+ n8 W参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。 " T/ |' T( H7 M( w; U; j0 m
23.jpg
! X. K5 @1 ?  j% F! y; j! K
24.jpg
5 e% v/ q2 D5 u至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。+ n9 N* W+ O3 `& Q; O

, n* P- U- K2 n9 U# {9 w+ o% ?; a, i3 B! |& n% z( d. f, [  B
5. 关键代码分析6 A/ H! |; l; b5 p; U8 i( F9 d3 I! u
●从特权模式进入用户模式。直接设置CONTROL寄存器。
* e* b1 k* g& V/ [3 A: I
25.jpg
9 H9 ~8 M8 r9 V1 U1 S) Q ●从用户模式回到特权模式,需要触发异常处理
( P1 l- @7 a/ s' S* U
26.jpg " L4 W% a; f# G- W, @% Z! ~* [2 ~+ p
●在异常处理中将线程回到特权模式执行1 }- B; V9 @. m
27.jpg 2 o- @1 w) W5 |7 Q
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 , H! f) N8 M2 U, y2 {9 P4 F. B
28.png
( K1 i% _# F. E6 J, |6 U" G0 {' U+ k4 a/ o4 [) v- y5 E2 B
结论- N" D' O+ B& H" t, m6 g3 D
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
; O( k% h9 J4 O$ V! v9 p
0 E' r: V6 `2 I, t$ A) b

  X  M" \# x) r! d7 A3 P文档下载
. |, K" t7 n& h! M4 R
* `# H) S& A/ G4 d* U' P  ?0 |更多实战经验
; X* d0 x( x0 X% n5 o% H. x
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~  Y7 Z: P- F+ E& U, \0 h
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
/ T) `  t% N: O& q/ F$ g
谢谢分享

所属标签

相似分享

官网相关资源

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