您的位置:首页 > 其它

Cortex -M3 用户级与特权级切换 及 MPU的使用

2017-09-30 09:58 981 查看
特权级、用户级间的切换:

    程序特权级可以访问所有的存储器,而在用户级时便有所限制,以此来保护系统不被一些程序给破坏;

    在特权级下只需通过修改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 固定为零
MPU 控制寄存器 MPUCR (地址:0xE000_ED94)

位段 名称 类型 复位值 描述
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
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/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
1BBA A 带缓存的内存。 BB=适用于片外内存, AA=适用于片

内内存
普通 S位决定
*具体内容详见<Cortex-M3权威指南>第14章存储保护单元MPU

参考自《M3-权威指南》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: