Cortex -M3 用户级与特权级切换 及 MPU的使用
来源:互联网 发布:淘宝千里眼软件怎么样 编辑:程序博客网 时间:2024/05/21 12:39
特权级、用户级间的切换:
程序特权级可以访问所有的存储器,而在用户级时便有所限制,以此来保护系统不被一些程序给破坏;
在特权级下只需通过修改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)
只使用单个统一的 MPU,此位段永远为零15:8 DREGION R 0 MPU 支持的数量。若系统中配了MPU则为8,
否则为零0 SEPARATE R 0 固定为零
MPU 控制寄存器 MPUCR (地址:0xE000_ED94)
位段 名称 类型 复位值 描述2 PRIVDEFENA RW 0 是否为特权级打开缺省存储器映射(即背景
region)。
1=特权级下打开背景 region
0=不打开背景 region。任何访问违例以及对region
外地址区的访问都将引起 fault1 HFNMIENA RW 0 1=在 NMI 和硬 fault服务例程中不强制除能MPU
0=在 NMI 和硬fault服务例程中强制除能MPU0 ENABLE RW 0 使能 MPU
MPU region 基址寄存器 MPURBAR (地址:0xE000_ED9C)
位段 名称 类型 复位值 描述31:NADDR 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 覆写位段
MPU基址属性及容量寄存器MPUBASR (地址:0xE000_EDA0)
位段 长度 名称 功能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对存储器类型的决定(上表中的21:19位)
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/a001 1 0 实现者您说了算 您说了算 您说了算001 1 1 片外或片内的“写回”型,带读和写的allocate普通 S位决定010 1 x 共享不可的设备 设备 总是不可010 0 1 n/a n/a n/a010 1 x n/a n/a n/a1BBA A 带缓存的内存。 BB=适用于片外内存, AA=适用于片
内内存普通 S位决定
*具体内容详见<Cortex-M3权威指南>第14章存储保护单元MPU
参考自《M3-权威指南》
- Cortex -M3 用户级与特权级切换 及 MPU的使用
- Cortex-M3的特权级别
- Cortex-M3与Cortex-M4的比较
- Cortex-M3 操作模式和特权级别
- Cortex-M3操作模式和特权级别
- 传统的ARM与Cortex-M3
- ARM7 与 Cortex-M3的性能比较
- Cortex-M3与ARM7的比较
- ARM7与Cortex-M3的区别
- Cortex-M3 的本性
- Cortex-M3的优势
- Flash download failed-"Cortex-M3"的原因及解决办法
- Cortex M3使用PendSV异常
- Cortex-m3 异常切换进Trumble模式
- Cortex-M3 处理器的资料
- ARM Cortex-M3的优势
- Cortex-M3的存储映射
- ARM Cortex-M3的优势
- ShadowsocksR一键安装脚本
- get和post的区别
- easyui filebox只选择Excel文件(.xls/.xlsx)
- java八大基本类型初始化
- session实现登陆/登出效果(初识session基础练习)
- Cortex -M3 用户级与特权级切换 及 MPU的使用
- CyclicBarrier的使用
- 一张有趣的图片告诉你MapReduce
- Linux 文件与目录管理
- 终于解决了python 3.x import cv2 “ImportError: DLL load failed: 找不到指定的模块” 的问题
- Linux内核中的bsearch二分查找函数
- Ubuntu 12 安装 TeamViewer 失败解决方案
- android 解析XML(Pull、SAX)
- 懂技术懂行业还有力推决心,紫光工业云准备好了