Cortex -M3 用户级与特权级切换 及 MPU的使用
2017-09-30 09:58
981 查看
特权级、用户级间的切换:
程序特权级可以访问所有的存储器,而在用户级时便有所限制,以此来保护系统不被一些程序给破坏;
在特权级下只需通过修改CONTROL寄存器的第0位,置为1则进入用户级;当用户级要进入特权级则需要先进入handler模式(异常模式),在handler中配置CONTROL第0位置为1则可以回到特权级;在用户级是无法操作CONTROL寄存器的。
下表是CONTROL寄存器的两个位的功能:
特殊功能寄存器不存在地址,只能被专用的
MSR
和
MRS
指令访问。
特殊功能寄存器不存在地址,只能被专用的
MSR
和
MRS
指令访问。
特殊功能寄存器不存在地址,只能被专用的MSR和MRS指令访问。
使用方式:
MRS <gp_reg> , <special_reg>; 读.特殊功能寄存器的值到通用寄存器;
MSR <special_reg> , <gp_reg>; 写. 通用寄存器的值到特殊功能寄存器; 其中<gp_reg>是通用寄存器,<special_reg>是特殊寄存器;
例如: ·
MOV R0,#0x01;
MOV RPIMASK,R0; ·
MOV R0,0x60;
MOV BASEPRI,R0;
程序启动后,线程模式会在CONTROL的指引下进入从特权级转为用户级运行,如果在用户级下面MSR命令自然是不.能更改...CONTROL特权的,那么如何解决?
刚才表格中说了handler模式下肯定是特权级的,那么我们就利用handler模式来解决这个问题。 在中断处理的时候(handler
mode),加入代码:
MRS R0,CONTROL;//读取CONTROL;
BIC.W R0,R0,#0x01;//清零CONTROL[0];
MSR CONTROL,R0;//将清零的内容写入CONTROL;
这样CONTROL[0]就等于0了,变成特权级;程序返回后,继续往下执行,就是在特权级下的指令执行了。
记得利用MSR+CONTROL返回用户级;如此再加上MPU设备,书上这样形容:安全,健壮
MPU 配置使用:
MPU是存储器保护单元,用来保护存储器,是软件更加健壮可靠:
1.阻止用户应用程序破坏操作系统使用的数据
2.阻止一个任务访问其它任务的数据区,从而把任务隔开。
3.可以把关键数据区设置为只读,从根本上消除了被破坏的可能。
4.检测意外的存储访问,如,堆栈溢出,数组越界。
5.此外,还可以通过MPU设置存储器regions的其它访问属性,比如,是否缓区,是否
缓冲等。
配置:
1. 读取MPUTR寄存器(地址:0xE000_ED90 )的[15:8]位(DREGION),判断芯片是否配置了MPU;
2. 操作MPUCR寄存器(地址:0xE000_ED94)的[0]位,置0除能MPU。
3. 操作号寄存器MPURNR(地址:0xE000_ED98)的[7:0]位,选择下个要配置的region,因为M3只支持8个region所以只有[2:0]有效;
4. 操作基址寄存器MPURBAR(地址:0xE000_ED9C)的
[31:N]位:(Region 基址字段。 N 取决于 region 容量,以使基址在数值上能被容量整除。
在 MPU region 属性及容量寄存器中有个 SZENABLE 位段,它决定 ADDR 中有多少个位被采用。)
[4]:是否支持写入REGION 覆写位段,置1能被覆写,置0不能被覆写;
[3:0]:REGION覆写位端;
5. 操作属性及容量寄存器MPURASR(地址:0xE000_EDA0);具体属性的配置对应下表寄存器的相应位端;
6. 最后使能MPU;
各个寄存器的详细信息:
MPU 类型寄存器 MPUTR (地址:0xE000_ED90)
MPU 控制寄存器 MPUCR (地址:0xE000_ED94)
MPU region 基址寄存器 MPURBAR (地址:0xE000_ED9C)
MPU基址属性及容量寄存器MPUBASR (地址:0xE000_EDA0)
TEX,C,B对存储器类型的决定(上表中的21:19位)
*具体内容详见<Cortex-M3权威指南>第14章存储保护单元MPU
参考自《M3-权威指南》
程序特权级可以访问所有的存储器,而在用户级时便有所限制,以此来保护系统不被一些程序给破坏;
在特权级下只需通过修改CONTROL寄存器的第0位,置为1则进入用户级;当用户级要进入特权级则需要先进入handler模式(异常模式),在handler中配置CONTROL第0位置为1则可以回到特权级;在用户级是无法操作CONTROL寄存器的。
下表是CONTROL寄存器的两个位的功能:
CONTROL[1] | 堆栈指针选择 0=选择主堆栈指针 MSP(复位后缺省值) 1=选择进程堆栈指针 PSP 在线程或基础级(没有在响应异常——译注),可以使用PSP。在handler模式下, 只允许使用 MSP,所以此时不得往该位写1。 |
CONTROL[0] | 0=特权级的线程模式 1=用户级的线程模式 Handler 模式永远都是特权级的。 |
MSR
和
MRS
指令访问。
特殊功能寄存器不存在地址,只能被专用的
MSR
和
MRS
指令访问。
特殊功能寄存器不存在地址,只能被专用的MSR和MRS指令访问。
使用方式:
MRS <gp_reg> , <special_reg>; 读.特殊功能寄存器的值到通用寄存器;
MSR <special_reg> , <gp_reg>; 写. 通用寄存器的值到特殊功能寄存器; 其中<gp_reg>是通用寄存器,<special_reg>是特殊寄存器;
例如: ·
MOV R0,#0x01;
MOV RPIMASK,R0; ·
MOV R0,0x60;
MOV BASEPRI,R0;
程序启动后,线程模式会在CONTROL的指引下进入从特权级转为用户级运行,如果在用户级下面MSR命令自然是不.能更改...CONTROL特权的,那么如何解决?
刚才表格中说了handler模式下肯定是特权级的,那么我们就利用handler模式来解决这个问题。 在中断处理的时候(handler
mode),加入代码:
MRS R0,CONTROL;//读取CONTROL;
BIC.W R0,R0,#0x01;//清零CONTROL[0];
MSR CONTROL,R0;//将清零的内容写入CONTROL;
这样CONTROL[0]就等于0了,变成特权级;程序返回后,继续往下执行,就是在特权级下的指令执行了。
记得利用MSR+CONTROL返回用户级;如此再加上MPU设备,书上这样形容:安全,健壮
MPU 配置使用:
MPU是存储器保护单元,用来保护存储器,是软件更加健壮可靠:
1.阻止用户应用程序破坏操作系统使用的数据
2.阻止一个任务访问其它任务的数据区,从而把任务隔开。
3.可以把关键数据区设置为只读,从根本上消除了被破坏的可能。
4.检测意外的存储访问,如,堆栈溢出,数组越界。
5.此外,还可以通过MPU设置存储器regions的其它访问属性,比如,是否缓区,是否
缓冲等。
配置:
1. 读取MPUTR寄存器(地址:0xE000_ED90 )的[15:8]位(DREGION),判断芯片是否配置了MPU;
2. 操作MPUCR寄存器(地址:0xE000_ED94)的[0]位,置0除能MPU。
3. 操作号寄存器MPURNR(地址:0xE000_ED98)的[7:0]位,选择下个要配置的region,因为M3只支持8个region所以只有[2:0]有效;
4. 操作基址寄存器MPURBAR(地址:0xE000_ED9C)的
[31:N]位:(Region 基址字段。 N 取决于 region 容量,以使基址在数值上能被容量整除。
在 MPU region 属性及容量寄存器中有个 SZENABLE 位段,它决定 ADDR 中有多少个位被采用。)
[4]:是否支持写入REGION 覆写位段,置1能被覆写,置0不能被覆写;
[3:0]:REGION覆写位端;
5. 操作属性及容量寄存器MPURASR(地址:0xE000_EDA0);具体属性的配置对应下表寄存器的相应位端;
6. 最后使能MPU;
各个寄存器的详细信息:
MPU 类型寄存器 MPUTR (地址:0xE000_ED90)
位段 | 名称 | 类型 | 复位值 | 描述 |
23:16 | IREGION | R | 0 | MPU 支持的指令region数量。因为ARMv7‐M 只使用单个统一的 MPU,此位段永远为零 |
15:8 | DREGION | R | 0 | MPU 支持的数量。若系统中配了MPU则为8, 否则为零 |
0 | SEPARATE | R | 0 | 固定为零 |
位段 | 名称 | 类型 | 复位值 | 描述 |
2 | PRIVDEFENA | RW | 0 | 是否为特权级打开缺省存储器映射(即背景 region)。 1=特权级下打开背景 region 0=不打开背景 region。任何访问违例以及对region 外地址区的访问都将引起 fault |
1 | HFNMIENA | RW | 0 | 1=在 NMI 和硬 fault服务例程中不强制除能MPU 0=在 NMI 和硬fault服务例程中强制除能MPU |
0 | ENABLE | RW | 0 | 使能 MPU |
位段 | 名称 | 类型 | 复位值 | 描述 |
31:N | ADDR | RW | ‐ | Region 基址字段。N取决于region容量,以使基址在数值 上能被容量整除。在 MPU region 属性及容量寄存器中有 个 SZENABLE 位段,它决定ADDR中有多少个位被采用。 |
4 | VALID | RW | ‐ | 决定是否理会写入REGION字段的值 1=MPU region号寄存器被REGION覆盖 0=MPU region号寄存器的值保持不变 |
3:0 | REGION | RW | ‐ | MPU region 覆写位段 |
位段 | 长度 | 名称 | 功能 |
31:29 | 3 | - | 保留 |
28 | 1 | XN | 1=此区禁止取指 2=此区允许取指 |
27 | 1 | - | 保留 |
26:24 | 3 | AP | 访问许可,如下表所示 值 特权级下的许可 用户级下的许可 典型用法 0b000 禁地 禁地 该区没有存储器,是空地址 0b001 RW 禁地OS以及系统软件使用的数据区 0b010 RW RO 禁止在用户级下更改的高危地带 0b011 RW RW 共享内存,或彻底开放的设备 0b100 n/a n/a n/a 0b101 RO 禁地OS使用的常量数据 0b110 RO RO 常量数据或只读存储器的地址区 0b111 RO RO 常量数据或只读存储器的地址区 |
23:22 | 2 | - | 保留 |
21:19 | 3 | TEX | 类型扩展 |
18 | 1 | S | Sharable(可否共享) 1=共享可 0=共享不可 |
17 | 1 | C | Cachable(可否缓存) 1=缓存可 0=缓存不可 |
16 | 1 | B | Buffable(可否缓冲) 1=缓冲可 0=缓冲不可 |
15:8 | 8 | SRD | 子region除能位段。每设置SRD的一个位,就会除能与之对应的一个子region。 容量大于128字节的region都被划分成8个容量相同的子region。容量小于等于 128字节的region不能再分。更多信息,请参见对子Region的论述。 |
7:6 | 2 | - | 保留 |
5:1 | 5 | REGIONSIZE | Region容量,单位是字节。容量为1<<(REGIONSIZE+1),但是最小容量为32字节 |
0 | 1 | SZENABLE | 1=使能此region 0=除能此region |
TEX | C | B | 描述 | 存储器类型 | 可否共享 |
000 | 0 | 0 | 严格按顺序 | 严格按顺序 | 总是可以 |
000 | 0 | 1 | 共享的设备 | 设备 | 总是可以 |
000 | 1 | 0 | 片外或片内的“写通”型内存,没有写allocate | 普通 | S位决定 |
000 | 1 | 1 | 片外或片内的“写回”型内存,没有写allocate | 普通 | S位决定 |
001 | 0 | 0 | 片外或片内的“缓存不可”型内存 | 普通 | S位决定 |
001 | 0 | 1 | n/a | n/a | n/a |
001 | 1 | 0 | 实现者您说了算 | 您说了算 | 您说了算 |
001 | 1 | 1 | 片外或片内的“写回”型,带读和写的allocate | 普通 | S位决定 |
010 | 1 | x | 共享不可的设备 | 设备 | 总是不可 |
010 | 0 | 1 | n/a | n/a | n/a |
010 | 1 | x | n/a | n/a | n/a |
1BB | A | A | 带缓存的内存。 BB=适用于片外内存, AA=适用于片 内内存 | 普通 | S位决定 |
参考自《M3-权威指南》
相关文章推荐
- Cortex M3使用PendSV异常
- Cortex-M3 操作模式和特权级别
- Jlink V7在MDK下使用Cortex-M3-Jlink模式开发STM32的说明
- [ M3 PN ] STM32F10XXX(Cortex-M3) MDK-RAM 使用固件库函数的配置
- cortex-m3,4 ITM printf 使用
- STM32 独立看门狗使用经验(Cortex-M3)
- 从Cortex-M3的MSP 和PSP谈Linux能否在中断中使用Sleep
- Cortex-M3操作模式和特权级别
- 如何使用GNU编译器GCC来编译Cortex-M3?GCC + STM32
- Cortex-m3 异常切换进Trumble模式
- uC/OSIII在Cortex-M3的任务切换和中断退出分析
- STM32F10XXX(Cortex-M3) MDK-RAM 使用固件库函数的配置
- 替代IAR,使用免费的gcc编译开发cortex-m3产品
- Cortex-M3的特权级别
- uC/OSIII在Cortex-M3的任务切换和中断退出分析
- 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
- STM32使用J-Link烧写出错:Error: Flash Download failed - Cortex-M3
- ARM Cortex-M3 操作模式和特权级别
- 使用maven的profile切换项目各环境的参数
- jQuery滚动切换传送插件jCarousel使用简介