浅析嵌入式系统之uboot详解(2)—CPU工作模式

bootloader详解目录—废铁是怎么产生价值的

浅析嵌入式系统之uboot详解(1)—板子上电后uboot做了什么
浅析嵌入式系统之uboot详解(2)—CPU工作模式
浅析嵌入式系统之uboot详解(3)—看门狗
浅析嵌入式系统之uboot详解(4.1)—内部中断
浅析嵌入式系统之uboot详解(4.2)—外部中断(GPIO)
浅析嵌入式系统之uboot详解(4.3)—异常和异常向量
浅析嵌入式系统之uboot详解(5.1)—时钟分频
浅析嵌入式系统之uboot详解(5.2)—省电模式(番外)
浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)
浅析嵌入式系统之uboot详解(6)—关闭缓存和mmu
浅析嵌入式系统之uboot详解(7)—初始化SDRAM


0. 前言

  前面一篇文章我们了解到当开发板上电以后,会将uboot的前4k内容复制到stepping stone中运行,现在来分析这4k代码到底做了些什么。

  上一篇文章浅析嵌入式之uboot详解(一)—板子上电后uboot做了什么最后,我们可以看到uboot的运行流程,当reset以后,uboot做的第一个动作就是设置cpu的运行模式,这篇文章将详细介绍cpu运行模式的相关知识。

1. 背景

  人有生老病死,如果把我们的计算机比作一个生命的话,那么它也有一个生老病死的一个过程,唯一的区别是它没有情绪,没有高兴和悲伤,也不会发脾气,更不会无理取闹,因为对它来说,任何事件的发生都是有原因的,要么是硬件问题,要么是程序问题,它总是勤勤恳恳的按照我们的程序指令一条一条的执行着。然而,虽然它没有自己的情绪,但是它却有着作为“生命”基本的特征,开机是它“生命”开始,死机是它“生命”的结束,死法有多种,谁都不知道会是哪一种,也许是发烧过热了,也许是温度太低芯片出问题了,也许是短路了,也许是正常关机了等等,这些都不重要,重要的是它能够通过重启“活过来”,而我们却不行。

  上面扯远了,回到正题。作为”生命“,它在不同的情况下会处于不同的状态,它”生病“时,会进入异常模式,它休克时会进入中止模式,它需要先处理其他事情时会进入中断模式,它迷茫时会进入未定义指令终止模式,它正常工作在用户模式或系统模式,虽然这样类比不太恰当,也不够严密,但我又不是科学家,管他呢。

  开发板刚上电的时候就像是一个baby,它需要受到“保护”,需要一个“成长的环境”,同时也要被教导该做什么,怎么做,所以板子reset的时候,首先需要进入到一种保护模式中,在这个模式中完成一些硬件的初始化和寄存器的配置,这个模式的名称叫:管理模式

2. 处理器工作模式

ARM 有七种模式:

处理器工作模式特权模式异常模式说明
用户(user)模式用户程序运行模式
系统(system)模式该组模式下可以任意访问系统资源运行特权级的操作系统任务
一般中断(IRQ)模式通常由系统异常状态切换进该组模式普通中断模式
快速中断(FIQ)模式快速中断模式
管理(supervisor)模式提供操作系统使用的一种保护模式,swi命令状态
中止(abort)模式虚拟内存管理和内存数据访问保护
未定义指令终止(undefined)模式支持通过软件仿真硬件的协处理

说明:

  1. 用户模式:用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。

  2. 系统模式:系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

  3. 一般中断模式:一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。

  4. 快速中断模式:快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。

  5. 管理模式:管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下,当用户模式下的用户程序请求使用硬件资源时通过软件中断进入该模式。

  6. 中止模式:中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。

  7. 未定义模式:未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。

3. 寄存器

每种模式下对应的arm状态寄存器:
在这里插入图片描述
虽然放在这里讲寄存器有点早,但是下面介绍的内容有依赖于它,所以在这里先解释一下这张表。

这张表是datasheet里面截取下来的,本来还有一张是thumb state,但是我放弃了,我想自己也不会想去了解arm thumb状态的工作原理了,就像现在舍弃使用单片机一样。

从上面这张表中可以看出:

  1. 不管在哪种模式下,r0~r7,r15和CPSR寄存器都是大家公用的,因为他们都没有用三角号进行标记(用三角号标记的表示这个寄存器是该模式独有的),这里共用的寄存器一共有10个

  2. r8~r12是管理模式,用户模式,系统模式,中止模式,一般中断模式和指令未定义模式6个模式所共有的,也就是说,只有快速中断模式使用自己的r8~r12(因为在FIQ下这几个私有寄存器里的数据在模式切换时可以不用入栈保存),这里共用的寄存器一共有5个

  3. 从图中可以看出,除了system&user共用r13和r14 (sp lr)以外(因为用户模式有时候需要切换到特权模式下执行,所以他们公用sp 和 lr),其他每一种模式都有自己的r13和r14寄存器(因为在每种模式下都有自己的栈空间用于执行程序和保存返回地址),这里共用的寄存器一共有2个

  4. 除了共用的寄存器,剩下的就是私有的寄存器了,通过数三角形可以知道一般用的私有寄存器有15个(上面有15个灰三角),下面的私有状态寄存器有5个,所以私有寄存器一共有20个
    (system&user模式下没有SPSR寄存器,因为这两种模式不是异常模式,它不需要SPSR寄存器)

正如文档所说“ARM920T has a total of 37 registers - 31 general-purpose 32-bit registers and6status registers- but these cannot
all be seen at once.
” ,那么这37个寄存器是哪些呢,就是我们上面所说的 10+5+2=17 个共用寄存器和20个私有寄存器

共用寄存器和私有寄存器的区别:

公用寄存器在切换模式的时候,共用者间使用的寄存器是相同的;而在cpu切换到当前模式时,私有寄存器是只能够自己使用的,其他模式是不能够使用你的私有寄存器的,这样说可能不好理解,比如:

r3寄存器是所有模式共用的寄存器,那么当处理器从user模式切换到 IRQ模式的时候,仍然IRQ模式仍然可以使用r3寄存器,里面的数据也是可以读取和写入的

但是r13寄存器不是所有模式共用的寄存器,当处理器从user模式切换到 IRQ模式的时候,在user模式下,r13是可以被使用的,但是在IRQ模式下,r13是不可用的,因为它看不到r13了,取而代之的是r13_irq,IRQ模式有它自己的r13_irq寄存器,而且r13_irq寄存器只有它自己可见,别的模式是看不见IRQ模式的私有寄存器(r13_irq)的。

正如上面标橙色部分(but these cannot all be seen at once)所说:虽然有这么多寄存器,但是他们是不能够在同一模式下看到全部的,要看到某种模式下的私有寄存器,只有切换到那种模式下才能看到。

与处理器模式相关的寄存器

与arm处理器模式相关的寄存器,其实就是两个:CPSR SPSR

SPSR是一个32位的寄存器,它其实就是CPSR备份,用来保存切换到该模式之前的状态,之所以用户模式和系统模式没有SPSR,是因为通常CPU大部分时间都工作在用户模式下,当产生异常或系统调用的时候会分别切换进另外几种模式,保存用户模式下的状态,当切换回原模式的时候,直接恢复SPSR的值到CPSR就可以了,因此,用户模式和系统模式下不需要SPSR寄存器。

下面将对CPSR寄存器进行分析:
在这里插入图片描述
条件标志位
N——本位设置成当前指令运算结果的bit[31]的值。当两个表示的有符号整数运算时,n=1表示运算结果为负数,n=0表示结果为正书或零。

Z——z=1表示运算的结果为零;z=0表示运算的结果不为零。对于CMP指令,Z=1表示进行比较的两个数大小相等。

C——下面分四种情况讨论C的设置方法:

  • 在加法指令中(包括比较指令CMP),当结果产生了进位,则C=1,表示无符号运算发生上溢出;其他情况C=0。
  • 在减法指令中(包括减法指令CMP),当运算中发生错位,则C=0,表示无符号运算数发生下溢出;其他情况下C=1。
  • 对于包含移位操作的非加减运算指令,C中包含最后一次溢出的的位的数值。
  • 对于其他非加减运算指令,C位的值通常不受影响。

V——对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号为溢出;通常其他指令不影响V位。

CPSR的低八位I、F、T、M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

中断禁止位I,F

当I=1时禁止IRQ中断

当F=1时禁止FIQ中断

T控制位

T控制位用于控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。

T控制位含义如下:

  • T=0表示执行ARM指令
  • T=1表示执行Thumb指令

对于ARM V5以及更高版本的非T系列处理器,T控制位的含义如下

  • T=0表示执行ARM指令
  • T=1表示强制下一条执行的指令产生未定指令中断

M控制位
M控制位控制处理器模式,具体含义如下:

M[4:0] 处理器模式  可访问的寄存器
在这里插入图片描述
CPSR中的其他位
这些位用于将来扩展。应用软件不要操作这些位。

4. 小结

  这篇文章分析了arm 处理器的运行模式,介绍了每种模式下会使用到哪些处理器,分析了CSPR寄存器相应位的作用。
  后面依然会按照第一篇文章 中介绍的流程进行分析,下一篇文章将分析看门狗相关的内容。
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ʚ兔子的先森ɞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值