请选择 进入手机版 | 继续访问电脑版
搜索
查看: 7859|回复: 6

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

[复制链接]
  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

    最后登录
    2020-3-17
    发表于 2017-6-21 14:40:52 | 显示全部楼层 |阅读模式
    理解与应用 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运行模式结合,可使应用更加健壮与安全。


    文档下载

    更多实战经验
    回复

    使用道具 举报

    该用户从未签到

    64

    主题

    809

    帖子

    23

    蝴蝶豆

    实习版主

    最后登录
    2021-4-25
    发表于 2017-6-21 15:28:53 | 显示全部楼层
    帮顶
    回复

    使用道具 举报

    该用户从未签到

    74

    主题

    1442

    帖子

    194

    蝴蝶豆

    版主

    最后登录
    2023-10-26
    发表于 2017-6-21 16:23:43 | 显示全部楼层
    好~~~~~
    回复

    使用道具 举报

    该用户从未签到

    60

    主题

    2111

    帖子

    31

    蝴蝶豆

    版主

    最后登录
    2023-6-21
    发表于 2017-6-21 20:43:11 | 显示全部楼层
    实战技术很有用。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2290

    帖子

    3

    蝴蝶豆

    论坛元老

    最后登录
    2021-5-1
    发表于 2017-6-21 21:23:57 | 显示全部楼层
    谢谢分享!
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2019-2-17
    发表于 2019-2-17 16:49:59 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    1029

    帖子

    133

    蝴蝶豆

    金牌会员

    最后登录
    2021-4-24
    发表于 2019-2-18 09:38:03 | 显示全部楼层

    谢谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-3-28 20:51 , Processed in 0.205874 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表