【ARM】01.ARM体系架构

【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM

【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym

【嵌入式八股】三、硬件篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM

【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0

ARM体系架构

ARM

01.ARM产品线

alt

02.ARM体系结构

alt

03.ARM硬件系统组成和运行原理

alt

  • 直接在flash上执行较慢(NOR flash可以直接运行,NAND flash不行,按块访问),搬到内存运行,叫重定位

  • 控制器负责取值译码

  • ALU负责运算

  • 寄存器负责暂存数据

一条机器指令的执行过程,包含取指、译码、执行、访存、写回、更新pc操作。

1.取指

    取指,顾名思义,就是获取指令,就是从pc所指向的内存地址取出指令。pc是指程序计数器寄存器,专门用来存储当前执行指令的地址。

2.译码

    译码阶段是从指令中所指向的寄存器中读入最多的两个操作数valA  or  valB(其实就是访问寄存器,拿出操作数)。

3.执行

    执行阶段ALU(算术逻辑单元)根据我们输入的valA和valB,并且根据相应的指令执行相应的运算。

4.访存

    假如该条指令设计到了内存的操作,这个阶段就是写回或者读取内存。

5.写回

    更新相应的寄存器的值,和译码阶段是相反的两个操作。

6.更新pc

    根据这次指令长短,更新pc,计算下一条指令的地址是多少。
04.ARM有几种工作模式?

alt

记忆:用一快管系未终

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

  2. 系统模式(SYS) 系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。 说明:用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限,可以访问所有系统资源。

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

  4. 快速中断模式(FIQ) 快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。(快中断有许多(R8~R14)自己的专用寄存器,发生中断时,使用自己的寄存器就避免了保存和恢复某些寄存器。如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器)

  5. 管理模式(SVC) 管理模式是CPU上电后默认模式,因此,在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。说明:系统复位或开机、软中断时进入到SVC模式下。对应于内核层代码

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

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

alt

除了用户模式外,其它6种模式称为特权模式。所谓特权模式,即具有如下权利: a. MRS(把状态寄存器的内容放到通用寄存器); b. MSR(把通用寄存器的内容放到状态寄存器中)。 由于状态寄存器中的内容不能够改变,因此,要先把内容复制到通用寄存器中,然后修改通用寄存器中的内容,再把通用寄存器中的内容复制给状态寄存器中,即可完成“修改状态寄存器”的任务。

剩下的六种模式中除去系统模式外,统称为异常模式。

05.ARM指令集分为几类?

ARM指令集可以按照不同的方式进行分类,这里列举其中几种分类方法:

  1. 指令集架构(ISA):ARM指令集根据ISA不同可以分为ARMv6、ARMv7、ARMv8等。
  2. 指令集类型:ARM指令集可以分为以下几类:
    • 数据处理指令集:用于算术运算、逻辑运算、移位操作等,例如ADD、SUB、AND、ORR、LSL等指令。
    • 访存指令集:用于读写内存,例如LDR、STR等指令。
    • 分支指令集:用于实现程序的跳转和分支,例如B、BL等指令。
    • 特权指令集:用于操作系统或者其他特权级别的代码使用,例如MRS、MSR等指令。
  3. 指令集编码:ARM指令集的编码可以分为两种类型,一种是32位指令,另一种是16位指令(也称为Thumb指令集),其中16位指令可以进一步分为Thumb和Thumb-2指令集。
  4. 指令集功能:根据指令所实现的功能可以将ARM指令集分为很多类别,例如乘法指令集、浮点指令集、SIMD指令集等。
06.ARM处理器有哪些工作状态?ARM指令和Thumb指令有什么区别?

ARM处理器支持的处理器状态

ARM处理器共有ARM、Thumb/Thumb-2、调试三种状态。

ARM指令和Thumb指令是两种不同的指令集编码格式。ARM指令是32位的,可以支持更丰富的指令操作,提供更高的处理性能,但是指令编码相对较长。Thumb指令则是16位的指令编码,可以有效地减少指令存储空间和指令传输带宽,并且在移动设备上更加适用。Thumb指令集的指令数目比ARM指令集的指令数目要少,但是在处理器内部可以通过解码的方式实现与ARM指令集相同的功能。通常情况下,ARM指令集用于执行需要更高性能的任务,而Thumb指令集则用于执行存储空间和带宽要求更高的任务。

07.Arm有多少个寄存器?

Arm架构有多个不同的版本和变体,每个版本和变体都有不同的寄存器数量和类型。以下是一些常见寄存器数量:

ARM处理器共有37个寄存器。

(1) 1个状态寄存器cpsr (2) 5个异常模式下的cpsr状态寄存器的影子寄存器spsr (3)16个通用寄存器r0 ~ r15 (4)10个异常模式下的r13和r14的影子寄存器 (5) 5个FIQ模式下的r8 ~ r12的影子寄存器

程序计数器PC为R15、程序链接寄存器LR为R14、堆栈指针寄存器SP为R13

  • SP 堆栈指针。
  • LR ARM处理器相应异常时,或者函数调用时,会自动完成将当前的PC的值-4保存到LR寄存器,便于返回时回到原来的运行地址
  • PC 指向下一条要执行的指令。
  • CPSR 程序状态寄存器,记录当前程序的状态。
  • SPSR 状态切换时保存CPSR的值,便于返回时回到原来的状态
  • 带三角的是独有的影子寄存器,状态转换的时候原来的不用保存一直在,不带的都是各模式共用的寄存器。
  • FIQ多个影子寄存器是用空间换时间,处理更快。
08.PC和LR寄存器的别名

PC R15

LR R14

09.R13的别名

SP

10.哪种模式使用的寄存器最少

User模式,没有SPSR寄存器,因为User模式不需要状态备份

11.通用寄存器包括R0~R15,可以分为具体哪三类?

通用寄存器包括R0-R15,可以分为3类:

  1. 未分组寄存器R0-R7 在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。因此在中断或异常处理进行异常模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。
  2. 分组寄存器R8-R14 对于分组寄存器,他们每次所访问的物理寄存器都与当前的处理器运行模式相关。R13常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,但在Thumb指令集下,某些指令强制要求使用R13存放堆栈指针。R14称为链接寄存器(LR,Link Register),当执行子程序时,R14可得到R15(PC)的备份,执行完子程序后,又将R14的值复制回PC,即使用R14保存返回地址。
  3. 程序计数器PC(R15) 寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC。
12.什么是CPSR,SPSR?什么时候用到?

alt

CPSR是当前程序状态寄存器,存储的是当前程序的状态,比如上下文的⼀些寄存器内容,程序运行的话就要用到CPSR。SPSR为备份的程序状态寄存器,主要是中断发生时用来存储CPSR的值的。

13.CPSR哪位反映了处理器状态

T位

14.ARM在不同工作模式时使用的寄存器有所不同,但共同点是?

虽然在不同的工作模式下,ARM处理器使用的寄存器数量和用途可能会有所不同,但所有工作模式下都具有以下共同点:

  1. 通用寄存器:ARM处理器的所有工作模式都包括通用寄存器,用于存储数据和指针等。通用寄存器的数量和用途可能会因不同的处理器架构而有所不同,但它们都具有相似的命名规则(例如R0、R1、R2等)。
  2. 程序计数器:程序计数器是一个特殊的寄存器,用于存储下一条指令的地址。在所有工作模式下,ARM处理器都使用程序计数器来跟踪当前执行的指令。
  3. 程序状态寄存器(PSR):程序状态寄存器包含多个位,用于记录当前处理器的状态信息,例如条件码、中断状态等。不同的工作模式可能会使用不同的程序状态寄存器(例如CPSR和SPSR),但它们都具有类似的功能。
  4. 堆栈指针:堆栈指针是一个特殊的寄存器,用于存储当前堆栈的顶部地址。堆栈指针在所有工作模式下都是必需的,因为它用于存储函数调用和中断处理期间的局部变量和寄存器等。
15.任务切换的时候,寄存器怎么工作的

通过保存寄存器堆数据值和装载寄存器堆数据实现任务切换。保存寄存器堆数据称为保存现场 ,载入寄存器堆数据称为恢复现场。保存现场和恢复现场称为上下文切换

16.寄存器掉电会丢失数据吗?

寄存器是由触发器构成的,因此掉电会丢失数据。

17.ARM系统中,在函数调用的时候,参数是通过哪种方式传递的?
  1. 寄存器传递:一些参数可以直接传递到寄存器中。例如,在ARMv7-A架构中,前四个整数参数可以直接存储在寄存器R0-R3中,而其他参数则需要存储在堆栈上。
  2. 堆栈传递:如果参数数量超过了可以直接存储在寄存器中的数量(参数大于4的时候),那么额外的参数就需要存储在堆栈上。在ARM系统中,堆栈是从高地址向低地址生长的,因此函数参数在堆栈中是按照相反的顺序进行存储的。
  3. 静态传递:一些参数可以通过静态分配进行传递。例如,在编写汇编代码时,可以将参数作为程序数据存储在内存中,并将参数的地址作为指针传递给函数。
18.ARM协处理器指令包括哪3类,请描述它们的功能。
  1. 数据处理指令:协处理器0通常用于执行数据处理指令,这些指令可以在协处理器中进行高速处理,而不必通过主处理器执行。这些指令的功能包括算术运算、逻辑运算、位移操作和数据转移等。数据处理指令可以大大提高系统的性能,特别是在需要执行大量数据处理操作的应用中。
  2. 系统控制指令:协处理器15通常用于执行系统控制指令,这些指令可以用于控制系统的状态和行为,例如启动或停止缓存、控制中断等。这些指令通常需要特权级别权限才能执行,并且只能由操作系统或特权级别代码使用。
  3. 浮点指令:协处理器10和11通常用于执行浮点指令,这些指令可以在协处理器中进行高速浮点运算。浮点指令通常用于科学计算、图像处理、音频处理等需要高精度计算的应用中。
19.单核和多核并发有什么区别?

单核并发是指在只有一个处理器核心的系统中,通过时间片轮转、中断处理等技术,使得多个任务可以交替执行,从而实现并发。在单核并发中,多个任务实际上是在同一个处理器核心上交替运行,每个任务只能使用处理器核心的一部分资源。这种并发方式具有实现简单、调度开销小等优点,但是在大规模并发任务的情况下,由于处理器核心的资源瓶颈,性能可能会受到限制。

多核并发是指在多核处理器系统中,多个任务可以同时在不同的处理器核心上执行,从而实现更高的并发度和更高的性能。在多核并发中,多个任务可以使用不同的处理器核心资源,从而避免了单核并发中的性能瓶颈问题。但是,在多核并发中,任务间的通信和同步问题可能会更加复杂,需要特殊的并发编程技术和算法来解决。

20.列出ARM的寄存器、MSP与 PSP、FP寄存器是什么

ARM架构中常见的寄存器包括:

  1. 通用寄存器:ARM架构有16个32位通用寄存器,分别用R0-R15表示。这些寄存器用于存储通用数据和地址。R13(SP)和R14(LR)有特殊用途。
  2. 程序计数器寄存器:ARM架构有一个程序计数器寄存器PC,它用于存储下一条指令的地址。
  3. 状态寄存器:ARM架构有一个状态寄存器CPSR(Current Program Status Register),它包含处理器状态的各种标志和状态信息。
  4. 协处理器寄存器:ARM架构还支持多个协处理器寄存器,用于执行特定的任务,如浮点运算、内存管理等。不同的协处理器寄存器有不同的用途,例如协处理器10和11用于浮点运算,协处理器13用于处理MMU和Cache等。
  5. MSP和PSP寄存器:MSP(Main Stack Pointer)和PSP(Process Stack Pointer)是ARM Cortex-M架构中的两个特殊寄存器,在逻辑地址上他们都是R13,用于管理堆栈。MSP用于存储系统级别的堆栈,而PSP用于存储进程级别的堆栈。PSP主要是在Handler的模式下使用,MSP主要在线程模式下使用;这意味着同一个逻辑地址,实际上有两个物理寄存器,一个为MSP,一个为PSP,在不同的工作模式调用不同的物理寄存器。
  6. FP寄存器:FP寄存器是ARM架构中的浮点寄存器。ARMv7-A架构支持16个32位的浮点寄存器,标号为S0-S15。而ARMv8-A架构支持32个32位的浮点寄存器,标号为S0-S31。FP寄存器主要用于存储浮点数和执行浮点运算。
21.外部总线和内部总线区别

外部总线和内部总线是计算机系统中两种不同的总线结构,它们的主要区别在于它们所连接的设备和组件不同。

外部总线是计算机系统和外部设备(如打印机、键盘、鼠标、硬盘等)之间的通信通道,用于传输数据和控制信息。外部总线一般是相对较慢的,其数据传输速度受限于设备的传输速度和总线带宽,一般是以字节为单位进行数据传输。

内部总线是计算机内部各组件之间的通信通道,包括CPU、内存、缓存、I/O控制器等,用于传输数据和控制信息。内部总线速度一般比外部总线快得多,其数据传输速度主要取决于总线的带宽和时钟频率,一般是以字或字节块为单位进行数据传输。

另外,外部总线和内部总线还有以下几点区别:

  1. 连接的设备不同:外部总线连接的是外部设备,例如打印机、鼠标等;而内部总线连接的是计算机内部的各种设备和组件,例如CPU、内存、缓存、I/O控制器等。
  2. 总线带宽不同:外部总线的带宽比内部总线小得多,因为外部设备的传输速度相对较慢,一般是以字节为单位进行数据传输;而内部总线的带宽比较大,因为内部设备的传输速度较快,一般是以字或字节块为单位进行数据传输。
  3. 总线速度不同:外部总线的速度比内部总线慢,因为外部设备的传输速度较慢;而内部总线的速度比较快,因为内部设备的传输速度较快。
  4. 控制方式不同:外部总线通常采用I/O端口映射方式控制外设,而内部总线采用DMA(直接存储器访问)方式和中断方式控制设备和组件。
22.ARM内部传输数据的总线有哪些?

ARM处理器内部主要有以下几种总线:

  1. 数据总线(Data bus):数据总线用于在CPU、寄存器、存储器等内部组件之间传输数据。在32位ARM处理器中,数据总线宽度为32位,因此能够传输32位数据。
  2. 地址总线(Address bus):地址总线用于指示内存中的特定位置。在32位ARM处理器中,地址总线宽度为32位,能够寻址4GB的内存空间。
  3. 控制总线(Control bus):控制总线用于传输控制信号,包括读写信号、片选信号、时序信号等,用于控制内部组件的操作。控制总线不是单独的总线,而是由多条信号线组成的。
  4. 中断总线(Interrupt bus):中断总线用于在不同的内部组件之间传输中断请求和中断响应信号,以实现中断处理功能。
23.ARM CPU上的地址转换涉及哪三个概念?

(1)虚拟地址(VA):CPU内核对外发出VA。

(2)变换后的虚拟地址(MVA, Modified Virtual Address):VA被变换为MVA供cache和MMU使用,由硬件自动完成。如果VA < 32M,则需要使用PID来转换为MVA(VA | (PID << 25)),目的是当两个进程的虚拟地址空间有重叠时,把重叠的VA映射到不同的PA上去,减少切换进程的代价。

(3)物理地址(PA):最后使用PA读写实际设备。

24.ARM-linux启动分几部分,简述流程:
  1. BootROM阶段:当开机时,处理器首先运行BootROM代码,它是硬件固件中的一部分,负责初始化硬件和加载第一级启动程序(First-stage Bootloader)到RAM中。这个阶段的目的是初始化处理器,并设置好相关的寄存器,以便能够顺利地启动操作系统。
  2. 第一级启动程序(First-stage Bootloader)阶段:第一级启动程序(如u-boot SPL等)是在BootROM之后运行的,它负责识别和初始化系统硬件,并加载第二级启动程序(Second-stage Bootloader)到RAM中。
  3. 第二级启动程序(Second-stage Bootloader)阶段:第二级启动程序(如u-boot等)是在第一级启动程序之后运行的,它负责完成对内核的加载和启动。在这个阶段中,启动程序会从存储介质(如SD卡、NAND闪存等)中读取内核镜像,并将其加载到内存中,然后执行内核启动命令,将控制权交给内核。
  4. 内核启动阶段:内核启动后,它负责完成系统初始化,包括初始化硬件、挂载根文件系统等。在这个阶段中,内核会先检测并初始化硬件设备(如串口、网卡等),然后会挂载根文件系统并启动init进程,进而启动用户空间的应用程序。
25.ARM的多发射和乱序:

ARM多发射(Out-of-order execution)和乱序执行(Out-of-order execution)是现代处理器中常见的两个技术,用于提高指令执行效率和性能。

  1. 多发射(Multiple-Issue):多发射是一种处理器技术,它允许同时从指令流中取出和执行多条指令。传统的顺序处理器每个时钟周期只能执行一条指令,而多发射处理器可以在一个时钟周期内同时执行多条指令,从而提高了指令级并行性和整体性能。ARM多发射处理器能够同时发射多个指令,并利用多个执行单元并行执行这些指令。

  2. 乱序执行(Out-of-order execution):乱序执行是一种处理器技术,它允许指令以乱序的方式进入执行阶段,而不是按照它们在程序中的顺序执行。这样可以有效地隐藏指令执行中的等待时间,提高指令级并行性和性能。ARM乱序执行处理器通过对指令进行动态调度和重排序,以充分利用处理器中的资源,并通过解决数据相关性和控制相关性等问题来提高执行效率。

综合起来,ARM多发射和乱序执行是处理器中的两个关键技术,旨在提高指令级并行性和执行效率。多发射技术允许同时发射多条指令,利用多个执行单元并行执行指令。乱序执行技术则通过动态调度和重排序指令,以最大程度地利用处理器资源,并提高指令执行效率。这些技术的结合可以显著提高处理器性能,提供更好的计算能力和响应时间。

26.ARMv8架构的三大创新:

【移知公开课】ARMv8架构解析主题讲座_哔哩哔哩_bilibili

alt

三大创新

  • 执行状态,异常级别,安全模式

执行状态

AArch64 和 AArch32 两种可切换

AArch64: 新增A64(ARM 64bit)指令集 -> 大内存(突破4G限制)

AArch32: 可用以前A32(ARM 32bit)指令集和 T32(Thumb 32bit)指令集 -> 向前兼容

异常级别

EL0(应用) < EL1(OS) < EL2(虚拟化) < EL3(安全固件) -> 替代啰嗦的工作模式

安全模式

分为正常世界 和 安全世界 -> 真正的安全(物理隔离,如支付场景)

总结

alt

#C++##嵌入式##八股##笔试##校招#
【嵌入式八股】三、硬件篇 文章被收录于专栏

查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇【本专栏】 4.嵌入式Linux (建议PC端查看)

全部评论

相关推荐

vivo 架构研究工程师 总包N+10
点赞 评论 收藏
转发
1 5 评论
分享
牛客网
牛客企业服务