Cortex-M3内核之CPU等级模式


前言

在Windows上或者Linux上的一个软件崩溃不会导致整个系统的崩溃,这是因为在硬件上能运行Windows或者Linux的硬件包含了MMU(Memory Manage Unit)内存管理单元,在Cortex-M3提供的框图中有MPU(Memory Protection Unite)内存保护单元,所以该部件不是必备的,所以在大部分单片机中不具备该部件,为了让设计的程序更稳定,需要了解CPU的模式并进行控制。


一、CPU的运行模式

Cortex-M3处理器的运行模式包括线程模式特权模式,这两个模式决定了CPU正在运行正常代码还是异常中断代码。特权的分级分为特权级和用户级,这提供了一种存储器访问的保护机制,普通用户不能随意执行核心致命操作。
特权等级的引入,在硬件层面上限制了某些不受信任或者没有调试好的程序,让他们不能随便配置涉及要害的寄存器,从而提高系统的可靠性。
另外操作系统内核通常运行在特权级,在操作系统开启一个用户程序后,通常让用户程序运行在用户级,达到用户程序崩溃不会导致系统整体崩溃或受损。
在这里插入图片描述
上图表明特权模式下,CPU既可以执行异常代码(handle)也可以执行线程代码(thread),在用户模式下,CPU只能执行线程代码(thread)无权执行中断异常代码(handle)

二、CPU模式控制

2.1.CPU模式状态图

在这里插入图片描述上图显示:系统上电复位系统处于特权级thread模式,通过手动修改CONTROL寄存器进行降级处理,由特权级thread模式变为用户级thread模式;通过触发异常的方式进行升级处理,让CPU在用户线程模式变为特权级线程模式。本文将记录如何对CPU模式进行转换操作,并观察实验现象。

2.2.CONTROL寄存器

CONTROL寄存器用于定义特权等级、堆栈指针的选择。

功能
CONTROL[1]堆栈指针选择:0 = 选择主堆栈指针MSP ,1 = 选择线程堆栈指针PSP
CONTROL[0]特权等级模式:0 = 特权级线程模式,1 = 用户级线程模式,handle永远是特权级

在Cortex-M3的Handle模式中,一直选择主堆栈指针即CONTROL[1] = 0,
在线程模式下可以是主堆栈指针可以是线程堆栈指针即CONTROL[0] = 0 | 1,
在特权模式下更改CONTROL[0]实现模式切换
CONTROL寄存器的操作指令:MRS,MSR

MRS  R0 , CONTROL ;读CONTROL值到寄存器R0
ORR R0,R0,#1 ;设置bit0
MSR  CONTROL , R0 ;写R0的值到CONTROL中

2.3.特权级变用户级

在这里插入图片描述
在特权等级下程序可以配置一些中断寄存器,在非特权模式下程序配置中断寄存器时会进入硬件错误中断

在这里插入图片描述
上图显示在非特权等级模式下,通过修改CONTROL寄存不能提升访问等级

2.4.用户级变特权级

提升访问等级的方法是进入异常中断中,在中断中修改CONTROL寄存器来实现等级提升
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

本篇文章记录了通过修改CONTROL寄存器控制特权访问等级,中间涉及汇编代码,拓展自己的视野

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值