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

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

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

( T& P0 F2 w6 L( Z前言
1 A1 ?; j1 V3 {: [7 F. {/ {STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。3 m4 c3 F+ I9 q# F( z. U* c0 G
" D* [, b3 Y: K, ]- ~; @5 ~
MPU(Memory Protection Unit)  O9 A9 S9 r8 g2 U% V$ m
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
1 ?1 B9 h- V' x) s  i5 O用来设置内存属性的 MPU_RASR寄存器字段描述如下:; d5 r- p# g+ b' R# \6 U
11.jpg 4 z. Y( r$ q6 ~: t, c
图表 1 MPU_RASR字段
# n4 o0 h* ?8 E( Q9 v6 f! {. y5 u$ D' b9 j& e
在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下:
7 G9 g# J( k2 V2 z7 F5 _
12.jpg # _9 f+ l) H6 w" Q6 @
图表 2 内存访问权限设置* l; i/ {8 x8 q8 m

1 K, Y$ B5 [; F, Q  ?特权模式(Privileged mode)与用户模式(UnPrevileged mode)/ o4 I8 z6 L$ }9 O
特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
  A0 o/ f& K& ?从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。" g5 A  E: R, \6 J& r* M
如下图所示:
8 f7 R" d+ P3 U/ n
13.jpg ! _' I5 S+ f$ F1 I% o5 Y

5 D& M7 \: `8 p1 C7 W- c- Z在代码中结合特权与用户模式使用MPU; ]* y6 J$ w# a2 W9 o
1. 开发环境2 o0 c! U; R8 ?- o0 ^  c! @% n
开发板: STM32 L476RG NUCLEO7 e) C0 A4 w, P3 U) g- m
开发工具:STM32Cube_FW_L4_V1.7.0% [9 f+ K" G7 s9 A; r
                IAR/Keil# y- W( Z( \; h( S, U$ U8 K) {
注:也可以选择其他STM32系列并选择相应的开发板与固件库。1 e. ?* I  l+ e* s: ]" D. z. E
      f0 {- d6 M  @( y4 O
2. 开发目标定义- `) A, B% S0 i0 ~* q# G
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。 " w* [5 j6 Y* Y
14.jpg $ T9 y4 N7 U6 s! U2 t
图表 3 特权模式与用户模式的切换
: K5 [8 w* x" M# m+ R, ^/ {) K3 y# C) M* @2 i( Q
3. 代码资源与整合
5 H, V. j0 g3 q/ fSTM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。0 a; L) w& ]4 O( a5 a! {( L' f
15.jpg
% V  O. {& X- k( u' n: ^
* v. _1 X0 n/ S( K0 K我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
! }: p+ l- l9 t; Z6 `4 o复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下  }7 B. Y  Z  z8 B* x
16.jpg
( {* w2 H/ d; V& `复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
; F! x6 x2 q0 y6 M1 u
17.jpg 1 m4 n( `3 \' t; ]
打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。8 Y& |# @* k- o/ S% u: N3 y
+ m* k, h' s  I1 f, Z4 `# d  N2 f( F
: ?  D5 m. i  ]" D4 D: r# ^
4. 修改与增加代码& e& y- Y6 g5 y3 q1 H
新增加的代码以红色表示3 ?3 w% t' B4 _9 i9 M
●在主程序中包含stm32_mpu.h
4 [4 o! E; G( g/ L5 ~# N. L
18.png
" \* I4 r9 i2 I7 }5 d●在主程序里调用MPU配置函数1 ^: H  o5 C* D
要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。5 E3 \. K, n2 {' W: {
19.jpg
" D5 d% K* F. ]8 ]. k5 ~●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。$ Q/ n3 `3 ^/ n6 |0 C1 j
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
$ V4 d6 Q* e% N( _5 T8 _
21.jpg
. s5 M; I$ U8 s6 i
22.jpg   b5 t) I/ w' ~& A+ I. `& v, x
●在用户模式下尝试读写数组+ x0 b$ r/ r2 e# U; B
参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。
  e, ~" Z7 T1 [
23.jpg
( h8 l" ^3 r$ Y+ p- V! v1 O# v
24.jpg 3 |7 V4 n* v7 [2 f! |9 z/ E
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。) p* G3 [: }# r' q* r
. g6 z0 f/ q$ A1 K+ q

6 w8 ^9 J, {0 w3 m1 ^1 T5. 关键代码分析6 |' L3 I3 }+ K# x9 p, z, \" m/ Q
●从特权模式进入用户模式。直接设置CONTROL寄存器。 ' c1 |: }2 T6 C" I  G
25.jpg
  G0 n/ _/ j1 I' T4 X% r ●从用户模式回到特权模式,需要触发异常处理
' J2 b* c, R3 h  h3 P9 |
26.jpg
; k% c1 H- o- ~  j. b8 {●在异常处理中将线程回到特权模式执行
6 \4 g* D6 s# Q% D+ |# u" K
27.jpg
1 g1 ], j/ D# f% y+ K+ {- K* K5 J ●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 : G" k; J6 m7 W% V5 c1 y% Q; r+ O
28.png
. s, e8 o5 f) i* V# o7 }" |+ _! D
" k& x3 `- b; m$ ]. M' t结论
+ |3 O, ]. N& P' l5 y6 [. h本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。) R1 f# t; [. T! o; `
! S& A2 `' L0 X$ }

0 e2 K" e1 Z7 k1 ^  K3 X; A- G文档下载( A3 ]  [7 f- a6 B6 n
8 q7 y+ d4 u3 C; A. S$ _( C
更多实战经验# `) x# O( X  `5 G. W) w
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~
6 k2 \7 R* I3 _8 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

% b0 `1 X3 i) @1 ]5 A7 R谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版