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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
3 @/ o3 B' a# h0 a
前言8 n) F: Z, H, k' Q/ r) j
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。, [4 j; V- j+ }
7 }9 M8 L4 ~. N$ l3 D
MPU(Memory Protection Unit)# u: C0 J" P8 A6 @
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。3 g8 n; `3 Z' _" c: }) S: X
用来设置内存属性的 MPU_RASR寄存器字段描述如下:
. }* s* e1 `- s1 W1 V
11.jpg 3 T5 R. C8 b& y( o1 m* ?
图表 1 MPU_RASR字段
  }8 M, p% j/ X" X7 q
+ }) I+ O4 u% |在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: 9 V7 y0 B: D" |3 ]- J
12.jpg 9 h  A1 ~0 g6 F
图表 2 内存访问权限设置
4 j: |% Q2 o1 e  z  x% M* S8 k# w& d: _) K  m' g
特权模式(Privileged mode)与用户模式(UnPrevileged mode)
4 B' \: ^  j* s% }$ t6 I特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。% v8 I/ l5 l  Q& ?
从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。6 {  Q' {& M" j
如下图所示:
6 x+ ]  k7 U/ q: O8 \
13.jpg : n6 \: Q& d# X# j6 n

% d. ^8 c0 x+ G% }; {在代码中结合特权与用户模式使用MPU( b' ~% |3 Q$ z' z2 N
1. 开发环境. l" n$ x0 a) ?. h/ _( X
开发板: STM32 L476RG NUCLEO
" M7 W4 @, O  y开发工具:STM32Cube_FW_L4_V1.7.0
- K+ h1 a3 [+ L  D4 z4 Y9 K                IAR/Keil4 D; M% `6 F( f9 t
注:也可以选择其他STM32系列并选择相应的开发板与固件库。8 S' [4 U* ]7 w& P( e
   
+ V2 H0 k: m. d2 k1 ~& |4 h2. 开发目标定义4 l  E' U0 X' Z, Z9 H5 V
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。 ( ^0 o4 k5 `& k3 C5 Y
14.jpg 0 \- T/ |& N9 p5 H6 r
图表 3 特权模式与用户模式的切换6 t; t* t# [# |6 f, Y

: \! R+ z" l" v( q$ x3. 代码资源与整合3 z' D8 k" [* D& L, F
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。
" e: a& W9 b6 E5 V+ i
15.jpg   N8 C3 e( }- g! s) ]1 L

2 y* I3 C1 t5 g4 F" B我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。9 D1 L4 P4 [+ I1 g7 |! f
复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
! N5 [  N- ^/ b8 Q" h4 D( [6 Y
16.jpg 1 E2 I4 o1 [4 l
复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
! b9 _4 z# V2 C  A& {, C3 o: `
17.jpg
# A. F1 t, U( g$ x0 c7 P% n) n打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。
4 w7 \: \, p% l. h- ?; l0 ]# @+ M

) ^. z+ A. Q& f2 J1 p2 V4. 修改与增加代码
) A, M! q* Y+ @1 i" C8 R' s. a8 J1 {7 @新增加的代码以红色表示0 U5 i: O& |9 V7 U* c7 N
●在主程序中包含stm32_mpu.h$ C8 W+ `. j& N
18.png
0 G% y- K1 T+ f' v- C4 j●在主程序里调用MPU配置函数
& [2 d/ m5 }" W0 d要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。% A! |2 B) K7 v+ j1 W3 d
19.jpg
; G( j6 B' ?$ c* a) [3 K5 L0 W$ w: y3 @●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。3 ~, c9 a) o/ ?+ \4 D# ]0 _% }( e
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。, k2 J7 ?" O$ W" j! S0 d( X& a$ c
21.jpg
' x% S) S/ G1 d8 D8 k( v
22.jpg 5 {+ D& D9 L' U. _6 w% U) b' D9 o: ]
●在用户模式下尝试读写数组% u! e" g  e' ?
参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。
7 M* g+ h0 `7 }3 X8 [* m6 N; R
23.jpg & I, m  j2 d$ }* V( i1 `5 W
24.jpg : Y3 j1 Z) {9 u( q- H) g' ^3 [) d' {
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。1 a2 C0 f6 u0 M/ Y

$ L; Z) G4 Z: Z$ [8 ^- T, ~) O; }. Y/ _* c: P+ [. R& `1 G. D
5. 关键代码分析
  x( f5 I& y. _  W6 B3 I●从特权模式进入用户模式。直接设置CONTROL寄存器。
2 X2 Y1 A3 Y/ [% n2 @" ^
25.jpg & [4 G$ \- \! S9 w: G! W4 I; M6 ?
●从用户模式回到特权模式,需要触发异常处理, r% h$ C) c/ U1 x5 q7 x4 @0 N
26.jpg 4 y8 F" j: d+ e* ]; Q+ ~" c3 I
●在异常处理中将线程回到特权模式执行
; \5 T3 b! d2 M* v5 Y1 [
27.jpg
3 H% V' b0 U5 ~) F% {( G% `% `4 E ●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。
* e; Y. m; {8 S' y/ M
28.png
7 t. f, O6 M# x
9 z) p3 i0 Q; E6 ~结论6 L* q; I5 T9 |$ l  u2 T- Q* z
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
, c8 e9 D/ a! }2 K2 P
. p8 y0 c! F8 F

- {1 V* Z" l" j% f! p8 V文档下载
1 h5 \$ o! o% Z  c2 Q0 t- z9 R0 X2 o5 l' U
更多实战经验+ K; @7 C2 y9 T
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~* [7 z" T$ h/ U# a5 u- ]3 n/ T
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

1 t8 ?9 h7 S! h1 H& ]! u% M# B谢谢分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版