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,所以此时不得往该位写1CONTROL[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 基址字段。 取决于 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 固定为零

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-权威指南》

原创粉丝点击