【ARM】ARM架构CPU和编译器汇总

本文详细介绍了LINARO编译器针对ARMv7和ARMv8架构的下载选项,以及ARM出品的不同编译链,包括适用于裸机和Linux工程的版本,以及针对不同平台(如Windows,Linux,macOS)的安装示例。同时讨论了版本信息和针对特定处理器(如ARM920T)的配置问题。
摘要由CSDN通过智能技术生成

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

06. 附录

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值