00. 目录
文章目录
01. ARM架构
参考: https://wikimili.com/en/List_of_ARM_microarchitectures
参考:https://infogalactic.com/info/List_of_ARM_microarchitectures
部分参考如下:
ARMv7和ARMv8对比
02. LINARO出品的编译器
2.1 下载地址
参考:https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/
2.2 下载选项
裸机(bare-metal)
linaro编译链区别:https://blog.csdn.net/Namcodream521/article/details/88379307
适用情况总结如下:
(1)、一般给ARMv8架构的处理器用:
ARM64、小端、裸机工程: aarch64-elf -
ARM64、小端、Linux工程: aarch64-linux-gnu -
ARM64、大端、裸机工程: aarch64_be-elf -
ARM64、大端、Linux工程: aarch64_be-linux-gnu -
特殊版本、ARMv8架构、Linux工程: armv8l-linux-gnueabihf -
(2)、一般给ARMv7架构的处理器用:
ARM32、小端、裸机工程: arm-eabi -
ARM32、小端、Linux工程: arm-linux-gnueabi -
ARM32、小端、Linux工程: arm-linux-gnueabihf -
ARM32、大端、裸机工程: armeb-eabi -
ARM32、大端、Linux工程: armeb-linux-gnueabi -
ARM32、大端、Linux工程: armeb-linux-gnueabihf -
ps: gnueabi和gnueabihf的区别(硬浮点、软浮点):
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可见这两个交叉编译器适用于arm-el和arm-hf两个不同的架构, 在对待浮点运算采取了不同的策略,
其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同. gcc的选项-mfloat-abi有三种值soft,softfp,hard
(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):
soft : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard : armhf架构(对应的编译器为gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
03. ARM出品的编译链
3.1 下载地址
2022版本下载:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
2022之前版本下载:https://developer.arm.com/downloads/-/gnu-a#panel4a
3.2 下载选项
ARM编译链区别:https://www.jianshu.com/p/40791ed11467
ARM32、小端、裸机工程: arm-none-eabi
ARM32、小端、Linux工程: arm-none-linux-gnueabihf
ARM64、小端、裸机工程: aarch64-none-elf
ARM64、小端、Linux工程: aarch64-none-linux-gnu
ARM64、大端、Linux工程: aarch64_be-none-linux-gnu
以2022版本示例:
(1) WINDOWS
(1.1)适用32位和64位Windows下的 ARM32、小端、裸机工程:
AArch32 bare-metal target (arm-none-eabi)
gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi.exe
(1.2)适用32位和64位Windows下的 ARM32、小端、Linux工程:
AArch32 GNU/Linux target with hard float (arm-none-linux-gnueabihf)
gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-linux-gnueabihf.exe
(1.3)适用32位和64位Windows下的 ARM64、小端、裸机工程:
AArch64 bare-metal target (aarch64-none-elf)
gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-elf.exe
(1.4)适用32位和64位Windows下的 ARM32、小端、Linux工程:
AArch64 GNU/Linux target (aarch64-none-linux-gnu)
gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.exe
(2) LINUX
(2.1) 适用x86-64位Linux下的 ARM32、小端、裸机工程:
AArch32 bare-metal target (arm-none-eabi)
gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
Linux的架构可以通过arch指令查看
deng@local:~/a72$ arch
x86_64
deng@local:~/a72$
(2.2) 适用x86-64位Linux下的 ARM32、小端、Linux工程:
AArch32 GNU/Linux target with hard float (arm-none-linux-gnueabihf)
gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
(2.3) 适用x86-64位Linux下的 ARM64、小端、裸机工程:
AArch64 bare-metal target (aarch64-none-elf)
gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf.tar.xz
(2.4) 适用x86-64位Linux下的 ARM64、小端、Linux工程:
AArch64 GNU/Linux target (aarch64-none-linux-gnu)
gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
(2.5) 适用x86-64位Linux下的 ARM64、大端、Linux工程:
AArch64 GNU/Linux big-endian target (aarch64_be-none-linux-gnu)
gcc-arm-11.2-2022.02-x86_64-aarch64_be-none-linux-gnu.tar.xz
(2.6) 适用AArch64 Linux下的 ARM32、小端、裸机工程:
AArch32 bare-metal target (arm-none-eabi)
gcc-arm-11.2-2022.02-aarch64-arm-none-eabi.tar.xz
(2.7) 适用AArch64 Linux下的 ARM32、小端、Linux工程:
AArch32 GNU/Linux target with hard float (arm-none-linux-gnueabihf)
gcc-arm-11.2-2022.02-aarch64-arm-none-linux-gnueabihf.tar.xz
(2.8) 适用AArch64 Linux下的 ARM64、小端、裸机工程:
AArch64 ELF bare-metal target (aarch64-none-elf)
gcc-arm-11.2-2022.02-aarch64-aarch64-none-elf.tar.xz
(3) macOS
(3.1) 适用macOS (x86_64)下的 ARM32、小端、裸机工程:
AArch32 bare-metal target (arm-none-eabi)
gcc-arm-11.2-2022.02-darwin-x86_64-arm-none-eabi.tar.xz
(3.2) 适用macOS (x86_64)下的 ARM64、小端、裸机工程:
AArch64 bare-metal target (aarch64-none-elf)
gcc-arm-11.2-2022.02-darwin-x86_64-aarch64-none-elf.tar.xz
04. 编译器选择示例
- 在Linux上编译ARM32裸机程序
Linaro:gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi.tar.xz
ARM:gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 - 在Linux上编译ARM32 Linux程序
Linaro:gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
ARM:gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz - 在Linux上编译ARM64裸机程序
Linaro:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-elf.tar.xz
ARM:gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf.tar.xz - 在Linux上编译ARM64 Linux程序
Linaro:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
ARM:gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz - 在Windows上编译ARM32裸机程序
Linaro:gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-eabi.tar.xz
ARM:gcc-arm-none-eabi-10.3-2021.10-win32.exe - 在Windows上编译ARM32 Linux程序
Linaro:gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf.tar.xz
ARM:gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-linux-gnueabihf.zip - 在Windows上编译ARM64裸机程序
Linaro:gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-elf.tar.xz
ARM:gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-elf.zip - 在Windows上编译ARM64 Linux程序
Linaro:gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu.tar.xz
ARM:gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.zip
05. 问题讨论
linaro的7.5版本的工具链,版本信息如下:
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/bin/../libexec/gcc/arm-linux-gnueabi/7.5.0/lto-wrapper
Target: arm-linux-gnueabi
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=soft --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/arm-linux-gnueabi --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabi/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.5.0 (Linaro GCC 7.5-2019.12)
上述这段版本信息中,有值得我们关注的地方:--with-tune=cortex-a9 --with-arch=armv7-a[3]
,而假如我们需要的是生成armv4t指令集中的汇编指令该怎么办呢?
其实Linux代码已经处理了架构问题:
在arch/arm/Makefile:
arch-$(CONFIG_CPU_32v4T) =-D__LINUX_ARM_ARCH__=4 -march=armv4t
在arch/arm/mm/Kconfig:
# ARM920T
config CPU_ARM920T
bool
select CPU_32v4T
select CPU_ABRT_EV4T
select CPU_CACHE_V4WT
select CPU_CACHE_VIVT
select CPU_COPY_V4WB if MMU
select CPU_CP15_MMU
select CPU_PABRT_LEGACY
select CPU_THUMB_CAPABLE
select CPU_TLB_V4WBI if MMU
help
The ARM920T is licensed to be produced by numerous vendors,
and is used in the Cirrus EP93xx and the Samsung S3C2410.
Say Y if you want support for the ARM920T processor.
Otherwise, say N.
在arch/arm/mach-s3c24xx/Kconfig:
config CPU_S3C2440
bool "SAMSUNG S3C2440"
select CPU_ARM920T
select S3C2410_COMMON_CLK
select S3C2410_PM if PM_SLEEP
help
Support for S3C2440 Samsung Mobile CPU based systems.
在arch/arm/configs/s3c2410_defconfig:
CONFIG_CPU_S3C2440=y