ARM CPU汇总 & 编译链选择

一、ARM架构 与 ARM处理器 对应关系表

1.1 见:
https://infogalactic.com/info/List_of_ARM_microarchitectures
https://wikimili.com/en/List_of_ARM_microarchitectures
1.2 部分截图:

二、编译链

2.1 LINARO 出品的编译链

2.1.1 下载地址

https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/

2.1.2 下载选项及解释

ps:裸机(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中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。

2.2 ARM 出品的编译链

2.2.1 下载地址

2022版本:
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads
2022之前的版本:
https://developer.arm.com/downloads/-/gnu-a#panel4a

2.2.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
ps:Linux的架构可以通过arch指令查看

(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

2.3工具链选择示例

  • 在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

2.3 编译链能处理的CPU架构问题

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

posted @ 2022-06-23 14:39  solonj  阅读(2064)  评论(0编辑  收藏  举报