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

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

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

前言
STM32系列支持MPU内存保护单元,可用来设定内存的属性和访问权限。MPU的应用笔记提到,将属性寄存器(MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同的,甚至可将用户模式的权限设置成不可访问。那么,什么是MPU的特权模式和用户模式呢? 接下来我们在这篇文章来理解这些名词,并讨论在STM32 MCU代码中如何使用内存保护单元MPU的特权与用户模式。

MPU(Memory Protection Unit)
MPU内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存SRAM区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)。
用来设置内存属性的 MPU_RASR寄存器字段描述如下:
11.jpg
图表 1 MPU_RASR字段

在MPU_RASR中用来设置数据访问许可的AP字段详细设置选项如下:
12.jpg
图表 2 内存访问权限设置

特权模式(Privileged mode)与用户模式(UnPrevileged mode)
特权模式与用户模式是指Cortex内核的执行模式。它不是MPU的一部分,但与MPU单元有关联。当代码运行在特权模式下,代码拥有所有的访问许可;而代码运行在用户模式,则访问权限受限制。限制包括在系统设计阶段就定义的可运行指令限制,可访问内存以及外设限制。也包括由MPU单元动态所定义的内存访问规则。
从特权模式进入用户模式,只需使用MSR指令操作CONTROL寄存器。但是,不可以直接从用户模式转入特权模式,必须经过一个异常处理操作模式,比如SVC( Supervisor Calls)。在异常处理通过操作CONTROL寄存器,可从用户模式回到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
如下图所示:
13.jpg

在代码中结合特权与用户模式使用MPU
1. 开发环境
开发板: STM32 L476RG NUCLEO
开发工具:STM32Cube_FW_L4_V1.7.0
                IAR/Keil
注:也可以选择其他STM32系列并选择相应的开发板与固件库。
   
2. 开发目标定义
在软件中定义一块数组,使用MPU将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异常或者硬错误。
14.jpg
图表 3 特权模式与用户模式的切换

3. 代码资源与整合
STM32 Cube固件库提供了大量的例程供学习和重用。查找STM32Cube_FW_L4_V1.6.0可以发现,固件库已分别实现了特权模式与用户模式的切换(CORTEXM_ModePrivilege),和MPU的配置(CORTEXM_MPU)。
15.jpg

我们需要将两个例程整合在一起来实现我们的开发目标。注意你选择其他STM32系列也是没有问题的,也支持MPU功能。
复制CORTEXM_MPU\Src\stm32_mpu.c 到CORTEXM_ModePrivilege\Src目录下
16.jpg
复制CORTEXM_MPU\Inc\stm32_mpu.h到CORTEXM_ModePrivilege\Inc目录下
17.jpg
打开CORTEXM_ModePrivilege工程文件,将stm32_mpu.c和stm32_mpu.h添加到工程文件中。IAR与Keil略有不同,在IAR下只需添加C文件。


4. 修改与增加代码
新增加的代码以红色表示
●在主程序中包含stm32_mpu.h
18.png
●在主程序里调用MPU配置函数
要对使用的内存进行MPU配置,未被MPU配置的资源将视之为不可访问。这是MPU_Config必须被使用的原因。
19.jpg
●修改MPU_AccessPermConfig将数组区域配置成我们设计的权限并增加测试代码。
MPU_AccessPermConfig在特权模式下运行,故测试代码不会触发异常。
21.jpg
22.jpg
●在用户模式下尝试读写数组
参考代码中直接访问数组,很容易被编译器优化掉而不能发挥测试作用。这里加了个判断后写的操作,使编译器不去优化它。
23.jpg
24.jpg
至此,可以编译成功运行来体会特权模式与用户模式的MPU的不同配置。执行到主程序中新加的数组访问代码,会产生内存管理异常。


5. 关键代码分析
●从特权模式进入用户模式。直接设置CONTROL寄存器。
25.jpg
●从用户模式回到特权模式,需要触发异常处理
26.jpg
●在异常处理中将线程回到特权模式执行
27.jpg
●若用户模式下代码试图访问无权限数据将产生内存管理异常,从而进入下述函数。
28.png

结论
本文档介绍了MPU的特权与用户模式,并整合与修改已有代码进行了应用。在实际中可将MPU与Cortex运行模式结合,可使应用更加健壮与安全。


文档下载

更多实战经验
收藏 评论6 发布时间:2017-6-21 14:40

举报

6个回答
哈佛祖安智 回答时间:2017-6-21 15:28:53
帮顶
wolfgang2015 回答时间:2017-6-21 16:23:43
好~~~~~
creep 回答时间:2017-6-21 20:43:11
实战技术很有用。
epochal 回答时间:2017-6-21 21:23:57
谢谢分享!
cuihongwei 回答时间:2019-2-17 16:49:59
谢谢分享
Kevin201707 回答时间:2019-2-18 09:38:03

谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版