ARM基础知识汇总
一.相关概念
1.机器码:计算机可以识别的0或者1的组合,计算机只认识高低电平(1代表高电平 0代表低电平)
2.汇编指令:编译器可以将汇编指令生成一个32位的机器码,执行机器码可以完成特定的功能
3.汇编指令集:很多条具有不同功能的汇编指令的集合
4.ARM架构:ARM公司根据不同的ARM汇编指令集对其进行的版本的命名
? ARM-v1 ~ARM-v6架构 目前已经被淘汰
? ARM-v7架构:32位的架构,支持ARM-32位的汇编指令集
? ARM-v8架构:64位的架构,支持ARM-64位的汇编指令集,向下兼容ARM-v7架构
5.ARM内核:ARM公司根据不同的ARM架构设计的不同需求的ARM内核
? 部分ARM内核:
?
6.处理器:ARM公司不生产芯片,只将内核授权给第三方的芯片厂家,厂家基于ARM内核,添加外设资源从而设计出不同ARM内核的处理
7.CPU:(central processing unit)中央处理单元
8.SOC:(System On chip)片上系统 如果一个芯片使用内核外加很多外设封装到一个芯片之上,这样的处理器统称为SOC
9.MPU:(Micro processor Unit)微处理单元, 可以运行操作系统(比如linux系统,HarmonyOS) 也可以叫CPU,SOC
10.MCU:(Micro Control Unit) 微控制单元 运行的裸机程序,一般指单片机
二.ARM公司产品分布
2.1 Cortex-A/Cortex-X系列
高端的系列,可以运行操作系统,比如Android系统,鸿蒙OS, linux系统,
主要应用于高端的电子产品,价格一般比较昂贵。
2.2 Cortex-R系列
主要针对于对实时性要求比较高的场合,使用频率不高
2.3 Cortex-M系列
主要用于低端的电子产品,成本一般比较低,
cortex-M系列的处理器主要运行的裸机程序,M系列属于单片机,
cortex-M系列的处理器也可以运行实时性的操作系统,比如FreeRTOS LiteOS uCos-II RT-thread
三.RISC和CISC
3.1 RISC
RISC (Reduced Instruction Set Computer):精简指令集
? 精简指令集是在复杂指令集中选取一些相对比较简单,使用频率较高的指令作为精简指令。
? 精简指令集的指令的周期和指令的宽度是固定的。
指令周期:执行1条指令所需要的时间,RISC大多数属于单周期的指令
? CPU的主频(F) = 1 / T(周期)
指令宽度:指令被编译生成机器码所占用的内存空间是固定的
ARM-v7.V8.V9架构汇编指令编译生成的机器码占32bit位(4字节)的内存空间。
arm-linux-gnueabihf-gcc -marm hello.c -o hello
# arm-linux-gnueabihf-gcc:交叉编译器,将源文件编译生成ARM架构的可执行程序
arm-linux-gnueabihf-objdump -D hello > hello.dis
# arm-linux-gnueabihf-objdump:交叉编译器中的反汇编的命令,将可执行程序(.elf)反汇编生成反汇编文件(.dis)
241 000103d0 <main>:
内存地址 机器码 反汇编代码(由机器码反汇编得到汇编代码)
242 103d0: e92d4800 push {fp, lr}
243 103d4: e28db004 add fp, sp, #4
244 103d8: e24dd008 sub sp, sp, #8
245 103dc: e50b0008 str r0, [fp, #-8]
246 103e0: e50b100c str r1, [fp, #-12]
247 103e4: e300044c movw r0, #1100 ; 0x44c
248 103e8: e3400001 movt r0, #1
249 103ec: ebffffbb bl 102e0 <puts@plt>
250 103f0: e3a03000 mov r3, #0
251 103f4: e1a00003 mov r0, r3
252 103f8: e24bd004 sub sp, fp, #4
253 103fc: e8bd8800 pop {fp, pc}
# 全部都占4字节 指令的宽度确定
3.2 CISC
CISC(Complex Instruction Set Computing) :复杂指令集
复杂指令集更加注重指令的功能性,指令的周期和指令的宽度不固定。
复杂指令集主要应用在电脑CPU上,intel AMD
gcc hello.c -o hello
linux@ubuntu:~/DC22061$ objdump -D hello > hello.dis
# objdump : 反汇编的命令,将可执行程序(.elf)反汇编生成反汇编文件(.dis)
418 0000000000001149 <main>:
内存地址 机器码 反汇编代码(由机器码反汇编得到汇编代码)
419 1149: f3 0f 1e fa endbr64
420 114d: 55 push %rbp
421 114e: 48 89 e5 mov %rsp,%rbp
422 1151: 48 83 ec 10 sub $0x10,%rsp
423 1155: 89 7d fc mov %edi,-0x4(%rbp)
424 1158: 48 89 75 f0 mov %rsi,-0x10(%rbp)
425 115c: 48 8d 3d a1 0e 00 00 lea 0xea1(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
426 1163: e8 e8 fe ff ff callq 1050 <puts@plt>
427 1168: b8 00 00 00 00 mov $0x0,%eax
428 116d: c9 leaveq
429 116e: c3 retq
430 116f: 90 nop
# 有的占1字节 有的占4字节 指令的宽度不确定
四.ARM处理器的数据类型
4.1 ARM-v7 架构数据类型
? 字节 Byte 8 bits (1字节)
? 半字 Half Word 16 bits(2字节)
? 字 Word 32 bits(4字节)
? 双字 Double Word 64 bits (8字节)
4.2 ARM-v8 架构数据类型
? 字节 Byte 8 bits (1字节)
? 半字 Half Word 16 bits(2字节)
? 字 Word 32 bits(4字节)
? 双字 Double Word 64 bits (8字节)
? 四字 Quad Word 128 bits (16字节)
4.3 ARM-v7架构与ARM-v8架构的区别
? 不同点1:
ARM-v7架构属于32位架构,支持的是32位的ARM指令集;
ARM-v8架构属于64位架构,支持的是64位的ARM指令集;向下兼容ARM-v7架构。
? 不同点2:
32位的ARM指令集,执行一条指令最多可以完成32位以内的数据的运算;
eg: add r0 , r0, r1 // r0 = r0 + r1
// r0和R1是一个32位寄存器,一个寄存器最大可以存储32位的数据。
// 执行1条指令就可以完成32位以内的数据的运算,需要一个时钟周期
// 如果向要完成64位数据的运算,需要使用两条指令分别完成低32位 // 和高32位的运算
64位的ARM指令集,执行一条指令最多可以完成64位以内的数据的运算;
eg: add x0 , x0, x1 // x0 = x0 + x1
// x0和x1是一个64位寄存器,一个寄存器最大可以存储64位的数据。
// 执行1条指令就可以完成64位以内的数据的运算,需要一个时钟周期
// 如果向要完成64位数据的运算,需要1条指令就可以完成。
所以支持64位指令集的设备运行速度要快于32位指令集的设备
不同点3:
32位系统的寻址空间为0-4G(0-2^32)
64为系统的寻址空间为0-非常大(0-2^64)
相同点:
32位指令集和64位指令集编译生成机器码都只占4字节的代码段的空间。
add r0, r0, r1 ---> 占用4字节的空间
add x0, x0, x1 ---> 占用4字节的空间
五、ARM处理器的工作模式
5.1 Cortex-A核处理器的工作模式
Monitor Mode(安全监控模式)----> 运行的安全相关的代码
PHY_Mode ----> 对虚拟化技术支持的代码
ARM处理器具有多种工作模式,在不同的工作模式下执行不同的代码,完成特定的功能。
比如在中断的异常模式下,执行的是中断处理的相关的代码。
5.2 Cortex-M核处理器的工作模式
Cortex-M核只有两种工作模式:
线程模式---> 主要运行的主程序(用户的程序)
异常模式---> 主要运行的异常处理程序(比如:按键中断处理程序,定时器中断处理程序.....)
六.ARM寄存器组织)
6.1 芯片的内部结构图
6.2 ARM寄存器组织图
1. 每个小方块表示一个寄存器,每个寄存器的大小是4字节,总共127字节(43 * 4);
2.寄存器是没有地址的,访问寄存器只能通过寄存器的编号进行访问,即R0-R15, CPSR, SPSR;
3.每种工作模式只能访问自己模式下的对应的寄存器,不可以访问其他模式下的寄存器
user和sys模式最多可以访问17个寄存器;
fiq,irq,svc,undef,monitor,abort模式最多访问18个寄存器;
hyp模式最多访问19个寄存器;
4.banked类型的寄存器表示私有的寄存器,私有的寄存器只能被自己所属的模式访问,其他模式不可以访问。
非banked类型的寄存器表示公有的寄存器,
5.如果某种工作模式下具有私有的寄存器,则不可以访问公有的寄存器,只能访问自己私有的寄存器
如果某种工作模式下没有私有的寄存器,才可以访问公有的寄存器。
比如在FIQ模式下,R8--R14只能访问FIQ下的寄存器,R0--R7可以访问User下的寄存器
6. 用户模式用系统模式共用一套寄存器组织;
7. ARM-v7架构的处理器总共有43个寄存器
7.特殊的寄存器
7.1 R13寄存器
? R13 --别名–> SP : the stack Pointer(栈指针寄存器) ? ? 栈指针寄存器的作用:栈指针寄存器中保存的是栈空间的地址。
? 用于压栈保存现场,也拥有先进后出的特点。
7.2 R14寄存器
? R14 --别名–> LR : the Linking Register (链接寄存器)
? 链接寄存器中保存的是程序的返回地址。
7.3 R15寄存器
R15 --别名–> PC : the Program Counter (程序计数寄存器)
程序计数寄存器中存放的是当前取指指令的地址,当完成指令的取指之后,PC自动加4指向下一条指令。
7.4 CPSR寄存器
CPSR : Current Program Statued Register (当前程序状态寄存器)
CPSR寄存器中保存的是当前程序的运行状态寄存器,比如处理器的当前的工作模式。
7.5 SPSR寄存器
SPSR : Saved Program Statues Register (保存程序状态寄存器)
SPSR寄存器的作用主要用来对CPSR寄存器进行备份。
八.指令流水线
ARM指令为了提高指令的执行的效率,指令采用流水线的方式执行
三级流水线
取指器:取指器根据PC寄存器中的值从内存的代码块,完成指令的取指操作,并给到译码器
译码器:翻译指令对应的功能,根据指令的功能,给到不同的执行器;
执行器:执行指令,并将指令的执行结果写回到寄存器中。
CPSR寄存器中保存的是当前程序的运行状态寄存器,比如处理器的当前的工作模式。
7.5 SPSR寄存器
SPSR : Saved Program Statues Register (保存程序状态寄存器)
SPSR寄存器的作用主要用来对CPSR寄存器进行备份。
八.指令流水线
ARM指令为了提高指令的执行的效率,指令采用流水线的方式执行
三级流水线
取指器:取指器根据PC寄存器中的值从内存的代码块,完成指令的取指操作,并给到译码器
译码器:翻译指令对应的功能,根据指令的功能,给到不同的执行器;
执行器:执行指令,并将指令的执行结果写回到寄存器中。
|