文章目录
- 1.ARM架构学习
- 1.1.ARM相关背景介绍
- 2.ARM指令集
- 2.1 A32指令集
- 2.2 A64指令集
- 2.3 代码举例说明
- 3.ARM与RISC、CISC的关系
- 4.ARM与哈佛结构、冯诺依曼结构
1.ARM架构学习
ARM即是公司名,是一家英国的公司,也是芯片名,随便嵌入式设备的发展,ARM也随之急速发展;
如何去学习ARM,作为一名合格的嵌入式er,无论是从事:
内核工程师;驱动工程师;应用工程师,都很有必要了解ARM的架构原理,掌握了ARM相关的知识再去学习UBOOT、kernel、驱动以及分析应用层的调用栈等问题才会有所突破。
1.1.ARM相关背景介绍
经常听到某芯片基于ARM核开发出来的芯片,具备什么什么功能;
如:
华为的麒麟980基于ARM-A76内核,而A76内核基于ARMV8-A架构。
NXP的ls1043a芯片基于ARMA53内核,而A53内核基于ARMV8-A架构等等。
根据ARM指令集所开发出来的内核,供给其他第三方厂商授权使用,常见的有A53 、A76内核等等。
常见的指令集A32 T32 A64 thumb指令集,每一个架构架构的升级,往往伴随着指令集的升级,从ARMV1-ARMV9都是这样,最典型的就是ARMV8架构的出现,实现了指令集A64,从此ARM可以支持64为指令集。
2.ARM指令集
ARM指令集有以下几种:A32 T32 A64 Neon SVE DSP Helium,在此主要说明A32与A64指令集。两者主要的区别就是A64支持64为指令集。
2.1 A32指令集
在ARMV8结构中称为A32,其实就是之前的ARM指令集,其使用的寄存器为r0-r15。
2.2 A64指令集
此指令集为ARMV8中最新引入的,为ARM架构中升级较大的一代,其使用的寄存器为x0-x30。
2.3 代码举例说明
使用同一套简单源码,利用不同的编译链进行编译,再使用objdump工具进行反汇编,在此对比下两者的区别。
#include<stdio.h>int add(int a,int b)
{return a+b;
}int main()
{int sum = add(1,2);printf("sum = %d\n",sum);return 0;
}
A32指令集,使用ARM32进行编译,对应的汇编代码:
00010444 <add>:10444: e52db004 push {fp} ; (str fp, [sp, #-4]!)10448: e28db000 add fp, sp, #01044c: e24dd00c sub sp, sp, #1210450: e50b0008 str r0, [fp, #-8]10454: e50b100c str r1, [fp, #-12]10458: e51b2008 ldr r2, [fp, #-8]1045c: e51b300c ldr r3, [fp, #-12]10460: e0823003 add r3, r2, r310464: e1a00003 mov r0, r310468: e28bd000 add sp, fp, #01046c: e8bd0800 ldmfd sp!, {fp}10470: e12fff1e bx lr00010474 <main>:10474: e92d4800 push {fp, lr}10478: e28db004 add fp, sp, #41047c: e24dd008 sub sp, sp, #810480: e3a00001 mov r0, #110484: e3a01002 mov r1, #210488: ebffffed bl 10444 <add>1048c: e50b0008 str r0, [fp, #-8]10490: e59f0014 ldr r0, [pc, #20] ; 104ac <main+0x38>10494: e51b1008 ldr r1, [fp, #-8]10498: ebffff90 bl 102e0 <printf@plt>1049c: e3a03000 mov r3, #0104a0: e1a00003 mov r0, r3104a4: e24bd004 sub sp, fp, #4104a8: e8bd8800 pop {fp, pc}104ac: 00010520 .word 0x00010520
A64指令集,使用ARM64进行编译,对应的汇编代码:
00000000004005c4 <add>:4005c4: d10043ff sub sp, sp, #0x104005c8: b9000fe0 str w0, [sp, #12]4005cc: b9000be1 str w1, [sp, #8]4005d0: b9400fe1 ldr w1, [sp, #12]4005d4: b9400be0 ldr w0, [sp, #8]4005d8: 0b000020 add w0, w1, w04005dc: 910043ff add sp, sp, #0x104005e0: d65f03c0 ret00000000004005e4 <main>:4005e4: a9be7bfd stp x29, x30, [sp, #-32]!4005e8: 910003fd mov x29, sp4005ec: 52800041 mov w1, #0x2 // #24005f0: 52800020 mov w0, #0x1 // #14005f4: 97fffff4 bl 4005c4 <add>4005f8: b9001fe0 str w0, [sp, #28]4005fc: b9401fe1 ldr w1, [sp, #28]400600: 90000000 adrp x0, 400000 <__abi_tag-0x254>400604: 91192000 add x0, x0, #0x648400608: 97ffffaa bl 4004b0 <printf@plt>40060c: 52800000 mov w0, #0x0 // #0400610: a8c27bfd ldp x29, x30, [sp], #32400614: d65f03c0 ret
3.ARM与RISC、CISC的关系
ARM是典型的RISC(精简指令集)代表;相对应的X86是CISC(复杂指令集)代表;这两句话也是相对的,目前指令集的发展已经有相互学习,取长补短的趋势。
4.ARM与哈佛结构、冯诺依曼结构
CPU最核心的三部分由控制器、存储器、运算器组成;
冯诺依曼架构的特点:指令与数据采用同一条总线进行连接。
哈佛结构的特点:采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,
这就允许同时取指和取操作数,从而大大提高了运算能力
两者主要的区别就是哈佛架构认为指令与数据应该是分开的,而冯诺依曼提出,指令也是数据,这就诞生出了两大典型架构。
其实现在的CPU往往采用混合架构来进行设计,即结合了两种架构的各自的特点;
而目前大部分的ARM-A内核也是采用了混合架构。