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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
& R2 y* N/ {7 ~) X4 w
前言. n  a6 y* X3 a8 t+ M/ u$ f# m
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。
% _' c5 |* e! v! U# n* Z3 K! d5 u; y
MPU(Memory Protection Unit)  Z. g  J- I" m: D- v
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。! t7 ^1 @9 q" H1 E2 a
用来设置内存属性的 MPU_RASR寄存器字段描述如下:4 b1 V) V1 N9 }- p( \/ b/ A) X
11.jpg 9 v" z+ ^( O/ `8 M( A  O" D0 y
图表 1 MPU_RASR字段* R4 L( ~4 s# D! W+ c. n. m% P) F
8 p9 @) m- i# l5 {- o' Q
在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下:
' c1 x/ U( n0 B4 O1 c, h
12.jpg ! F  \  q' g# q" k$ i) i6 t
图表 2 内存访问权限设置' o! u- B: P$ H2 T# ?) D( ~! t

2 Q2 m! ~: s$ l$ c. J特权模式(Privileged mode)与用户模式(UnPrevileged mode)
4 }6 G0 L( p1 {; N% g3 G特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
# x+ f' M+ Q! |: b$ a( ]1 T从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。. _. B. L) `' }, H. r& y
如下图所示:
- E2 [" N/ y) H7 G
13.jpg ( ~& V5 f1 U6 I7 h! F

' k4 n3 \5 \8 P7 t! S在代码中结合特权与用户模式使用MPU, x  X$ P: y8 m! m2 l2 a7 i
1. 开发环境' U, w1 x9 Q& o
开发板: STM32 L476RG NUCLEO2 m; \5 J+ F! Q5 ]5 h* L: A% ]
开发工具:STM32Cube_FW_L4_V1.7.0
  o; q9 Y0 c6 ?& v8 X2 w                IAR/Keil! X( Y. q, p, d( N$ O! A; R
注:也可以选择其他STM32系列并选择相应的开发板与固件库。9 }8 s1 k1 I8 z! K# Z; Q! R
    2 N. W" C1 I0 t4 \1 a+ b5 k
2. 开发目标定义
! N! r7 f$ U3 A在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。
2 m% {3 w2 q* O# l4 |: @
14.jpg # M+ G/ ]+ r5 _+ b) K
图表 3 特权模式与用户模式的切换
" P/ k; {/ D. v* z
; w- R7 E* x1 M7 D3 C: i, p4 i3. 代码资源与整合2 l' w; b& @% `- I6 B
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。9 l- @: V, y  w* @
15.jpg
( V- ^7 ?. \' A& ?) o! O
7 t; Q& J' d: J3 f& |我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。  B* M7 `8 A2 K$ Q  N6 o
复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下3 I5 B  ~% \9 i- v9 ~
16.jpg
! y! w) w# ]; e( r' [5 i8 @复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下& O1 x, N  u1 N) P& P) T* [
17.jpg
& p5 p0 \# m( g5 U- L. x1 D打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。
/ j- x& t8 [! ?9 f- l% P' R: e7 o+ G
9 ?: k, S2 o# Q# @" J9 G& K* h, X% f* b2 l) K
4. 修改与增加代码# }2 U0 |& E" h  F
新增加的代码以红色表示+ E0 K, M4 _7 m1 W
●在主程序中包含stm32_mpu.h+ E6 B1 m  A/ N- K* u
18.png 9 F6 e0 z9 F6 ]+ A9 _' I
●在主程序里调用MPU配置函数
8 Q0 |  ~) n; ?6 ^要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。$ I- N5 Y, A, t8 A, F4 B
19.jpg
4 v8 S; q  V7 a+ ]●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。
, h% K7 s4 Q( h# Y4 B& CMPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
8 n9 N6 f6 O+ E) t
21.jpg
1 t  f6 `% y. Q/ J& Z! O
22.jpg 9 P. \1 _" W. y0 Q; ]: Z
●在用户模式下尝试读写数组
" j8 W- o6 s* i. g参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。
- g* n( U  a3 ]. o0 k
23.jpg & m0 [5 t5 g7 J2 u( ^$ d8 z7 {
24.jpg 3 _8 Z- t2 m0 X; U
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。
4 i- D; W0 `; p- S! B2 s8 M  g7 \1 d) \( ]
5 @- T& Y6 C! j
5. 关键代码分析& e5 d, \1 W/ \% y
●从特权模式进入用户模式。直接设置CONTROL寄存器。
9 u* m5 @* s1 X& [9 c1 j
25.jpg 8 a, X8 y! P9 Y+ y5 l9 N
●从用户模式回到特权模式,需要触发异常处理
" Z8 O! L2 |, {2 V7 x* l
26.jpg ' s8 @7 o! t, v$ h* Q- D
●在异常处理中将线程回到特权模式执行# d/ U3 o0 z9 w& `. w5 ]. Q- U
27.jpg 6 ]' S7 U* n2 |- M& t' c
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 ; D5 Z3 a8 u' l7 J
28.png   i, ?: }' T1 C. e0 z, e

6 L2 P4 a" Y- F- C5 C6 c结论& P+ D! a+ w3 O- M9 M( h
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
) M* R: C' z7 V3 L6 O7 r$ N" ~/ b6 {

5 p) W" Y; o% b$ c% {- o
8 ^: B4 R( ]1 y* e' H8 q# _- T文档下载
7 o+ O& U$ i9 p. h5 `  M
' u7 M1 j/ s& d% l; V& l0 a更多实战经验$ s7 C/ V" g: g# ?; }
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~
% ]* T* p7 ]' z  d- o
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

% v" ?, Z0 F/ u2 n谢谢分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版