ARM的基础知识

ARM是什么?

        arm即可以是一家芯片设计厂商的名字,也可以代表一类微处理器的通称,还可以表示为一种技术的名称

1、ARM是一个公司:Advanced RISC Machine
2、ARM内核

ARM公司

     1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生,由美国加州SanJoseVLSI技术公司制造。20世纪80年代后期,ARM很快开发成Acorn的台式机产品,形成英国的计算机教育基础。990年成立了Advanced RISC Machines Limited(后来简称为ARM Limited,ARM公司)。20世纪90年代,ARM 32位嵌入式RISC(Reduced lnstruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权。

ARM内核   

        对于任何一款ARM芯片,有两个部分,一个是ARM内核,一个是外设ARM内核:包含:寄存器组、指令集、总线、存储映射规则、中断规则和调试组件等。
        外设:定时器、iic、uart等cpu直接的外部模块,由芯片厂商自己设计与ARM内核衔接
        ARM体系/ARM架构:由ARM公司设计的ARM内核的结构,内核中的部件如何协调工作,执行程序。即arm内核的设计方式就叫做架构。

ARM由ARM指令集架构、ARM工作模式、ARM寄存器等构成

ARM指令集架构

        指令集是arm体系结构(处理器结构设计)中最重要的一部分,对于32位处理器cpu,cpu获取到32位的内容,这32位的01代表什么作用,有什么意义,即32位不同的01序列,不同的值代表不同的机器指令(机器要执行什么),如果再arm体系架构中有指令集,在cpu内部知道每串01代表什么,cpu硬件能够完美解析并执行指令,如寻址、异常处理。

指令(机器指令):用二进制表示一串机器码,机器码表示一个特定的动作
arm指令:有arm公司针对armcpu(arm体系架构)设计的指令
指令集:指令的集合

RISC:精简指令集,ARM架构使用精简指令集

CISC:复杂指令集      

ARM指令--:根据ARM汇编了解

架构    处理器

        ARMV1:ARM1
        ARMV2:ARM2、ARM3
        ARMV3:ARM6、ARM600、ARM610、ARM7、ARM700、ARM710
        ARMV4:StrongARM、ARM8、ARM810、ARM9
        ARMV5:ARM9E、ARM10E
        ARMV6:ARM11

        从ARMV7架构开始,以Cortex命名,分为三个系列:A、R、M
        Cortex-A        高端系列
        Cortex-R        实时系列
        Cortex-M        控制系列
        Cortex-SC      安全系列
        ARMV7:Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9
        ARMV8:Cortex-A53、Cortex-A73、Cortex-A78----ARMV8.2

ARM架构工作模式

在ARMV7之前,AARM的工作模式只有七种:

用户模式(user):用户程序的工作模式,运行在操作系统的用户态,不能操作其他硬件资源,只能执行处理自己的数据,也不能切换到其他模式,要切换到其他模式,只能产生中断或其他异常

系统模式(system):系统模式是特权模式,不受用户模式的限制。使用同一套寄存器。操作系统通过该模式使用户访问受限的资源

一般中断模式(IRQ): 用于处理一般的中断请求。一般在硬件产生中断信号后会自动进入该模式,是一种特权模式,可以自由访问系统硬件资源
快速中断模式(FIQ):用于处理时间要求比较紧急的中断请求。一般在高速数据传输及通道种
管理模式(spuer visor):一般CPU上电之后会自动进入该模式,该模式主要完成系统的初始化,软中断也会进入该模式。如果在用户模式下可以通过软中断进入该模式,请求访问硬件资源

未定义模式(undefined):未定义指令中止。CPU在指令的译码阶段不能识别该指令操作时,则会进入该模式

终止模式非法访问(abort):当用户非法访问内存,没有权限读写内存地址时,会进入该模式

在Cortex系列之后,有了第8种工作模式

安全模式(monitor):为了安全而扩展出来的用于执行安全监控代码的模式

只要产生对应的异常就可以切换到对应的模式种

 ARM寄存器

        寄存器:是一种特殊的存储器,在CPU内部,可以用来存储数据,但是存储的内容有一定作用,对于Cortex A 有40个寄存器,每个寄存器有32bit。对于寄存器是没有地址的,用编号表示。

对CPU内部的存储单元存在单位:

        word:字----32bit        halfword:半字---16bit        Byte:字节-----8bit

1、通用寄存器(如下图)

通用存储寄存器: R0-R12:存储各种数据
分组寄存器:R13、R14 还是FIQ:R8-R12        针对于FIQ
程序计数器(指令计数器/程序状态寄存器):R15(PC)

 特殊功能的寄存器:

R13(堆栈指针寄存器SP):存储栈的栈顶位置地址,与内存相关
R14(链接寄存器LR):当程序跳转、函数调用、产生异常
R15(程序计数器PC):当前执行的指令的下一条指令的地址

存储程序下一条要执行的指令地址,会自动由硬件修改,也可以由我们操作改变

ARM指令:大小为4个字节,所以指令偏移大小为4,指令地址也是4的整数倍,所以程序计数器最低2位无效(低2位表示的地址是0-3)
Thumb指令:大小为2个字节,所以程序计数器最低位无效

2、程序状态寄存器CPSR、SPSR

CPSR:程序状态寄存器,存储当前cpu执行程序时的工作状态,cpu在工作时只会有一个工作状态,所以所有的工作模式都是同一个CPSR所有的运行工作模式都可以访问到CPSR

SPSR:备份程序状态寄存器,当产生异常,切换对应的工作模式,SPSR用于保存当前的CPSR的值,然后改变CPSR(修改工作状态),异常结束时,回到之前的工作模式,就把SPSR的值恢复到CPSR。

看一个ARM处理能力怎么样,还关于它的指令流水线。

流水线:让CPU内部的多个功能部件并行工作来缩短程序的执行时间,提高处理器的效率,所以处理器架构设计时作为最重要的技术进行使用。

三级流水线:    1、取址    2、译码    3、执行

·        随着ARM架构的升级,流水线也在增加,但是ARM公司没有提供对应的技术,但是不管是几级流水线都可以按照三级流水线的操作方式来思考

    pc寄存器存储预取址指令的地址,即pc存储取指的地址

    对于流水线而言,当执行某些指令(跳转、中断、异常)打断当前流水线

异常        就是在cpu执行程序(指令),有可能会出现意外情况,需要去解决对应的意外情况。

1、异常源
        在ARM体系结构中设计了7种异常源,ARM架构就需要对这些异常源进行处理,只要执行程序指令时产生对应的异常就会执行对应的异常处理。
        只要发生对应的异常时,处理器就会把PC寄存器设置为特定的存储器地址。这个地址被放在称为向量表的范围内,向量表内就是一些跳转操作。即CPU设计了一个向量表来表示每一种异常的处理方式,只要产生异常,pc寄存器就会被设置为向量表中的对应异常的地址,执行异常向量表中的对应指令(跳转执行,执行对应的处理办法)
异常源:

Reset                上电就执行
undef                当流水线中某个非法指令被执行(undefined)
swi                    当程序执行软中断指令时(supervisor svc)
prefetch            当指令从内存进行存取指令失败时(abort)
data                  当指令从内存存取数据失败时(abort)
irq                     一般中断
fiq                     快速中断

2、异常产生时发生的硬件操作

1、保存执行状态
        把cpsr寄存器的内容复制到对应产生异常的模式下的spsr

2、模式切换
        a、由硬件自动把cpsr中的模式[4:0]设置为与异常相对应的值
        b、处理器设置为ARM状态,执行ARM指令
        c、禁止中断,如进入FIQ模式自动把IRQ中断禁止

3、保存返回地址
        把当前的下一条指令的地址(PC寄存器)保存到 lr_mode 寄存器(异常模式下)

4、跳入异常向量表
        强制设置pc寄存器为对应异常向量地址

3、异常向量表

        异常向量表是一段特定的内存空间,每一种ARM异常都在异常向量中设定出来,对应一个字长空间(4Byte-32bit),刚好就是一条ARM指令大小。当产生异常时,cpu会强制把pc的值设置为异常对应的固定内存地址.

注意:
        当产生异常后硬件能够完成的操作就只是跳转到异常向量表(pc赋值为异常向量地址),剩下的异常处理都是程序员去完成,通常都是在异常向量中写一条跳转指令,表示产生异常应该怎么做,跳转到对应的地址(异常处理的地址)执行,要实现异常向量表,完成每种异常的设定.

4、异常处理(自己实现)

1、保存执行现场(进入异常之前的寄存器的值)    
        把寄存器的值保存到对应异常模式下的栈(内存)(入栈),sp寄存器存栈地址

2、执行对应的异常操作

3、恢复之前现场
        当异常处理完,要返回异常之前的状态,继续执行
        a、恢复之前的寄存器数据(从sp对应的栈出栈存储到对应寄存器)
        b、恢复程序运行是的状态cpsr
        c、通过异常进入时保存的返回地址(lr寄存器),可以返回到被打断的程序继续执行

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啵啵520520

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

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

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

打赏作者

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

抵扣说明:

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

余额充值