ARM体系结构

news/2024/7/5 1:41:23

工作模式_ufisaus

USRFRQIRQSVCABTUNDSYS
R0
R1
R2
R3
R4
R5
R6
R7
R8R8_FRQ
R9R9_FRQ
R10R10_FRQ
R11R11_FRQ
R12R12_FRQ
SPSP_FRQSP_IRQSP_SVCSP_ABTSP_UND
LRLR_FRQLR_IRQLR_SVCLR_ABTLR_UND
PC
CPSR
SPSR_FRQSPSR_IRQSPSR_SVCSPSR_UNDSPSR_ABT
  • USR(User) :正常程序的执行状态
  • FIQ(Fast interrupt) :用于高速数据传输和通道处理
  • IRQ(Interrupt) :通常的中断处理
  • SVC(Supervisor) :供操作系统使用的一种保护模式,复位或执行SWI进入该模式
  • ABT(Abort) :可用于虚拟存储以及存储保护,当数据或指令预取终止时进入该模式
  • UND(Undefined) :可用于支持硬件协处理器的软件仿真,未定义的指令执行时进入该模式
  • SYS(System) :运行具有特权的操作系统任务

Note:

  • 除了USR和SYS外都是异常模式
  • 除了USR外都是特权模式 , 特权模式可以通过直接修改CPSR中相应的位来切换到USR,但是USR不能直接修改CPSR,只能通过指令,
  • OS的内核态程序工作在SVC模式, 用户态程序工作在USR模式
  • ARM的CPU复位就处于SVC模式,执行完启动代码后就需要切换到USR模式

运行状态

  • ARM状态:执行ARM指令时,32位指令,当处理器执行在ARM状态,所有的指令必须word对齐(所有指令的起始地址都是4的整数倍),所以PC的[1:0]是没有作用的,
  • Thumb状态:执行Thumb指令时,16位指令, 当处理器执行在thumb状态,所有的指令必须halfword对齐,所有指令的起始地址都是2的整数倍,所以pc的[0]是没有定义的
  • Jazelleh状态,是byte对齐的
    指令/数据本身是多少位的,存储的起始地址就是多少位的整数倍

通用寄存器

  • R13 :SP,Stack Pointer,当前模式的栈指针,永远指向栈顶,压栈就是将寄存器的值放入栈中同时移动sp,出栈就是将栈中的值放入寄存器同时移动sp,用于保护现场,例如进行多级跳转时,只有一个LR寄存器肯定是不够用的,这时就可以将函数返回的地址进行压栈,函数执行完毕再将地址出栈到PC
  • R14 :LR,Link Register,保存函数调用返回的位置,存储pc下一条指令的地址,调用函数返回之间将pc的值赋值给lr(mov pc, lr),就可以返回原程序
  • R15 :PC,Program Counter,当前"执行"指令的地址+8byte,不论是多少级流水,PC永远指向当前执行指令的下两条位置,更多级的流水都是在"执行"之后的级数

状态寄存器_NZCV-iftm

CPSR(Current Program Status Register):程序状态寄存器
SPSR(Saved Process Satus Register):cpsr的备份寄存器
[31]:N, =1表示结果为Negative
[30]:Z, =1表示结果为Zero
[29]:C, =1表示计算有Carry(进位) , 如果ALU有加法运算,且产生了进位,则C位自动置1,如果ALU有减法运算,且产生了借位,则C位自动置0
[28]:V, =1表示计算有oVerflow(溢出)
[27:8]:保留
[7]:I, IRQ的屏蔽位,=1表示禁止IRQ
[6]:F, FIQ的屏蔽位,=1表示禁止FRQ ,芯片的一上电默认就是将if两个位置1,因为初始化代码执行期间系统还没准备好,响应中断没有意义,一般在启动代码执行的最后手动将这两位清0,进入系统
[5]:T, 标识当前CPU的工作状态, =1表示执行Thumb指令 ,该位不能直接被修改,必须用过bic修改
[4:0]:M, CPU工作模式位, 任何模式都可以读,只有特权模式可以写

异常_firdpsur

FRQ:当硬件产生FRQ信号触发该异常 -> FRQ
IRQ :当硬件产生IRQ信号触发该异常 -> IRQ
PretchAbort:当取指令出错 -> ABT
Data Abort:当取数据出错 -> ABT
SWI :软中断异常,执行汇编指令 “swi” -> SVC
Undefine:CPU解码到不认识的机器指令, -> UND
Reset:复位异常,按下复位键触发该异常, -> SVC

异常向量表

早期的ARM会在0地址处放置一张表,表的每一项都对应的了发生该类异常时的处理函数的地址,现在的ARM核可以在初始化代码中指定异常向量表的位置,不过默认还是0地址处。在ARM体系中,异常终端向量表的大小为32byte.每个异常中断占4byte,这4byte存储一条跳转指令或者一个向PC寄存器中赋值的数据访问指令,通过这两种指令,程序跳转到相应的异常中断处理程序。
ARM 的异常也是有优先级的,Reset > DataAbort > FIQ > IRQ > PrefetchAbort > SWI > Undef。 在执行高优先级的异常处理程序时,不允许被低优先级的异常中断,但是反过来可以。
FIQ比IRQ快的3个原因

  1. FIQ的优先级比IRQ高,同时发生时会优先执行FRQ
  2. FIQ对应的FIQ模式有更多的私有寄存器,这意味着如果FIQ如果用到R8~R12这些寄存器,不需要像IRQ一样先把原来的寄存器值进行压栈
  3. FIQ在中断向量表的最高处,这就为我们直接在FIQ上面的地址直接写异常处理程序提供了可能,其他的异常必须通过跳转,而跳转就需要保存IR值

当异常产生时,硬件自动做的4件事

  1. 复制CPSR寄存器的内容到SPSR_<mode> //eg,产生了reset异常,复制内容到SPSR_<svc>
  2. 修改CPSR寄存器
    1. 切换为ARM状态 (CPSR的T位置0)
    2. 切换到异常模式 (CPSR的M位[4:0]置相应的值)
    3. 禁止必要的中断 (CPSR的IF位置1)
  3. 存储返回地址到LR_<mode>寄存器
  4. 设置PC为相应的异常入口地址

当异常处理结束,返回时软件要做的2件事

  1. SPSR_<mode>恢复CPSR
  2. 拷贝LR_<mode>的内容到PC

转载于:https://www.cnblogs.com/xiaojiang1025/p/5951459.html


http://lihuaxi.xjx100.cn/news/254280.html

相关文章

Spring中毒太深,离开Spring居然连最基本的接口都不会写了

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典来源&#xff1a;cnblogs.com/lonely-wolf/p/14127957.html前言Spring 能帮我们做什么控制反转&#xff08;IOC&#xff09;依赖注入&#xff08;DI&#xff09;面向切面编程&#xff08;AOP&#xff09;利用 Spring 来完…

Datawhale x OpenMMLab:共建国际一流开源项目!

CV 技术盛事超级视客营你的热门活动小助手已上线百万算力支持&#xff0c;100 实战项目任你挑选&#xff01;欢迎来到由 OpenMMLab 联合北京超级云计算中心主办、Datawhale 社区及上海市人工智能行业协会协办的计算机视觉任务实战活动——【超级视客营】第一期。我们诚邀全球开…

php获取输入流

uc中的用到的代码(在api/uc.php)代码&#xff1a; $post xml_unserialize(file_get_contents(php://input));&#xfeff; php手册&#xff08;http://cn.php.net/manual/zh/wrappers.php.php&#xff09;说明: php://input allows you to read raw data from the request bod…

Pandas 实用技能,将列(column)排序的几种方法

作者 | 阳哥来源 | Python数据之道Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一。Pandas是一种高效的数据处理库&#xff0c;它以 dataframe 和 series 为基本数据类型&#xff0c;呈现出类似excel的二维数据。在数据处理过程中&#xff0c;咱们经常需要将列按…

Numpy入门教程:06. 排序,搜索和计数

背景 什么是 NumPy 呢&#xff1f; NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库&#xff0c;可以帮助程序员轻松地进行数值计算&#xff0c;通常应用于以下场景&#xff1a; 执行各种数学任务&#xff0c;如&#xff1a;数值积分、微分、…

设置列表字段为主键

转贴:Sample event handler to set a field as a pr imary key (enforce no duplicates) Got this as a request from a reader- how to prevent users from adding items with same titles as ones that already exist in the list. Codeusing System;using System.Collectio…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

AI大神LeCun深度学习公开课来啦!4万字干货笔记

Datawhale干货 主讲&#xff1a;Yann LeCun&#xff0c;整理&#xff1a;新智元【新智元导读】Yann LeCun大师课程&#xff0c;搭配120页笔记食用效果更佳。喜欢深度学习&#xff1f;最好的方法就是在线课程。这里推荐图灵奖得主、纽约大学教授Yann LeCun主讲的在线课程。该课程…