1. arm 的体系结构版本.
v1-v5. v1-v4都旧了,不管它了,现在是v5 第5代。
ARM, EABI5 version 1
2. arm 处理器核。
arm7, arm9, arm10, arm11
还有strongarm xscale 等。
很多厂商用arm技术开发自己的cpu.
3. arm 寄存器
r0-r15 , 16 个寄存器
r0-r7 是通用寄存器。
r13 是堆栈指针(sp)
r14 是链接寄存器(lr)
调用返回寄存器。
常用的使用方式: mov pc, lr
bx lr
stmfd sp!, {<register>,lr}
ldmfd sp!, {<register>,pc}
r15 是程序地址寄存器(pc)
程序状态寄存器(CPSR) 还有SPSR
本来16位对于指令编码是足够的,但如果要包含32位地址,32位数据,就要分开进行,必需有所限制。
就算是用32位指令系统,也要对32位数据进行限制, 看看,精简指令相比复杂指令碰到了点问题了吧。
搞出两套指令系统来, 还是觉得复杂了点,应该消灭一个,咱不担心,反正有编译器呢, 它说是谁就是谁吧。
很简单,thumb指令16位, arm指令32位。
具体的指令系统,用着再说吧。
所有的cpu指令系统就那么几类指令, 一种叫数据访问,就是把数据如何加载到寄存器中。 侧重于内存数据访问。
第二类是数据运算, 以寄存器运算为主, 也可以直接或间接操作内存数据(内存数据访问的概念)
第三类是流程控制。 通常都是顺序执行的,但也会发生跳转或条件跳转, 调用和条件调用。
9指神丐洪七公只用了18招就誉满江湖, 讲得就是熟练。cpu 只是操作寄存器,内存就可以步行天下了。
4. 下面这些名称eabi 到底是什么意思?
arm-none-linux-gnueabi
arm-linux-gnueabi
arm-linux-gnueabihf
arm-linux-androideabi
先说说这个abi, 学名: application binary interface 应用二进制接口。
这是个什么意思呢?
原来应用程序,总是要调用别人的代码才能干点事,就算你什么也不干,c代码
也得调用c框架。我们知道,c 程序入口不是main, 而是_start, 从_start 到main
还有一个过程,有crt1.o, crti.o crtn.o 等。 总之,这些接口叫abi.
就是你这个小小的草民应用怎样跟系统官僚打交道的途径。
帮助理解:
同一个版本的gcc, 编出的代码是可以互相调用的, 不同版本的gcc,编出的代码还能互相调用吗?
就是说, 我有一个库,用旧版本gcc 编译的, 用新版本gcc 编程序,还能调用那个库函数吗?
答: 能, 因为api 相同,就是说二进制接口相同.
函数参数的传递方式, 入栈,清栈规则是一致的,所以可以调用.
当然,如果你的程序调用只有新库有旧库没有的接口, 连旧库肯定就连不上了.!
解释:
交叉编译工具链的命名规则为:arch [-vendor] [-os] [-eabi]
arch: arm, mips , x86等
vendor: 提供商, 没有为none
os: 目标操作系统
eabi: 嵌入式二进制接口。就是跟别人连接的方式。不同abi有不同支持函数吧?!
默认gnu.
举例:
a. arm-none-eabi-gcc.
这个gcc 可以编译裸机系统,包括boot,kernel, 但可能不支持操作系统函数.
类似于fork 调用之类恐怕不支持。c 库功能有限,应用开发不便。
b. arm-none-linux-gnueabi-gcc
用这个编写应用程序,可以调用linux的系统库函数。
c. eabihf, hf->hard float 支持硬浮点数, 实际上是改变了gcc 默认的浮点数选项。
d. androideabi: 肯定是android 平台上的程序了,
androideabi 与 gnueabi 的差别.
我们平常用用的是gnueabi, androideabi 又另起炉灶了。真是吃饱了撑的。
这一套crt库跟gnu的不兼容了,用androideabi 编的so, 不能连接到gnueabi 上,
名称都对不上号。不过现实就是这样,军阀混战,我们只能接受现实。