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

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

[复制链接]
zero99 发布时间:2017-6-21 14:40
理解与应用 MPU的特权与用户模式
0 M9 N% p& Q  B/ Z9 p/ @4 }1 y
前言) C3 r' s8 O  k1 ^- p( V
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。
5 R, y9 j6 b6 T/ I
% B; r/ L' q! {5 }. CMPU(Memory Protection Unit)" ]& T/ t1 d  b; M9 U
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
9 B' R. x% s$ V4 k3 u用来设置内存属性的 MPU_RASR寄存器字段描述如下:0 H# ?5 p% @( ?0 g
11.jpg # f7 c; r) m/ L9 `) {( v4 m) k8 g
图表 1 MPU_RASR字段4 U7 L+ G) V) U# t2 K) ?# }

# r0 n/ |; A8 A9 \: g  R0 \2 t8 g& P在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下:
9 D+ ?6 i2 S% h- x- L
12.jpg 7 t" G1 K5 i; |1 o) E. M9 P/ N
图表 2 内存访问权限设置' }- ]" R1 ]. \$ r5 h0 i, w
: _" {$ l4 P! A3 _8 T
特权模式(Privileged mode)与用户模式(UnPrevileged mode)
" w! C4 h  S3 Y# n- H, v3 _特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
: ?3 Y' E5 T# Z  j* h2 P/ B从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。: i& e$ ~" G$ ]" U$ g- J
如下图所示:: U6 |3 p9 B* v
13.jpg
2 }0 t; a3 X& c
; t' B7 Q! ?' U) Q9 t+ `. X在代码中结合特权与用户模式使用MPU- R% {! V  j, ~. z( b2 n
1. 开发环境
2 T' k9 Y5 g$ x. K5 x# L开发板: STM32 L476RG NUCLEO# s: f/ O% m5 _" C# i; Q
开发工具:STM32Cube_FW_L4_V1.7.09 N0 F7 a& w1 }* }5 E
                IAR/Keil6 g7 r2 {# ^5 p
注:也可以选择其他STM32系列并选择相应的开发板与固件库。
) W1 n, ]6 z7 k) E   
1 i, B& R. }& v% Z( @0 z7 G2. 开发目标定义
4 w- w& P4 X) @7 f* y3 T( Q6 W( M在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。
( G/ v6 n$ c/ ~* [/ L
14.jpg
7 \  T0 K/ N! J4 a7 e+ ]图表 3 特权模式与用户模式的切换
: S8 w/ r- V# h' G* U9 P. h; g
: K4 W. s+ K8 {, B3. 代码资源与整合9 G( e/ |, t- _1 q; W
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。3 [0 m" v; t( n% [
15.jpg % z0 U2 Y6 }0 r: [  J

. t. i# T2 C$ \6 D- q我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
. ?# j: o9 ^( W$ ?3 i复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
" q4 }8 R1 N6 f+ x9 O
16.jpg
: y, o) S; d8 O% t# D/ E复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
1 l  R/ A! [" S/ F; `5 i
17.jpg 2 f. c% l* t3 h! j' X
打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。5 M# n! M+ V8 s9 i8 R. C7 o
0 _4 X# a% A% n4 M" D8 z

6 X. [1 w4 L: ~5 s2 O4 S. G8 [4. 修改与增加代码. o2 r, r/ {; o. Y+ u$ _
新增加的代码以红色表示% U; ?: s+ {  g. s( {
●在主程序中包含stm32_mpu.h5 K  z- c8 k# s6 Z6 i6 ?
18.png
3 K: A' ~2 O1 b$ \●在主程序里调用MPU配置函数
. t9 T, h, E$ \2 b: y7 j1 P要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。
0 p" E1 d6 h9 ^" S/ R9 z
19.jpg
7 ]" j2 \% Y$ _- u$ a●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。
- q+ a( w" B1 X8 t! S2 [9 DMPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。6 f0 G1 ]' j6 H# t. A1 J
21.jpg
5 s- _9 I* j+ w/ j* Q( w
22.jpg ( b+ t, b5 \. j# ^6 @0 e; u
●在用户模式下尝试读写数组1 ^0 t, N  q5 `1 c- ^
参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。 3 m. i3 z* R# t8 A/ b
23.jpg
) h7 A4 [5 o0 {
24.jpg - n6 @; U9 M; N* v- @# r4 [
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。4 |. P+ S- Y0 {/ _9 n6 k

& |4 Z% ?! \1 {( @5 c: v- E
: d- |4 Z0 g7 N$ p/ Z5. 关键代码分析6 A$ y9 t0 c( h- X% M
●从特权模式进入用户模式。直接设置CONTROL寄存器。
1 Q$ t: O6 j) k: M
25.jpg ; _0 c1 `; h3 Y2 Y" o7 a
●从用户模式回到特权模式,需要触发异常处理
0 P6 O  _! Y: s
26.jpg * o' D+ @7 M6 E; J" C
●在异常处理中将线程回到特权模式执行" ?' X  r& _1 ]3 I0 S- C4 t% }
27.jpg
) X& N; l1 p# Z; t ●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。 4 d# [0 {+ {4 L9 W) k1 H( Z3 N7 f
28.png 5 q5 d8 s+ m) I

5 r7 t2 f. t( s结论
9 r9 a, H% X, V本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。
, w+ P) ?% C* G* M' \

" n5 |5 |7 u, t7 V2 B7 j5 y- Q
, {! Q4 l' U* [7 U7 i, W0 o文档下载
' l) E/ t. S) g" s: ~0 h' ^
4 `5 P/ a% _, O2 y3 y" O更多实战经验8 z' x" T* l1 C7 ]4 d  t- i6 f9 ?
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
Stm32McuLover 回答时间:2017-6-21 15:28:53
帮顶
wolfgang 回答时间:2017-6-21 16:23:43
好~~~~~. ]9 ]6 i* Z. o$ l0 \5 x
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 ?* e% ~7 R9 d& ~/ Y谢谢分享

所属标签

相似技术帖

官网相关资源

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