交叉编译
交叉编译是在一个平台上生成另一个平台上的可执行代码,例如在x86 Windows上开发,运行在x86 Linux系统上,或者在x86 Linux上开发,运行在ARM Linux上。
工具链分类
从授权上,分为付费授权版和免费授权版,免费授权版目前有三大主流供应商提供
1、GNU(提供源码,自行编译制作)
2、Codesourcery
3、Linora (提供源码,和已经编译好的release binrary)
除了这三大主流供应商外,嵌入式板厂家也会提供自己的工具链,例如FriendlyARM、天嵌等。现在ARM平台上用的最广泛的工具链是Linaro发布的,所以就简单介绍下。
gcc 8之前的版本可以在linaro官网下载,gcc 8以后的版本只能在ARM官网下载,无论打开哪个网站,密密麻麻的那么多链接,不知道该如何选择,下面我来介绍下工具链的命名规则。
工具链名称 | 适用范围 | 功能说明 | |
---|---|---|---|
1 | arm-linux-gnueabihf arm-none-linux-gnueabihf | 32-bit Armv7 Cortex-A, hard-float, little-endian | 编译ARM架构的boot、kernel、Application等 |
2 | armv8l-linux-gnueabihf | 32-bit Armv8 Cortex-A, hard-float, little-endian | |
3 | aarch64-linux-gnu aarch64-none-linux-gnu | 64-bit Armv8 Cortex-A, little-endian | |
4 | arm-eabi arm-none-eabi | 32-bit Armv7 Cortex-A, soft-float, little-endian Cortex-R Cortex-M | 编译ARM架构的裸机系统(包括boot、kernel, 不适用编译Application) |
5 | aarch64-elf aarch64-none-elf | 64-bit Armv8 Cortex-A, little-endian |
这里对命名规则有个大致的概念,aarch64-linux-gnu是gcc 8之前版本的命名,aarch64-none-linux-gnu是gcc 8之后的命名,aarch64是针对64位的芯片,例如Cortex-A76。表格中还提到了Armv7和Armv8,这里指的是ARM芯片的架构,其中Armv8是2011年11月份推出来的,是目前最新的架构,接下来我们顺便介绍下ARM家族。
ARM公司简介
ARM公司在1991年成立于英国剑桥,主要出售芯片设计技术的授权。2016年7月被日本软银以约320亿美元收购,2020年9月份被美国英伟达公司收购(目前交易是否通过还不确定)。ARM公司只出售芯片技术的授权,不生产和销售芯片。华为、苹果、高通是它的客户,华为等厂商通过ARM的架构授权,设计芯片,然后交给台积电等制造商生产。举个例子,华为麒麟990芯片,是基于ARM Cortex-A76开发的,高通骁龙865是基于ARM Cortex-A77开发的,苹果的A14芯片虽然是自研的,未使用ARM公版的架构,但是仍然绕不开ARM,依然需要交专利费。
ARM芯片种类
ARM发展近30年,目前最新的架构是ARMv9。ARM为低功耗而生,过去30年,基于RISC指令集的ARM芯片在各个领域获得广泛的成功。尤其是移动设备领域,占据了95%的市场份额。但是ARM的野心不止于此,ARM芯片也已经悄悄渗透到PC领域和服务器领域,这些领域一直是Intel的天下。为了更精准的响应市场的需求,从ARMv7开始,ARM将其架构分为三个品类,分别是:
说明 | 体系架构 | 家族 | |
---|---|---|---|
Cortex A系列 | 针对Application,适用于追求高性能的场景,比如移动领域(手机)或者企业领域(服务器) | Armv7-A | Cortex-A5、Cortex-A7、Cortex-A9、Cortex-A15、Cortex-A17 |
Armv8-A | Cortex-A32、Cortex-A34、Cortex-A35、Cortex-A53、Cortex-A55、Cortex-A57、Cortex-A65、Cortex-A65AE、Cortex-A72、Cortex-A73、Cortex-A75、Cortex-A76 | ||
Armv9-A | |||
Cortex R系列 | 针对Real-time,适用于车用以及工业控制领域 | Cortex-R4、Cortex-R5、Cortex-R7、 Cortex-R8、Cortex-R52 | |
Cortex M系列 | 针对Microcontroller,适用于微控制器领取 | Armv6-M | Cortex-M0、Cortex-M0+、Cortex-M1 |
Armv7-M | Cortex-M3、Cortex-M4、Cortex-M7 | ||
Armv8-M | Cortex-M23 、Cortex-M33、Cortex-M35P | ||
Armv8.1-M | Cortex-M55 |
AArch32和AArch64
ARMv7架构是32位的,一经问世,就大受欢迎。随着科技的进步,32位已经不能满足市场的需求了。2011年11月,ARM公司发布了新一代处理器架构ARMv8的部分技术细节,这是ARM公司的首款支持64位指令集的处理器架构。由于基于32位ARMv7架构的Cortex系列大受欢迎,因此新架构(指ARMv8)不能推倒重来另起炉灶,必须兼容ARMv7架构中的主要特性。为了兼容32位程序,新架构将运行状态分成AArch64和AArch32两种状态。AArch64就是64位指令集的运行态,而AArch32是兼容Arm-v7a的状态,所有Arm-v7a以及更早的软件都可以在这个状态上正常运行。对于应用程序来说,由于EL0没有权限进行AArch64和AArch32状态切换的,因此只能一条道走到黑地用一种态。这也是AArch64与AArch32使用各自独立指令集的原因,两种状态下的指令集保持着井水不犯河水的“克制”。
文章评论