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

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

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

3 Z) L/ _* H8 c前言% ^* `% b1 a+ Y% S6 c7 M: U# b0 @
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。
6 j9 D" }, T8 b, p  w  O: I& c0 i8 e* o* B( U& L$ h
MPU(Memory Protection Unit)
2 c9 u2 }& B( {& I4 p# jMPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。' o7 X0 `7 [6 ~2 o
用来设置内存属性的 MPU_RASR寄存器字段描述如下:; Q# G, ~+ i. J  M" B) \. N
11.jpg 1 F3 Y6 _2 S( S7 V9 s
图表 1 MPU_RASR字段* C. _( R. {  m
& N* w- r. H8 [. ^
在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下: 3 y0 ?& E- v0 t- p- t5 U3 f5 ?
12.jpg
0 V' I6 L% x; `5 i图表 2 内存访问权限设置
1 A& l* d# o: J  c' |$ z4 a6 ~. K2 z. u
特权模式(Privileged mode)与用户模式(UnPrevileged mode)' Q1 f* m3 ?. D7 H1 i* C. k
特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
+ N2 {# x9 o$ |& N从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
5 h4 I% f% J8 ]- j' [$ O如下图所示:: G  I7 L, ~% [6 ]
13.jpg
: O8 {* |7 T" t8 g; `: N; Y# _' @$ ~1 \! t! b
在代码中结合特权与用户模式使用MPU
$ _0 h4 }: p; ~) D8 e. z6 y1. 开发环境6 {* H" z8 d+ s- ^
开发板: STM32 L476RG NUCLEO4 e/ G+ N+ w& }2 O% I, Y0 @
开发工具:STM32Cube_FW_L4_V1.7.0  S$ n' ^" B/ Q! t
                IAR/Keil0 H' J& Z# h4 E0 Q$ {; N
注:也可以选择其他STM32系列并选择相应的开发板与固件库。7 L+ c* l6 I5 q+ `/ e
   
, N" J0 w$ F0 z9 e: V& ?2. 开发目标定义' m4 Q# Z8 O$ v9 E/ d3 k. e
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。 9 K1 g, x# n7 j  A6 n5 u
14.jpg " I4 N3 A2 w- g% }2 f  `+ i
图表 3 特权模式与用户模式的切换
8 y% ~. ?0 a" r) R1 }7 J* @5 f4 P( O% v3 a% U9 p
3. 代码资源与整合  H- k2 D. k. o/ i  t2 Y2 h
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。- _$ S, A# D  \* p; u8 N* t
15.jpg ' a8 m0 C& L; I" Q1 r! r( [2 ~9 \
- b& z* M+ I: m' B
我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。2 \' y, ?5 _/ d1 b* j* ?. i+ ^6 o
复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
1 U  S# @2 C( |( l1 a& n8 u! I
16.jpg
# T$ F: c$ U$ r. U5 F7 n2 p复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
! V% {. l7 {2 R3 q2 v
17.jpg
+ U5 _) b7 T2 J/ s打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。* Q: p1 ~& g9 G6 W! v; `
0 \8 [/ u5 I2 g& C
( b/ f# J" D5 n& N( ?* G
4. 修改与增加代码* I) C" s) \# ~( h1 d" O" [
新增加的代码以红色表示' Q0 {1 U) M  C6 c1 ?2 }
●在主程序中包含stm32_mpu.h3 Z4 `7 @; B+ M: E4 m
18.png
9 F" ]# E" V" \●在主程序里调用MPU配置函数+ P8 w+ S5 k; ]6 S8 Z% Z
要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。6 x$ \# ^6 E9 k, {' g  L# \" @* S
19.jpg
+ a2 J3 Z$ C3 I8 x●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。2 ^8 {  S( ?' A' r
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。. _' y4 P- t7 I
21.jpg
2 O  @! G* Y7 ^) l. K- R* R
22.jpg
+ `  J% ^4 \5 \. G) r: Y" _●在用户模式下尝试读写数组
1 @6 s/ F9 x- R, f: v& x参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。 # G" x" z! B: {1 U2 w# d
23.jpg 9 N2 Y7 @% E. n, W
24.jpg - e9 I( ]! H3 M7 W
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。
" p0 c% {  g% \+ G- C2 H4 _: {' R1 K# J* p5 i
7 {% X: C  ]$ j
5. 关键代码分析
0 b& d! j/ U# E2 B3 |7 I9 T●从特权模式进入用户模式。直接设置CONTROL寄存器。
- c# h- d9 ]' _% \
25.jpg
' N0 s; q- D! l, ^6 y, v ●从用户模式回到特权模式,需要触发异常处理$ r, j- E' h' I2 W
26.jpg
3 [  }/ E5 Q$ x5 ]5 E& V●在异常处理中将线程回到特权模式执行
) ]! P. K: ~7 l# ], w
27.jpg ) D. }. `3 N/ R8 F) c( {1 I( z
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。
: n4 ^# k: t: Q
28.png 4 U3 U% W  y! Z3 _% V
3 O" @; S- A) X
结论) v3 _1 r2 f" W: U" F  y* E. M, d
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。& v; X0 b) {' v$ u3 A) f5 f
& G2 r2 G1 [# l, ?
" }, }8 e1 z$ _$ _1 g( ^0 W- C0 Q
文档下载  ^+ s: r5 y$ V* y% T5 p' z
3 l# n! Z# X, B! y. J- i+ H
更多实战经验
0 P, q5 D. d  q6 t
赞 收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~
+ L: z, d) }- _; d5 c4 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

9 Q+ F! j+ }! \+ C$ a3 Q谢谢分享

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版