手机64位ARM处理器有啥用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手机64位ARM处理器有啥用相关的知识,希望对你有一定的参考价值。

参考技术A

  全世界都知道苹果发布了64位处理器的手机,有人说它只是一个营销噱头,有人说它这是在长线布局,其实不然,下面我就为大家介绍一下手机64位ARM处理器有什么用处及重要性吧,欢迎大家参考和学习。

  64位计算的历史相当丰富有趣。Cray等公司在70年代就已经开始在自己的系统当中使用64位寄存器,但真正纯粹的64位计算直到90年代才真正到来。首先是MIPS的R4000,然后是DEC的Alpha处理器。到90年代中期,英特尔和Sun都已经拥有64位设计。而对于消费者来说,真正的转折点是AMD在2003年发布了一款兼容英特尔32位x86处理器的64位PC处理器。

  再向前快进10年,PC销量不断下滑,大部分智能手机和平板电脑都拥有了主频在1-2GHz之间的多核心处理器。但它们使用的都是32位架构,而非现代PC和服务器所使用的64位架构。到现在为止,这都是可以接受的。智能手机并不会去和PC拼性能,这些处理器需要足够节能,以实现续航的最大化。

  但是,随着设备的发展和新技术——语音识别、3D游戏和高分辨率显示屏——逐渐普及,32位处理器的能力已经渐渐被推到了极限。

  ARM看到了64位节能处理器的需求,并在正式发布ARMv8-A架构(首个包含64位指令集的ARM架构)之前就早早开始了新设计的开发,还从其他选择发展64位技术的芯片设计厂商那里学习到了经验和教训。ARM的新款64位架构具备对于旗下32位架构的全面兼容,这意味着如果处理器运行于64位系统,它就可以运行未修改的ARMv7 32位二进制文件。对于android来说,这意味着一旦内核被移植到64位(多亏了Linaro,它们已经如此了),系统的其余部分,从核心库到应用再到游戏,都是可以在32位或64位之间进行切换的。

  去年,苹果凭借着iPhone5s的全新64位A7处理器震惊了整个移动领域。A7采用了苹果设计的ARMv8双核处理器,名为Cyclone。它使用了两个64KB L1缓存(供两个核心分别使用),一个1MB L2缓存(被两个核心所分享)和一个4MB L3缓存(为整个SoC所用)。苹果拥有ARM架构授权,这意味着它可以从头开始设计自己的处理器,但前提是这些处理器必须是ARM兼容的。ARM拥有一套测试套件,用以检查这些处理器是否具备兼容性。

  在未来几个月里,我们将会看到高通、联发科和三星纷纷推出自己的64位ARM处理器。再考虑到Android在64位化的努力,用不了多久我们就将看到运行于64位Android系统的64位设备了。但对于开发者和终端用户来说,64位处理器意味着什么呢?

  每一部CPU的中心都是一套寄存器,他们都是用以存储数字和地址的内部存储插槽。当执行复杂任务时,这些插槽会被反复使用。如果所有的寄存器都处于占用状态,那么处理的唯一方式是将其中一个寄存器存储在内存当中,使用寄存器进行下一个任务,然后再从内存当中重新载入之前的值。对于人类来说,这一切都发生在一瞬间。但对于处理器来说,这实际上是一个非常耗时的顺序,并不十分效率。

  32位ARMv7架构拥有15个通用的寄存器,每一个都有32位宽。而ARMv8架构拥有31个通用寄存器,每一个为64位宽。这就意味着优化代码使用内部寄存器的频率应该要比内存更高,同时也可以保留更大的数字和地址。结果就是,ARM的64位处理器在运行速度上会更快一些。

  在能效上面,64位寄存器的使用并不会提升功耗。在某些情况下,64位核心执行部分任务的速度会更快一些,由于运行时间的减少,这也就会使其显得比32位核心更加节能。

  寻址(Addressing)是64位处理器的另一个层面。在PC和服务器领域,32位的局限主要在可访问的内存上。如果你想要使用超过4GB的\'内存,就需要使用64位处理器。因为可以使用大物理地址拓展(LPAE),某些ARMv7处理器能够使用超过4GB内存,所以严格来讲,内存的限制并不是ARM处理器所遭遇的问题。由于LPAE的存在,Cortex-A15处理器能够处理1024GB内存,而64位的处理能力更是高达200万TB。因此在短时间内,任何一部智能手机都不需要完整的64位寻址。追求永远都不会被用到的寻址空间是毫无意义的,因此ARMv8架构采用了48位寻址,这已经是256TB了。

  虽然没有什么程序或游戏会用到TB级别的内存,但在另一方面,这种寻址能力又非常重要。现代3D游戏通常都带有大量的资源,当拥有超过4GB的可访问空间时,这些资源能够被更加轻松地进行内存映射。这样一来,游戏的运行速度会得到提升,并让直接访问游戏多媒体资源成为可能。

   不只是智能手机和平板

  ARM上64位计算的好处并不仅限于智能手机和平板电脑。ARM的生态系统很广阔,他们的处理器也被许多不同类型的设备所使用。服务器市场是ARM处理器影响力有限的一个领域。信息时代的发展让维持数据中心所消耗的能源持续快速增长,而任何能够降低能源使用的技术都是对于资金和自然资源的节省。除了节能之外,在服务器当中使用64位ARM芯片还有其他的好处。这些服务器都会被动散热,这意味着你可以将它们集中在一起,而无需担心会发生过热的情况。这样一来,用于散热上的花费也将有所降低。

  至于服务器软件,Linux这样的操作系统已经是64位的了,其主线内核当中也已经加入了对于ARMv8的支持。这也就是说,制作运行于64位Linux、ARM处理器的服务器并不会很困难。

   总结

  多亏了ARM,64位的移动计算时代就要到来了。这些新的处理器不仅速度更快,还为移动平台开启了更多的可能性。

  从32位向64位的迁移道路已经被铺就,无论是什么操作系统,开发者从32位进入64位都不会有任何意外。

  在未来几个月里,ARM的合作伙伴都将推出Cortex-A53和Cortex-A57处理器。当中有的会采用双核或四核的标准配置,也有的会选择big.LITTLE配置。但有一点是肯定的,那就是这对于ARM和普通用户来说都是一个激动人心的时刻。

  在苹果眼里,Windows台式机、MacBook市场一直在收缩,而ios才是未来,iPhone和iPad不是后PC时代的过渡,而是要代替PC,它们正准备把iOS和相关设备推向一个真正的个人计算时代,这才是苹果最前卫的手机战略。

Android NDK 工具链中的 LLVM 有啥用?

【中文标题】Android NDK 工具链中的 LLVM 有啥用?【英文标题】:What's the use of LLVM in Android NDK Toolchains?Android NDK 工具链中的 LLVM 有什么用? 【发布时间】:2019-07-14 01:39:32 【问题描述】:

LLVM 在 Android NDK 工具链中有什么用?


简单回顾:

我在 Ubuntu 上使用 Gradlew 构建我的本地项目,目标是 arm 和 x86_64 架构。貌似LLVM被用来调用arm-linux-androideabi-4.9的C/C++编译器以及x86_64(?)

以下内容摘自 armeabi-v7a/ndkBuild_build_output.log:

/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/module-5/stream_cpp.o.d -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fpic -ffunction-sections -funwind-tables -fstack-protector-strong -Wno-invalid-command-line-argument ...

..以下内容摘自x86_64/ndkBuild_build_output.log:

/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/x86_64/objs-debug/module-5/stream_cpp.o.d -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64 -target x86_64-none-linux-android -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wno-invalid-command-line-argument ...

“...”表示我已经剪掉了这条单行命令的长尾。 个人文件夹和项目的名称已更改。

让我们看看 Android NDK 的 toolchains 文件夹里面有什么:

myacc:~/.../android-ndk-r17c/toolchains$ tree -L 1
.
├── aarch64-linux-android-4.9
├── arm-linux-androideabi-4.9
├── llvm
├── mips64el-linux-android-4.9
├── mipsel-linux-android-4.9
├── NOTICE-MIPS
├── NOTICE-MIPS64
├── renderscript
├── x86-4.9
└── x86_64-4.9

这让我很困惑。我认为 llvm 是一种工具链,因为它被放置在这里,与其他工具链相邻。同样,LLVM 在 Android NDK 工具链中的实际用途是什么?

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

LLVM 是编译器(后端)。使用的编译器是 Clang,它位于 llvm 目录中。 (LLVM 是 Clang 中进行实际代码生成的组件的名称,也就是后端。)

以前,NDK 使用 GCC 作为编译器。使用 GCC,每个目标架构(arm、aarch64、x86 等)都有一个单独的 GCC 副本,该副本是使用配置的单个目标构建的。另一方面,Clang/LLVM 可以使用单个编译器可执行文件针对任何已配置的架构。因此,使用 Clang,您将节省一些磁盘空间,避免使用许多单独的编译器可执行文件。这就是为什么 llvm 目录树只有一个副本的原因。

在 NDK r17 中,您可以使用 GCC 和 Clang 编译器;默认情况下使用 Clang,但 GCC 仍可用于尚未能够迁移到使用 Clang 的项目。在较新的 NDK 版本中,旧的 GCC 已被删除。

在较新的 NDK 版本中,即使删除了 GCC,架构特定的目录(如 aarch64-linux-android-4.9)仍然保留,因为仍然使用 GNU binutils(构建过程使用的次要工具),而且这些目录也进来了每个架构一个副本(即使它们在技术上可能跨架构工作)。

至于为什么要为例如arm 还提到了 x86_64;当您运行 Clang 或 GCC 时,您正在为运行 x86_64 的构建计算机运行一个可执行文件,因此路径的 prebuilt/linux-x86_64 部分。

【讨论】:

感谢您的线索,mstorsjo :) 我刚刚从here 发现,自 NDK Rev. 11(2016 年 3 月)以来,GCC 已被删除。并且来自here,“选项 -gcc-toolchain 仅告诉构建的 Clang 在哪里寻找 C++ 标准库和头文件,它与 LLVM/Clang 构建过程无关” /跨度> 但我仍然很好奇 Clang 是如何将项目定义为“还不能迁移到使用 Clang”的?它可以决定是否在 arm-linux-androideabi-4.9/ 或 x86_64-4.9 中使用“C/C++ 标准库和头文件”吗? (我想知道我们是否可以删除所有这些遗留文件夹并且我的项目可以正常构建) NDK r11 仅删除了一个较旧的 GCC 版本,但 NDK r18 完全删除了 GCC。不,您不能删除这些文件夹,它们仍然包含每个架构的 binutils,并且您使用的 NDK r17 仍然从这些目录中使用它们。在这种情况下,-gcc-toolchain 不用于查找任何标准库或头文件,而仅用于查找构建期间使用的额外工具(链接器)。在最新的 NDK r19 中,这些目录仍然存在,但不被正常构建使用。在以后的版本中,它们可能不再包含在内。 Clang 没有定义“还不能使用 Clang”的项目。从历史上看,当使用ndk-build 系统构建时,开发人员可以设置变量NDK_TOOLCHAIN_VERSION 来选择要使用的GCC 版本,当有多个版本可供选择时。在某些时候添加了 Clang,并且可以设置 NDK_TOOLCHAIN_VERSION=clang 来代替它。将 clang 设为默认后,如果项目更喜欢使用 GCC 构建,他们仍然可以覆盖 NDK_TOOLCHAIN_VERSION,但在最新版本中不再可能,因为 GCC 已被完全删除。【参考方案2】:

LLVM 现在是一个伞形项目,它包含多种模块化和可重用的编译器和工具链技术。您可以在The LLVM Compiler Infrastructure查看更多详细信息。

对于 Android NDK,自 r13b 以来,llvm 成为默认工具链,自 r18b 以来已删除 gcc。

根据toolchains目录toolchains/llvm/prebuilt/darwin-x86_64,llvm支持所有的ABI,即x86、x86_64、arm、arm64。

在未来的 NDK 版本中,当所有 gcc 相关的工具、头文件和库都完全移植到 llvm 时,toolchains 目录下可能只有一个 llvm 目录。

可能有帮助的参考资料:Android NDK path variable for "strip" command in CMake build tool chain


更新

刚刚对不同的 NDK 版本进行了快速测试,以检查用于交叉编译的 --gcc-toolchain--sysroot 的配置。

在 r16b 上

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 

在 r17c 上

--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot

在 r18b 上

--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot

在 r19b 上

--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

如上所示,在 NDK r19b 之前,NDK 使用 clang 编译器,但 --gcc-toolchain--sysroot 被配置为构建工具、头文件和库的旧路径。

但是,从 NDK r19b 开始,--gcc-toolchain--sysroot 被配置为新的工具链 llvm,即 toolchains/llvm/prebuilt/darwin-x86_64,以及工具(例如ranlib、ar、strip 等)头文件和“llvm 版本”的库将被使用。

另外,请注意toolchains/llvm/prebuilt/darwin-x86_64 包含对所有Android ABI 的支持,即aarch64-linux-android 用于arm64-v8aarm-linux-androideabi 用于armeabi-v7ai686-linux-android 用于 x86x86_64-linux-android 用于 x86_64

所以,如果你想纯粹使用 llvm 工具链,可以试试 NDK r19b。

【讨论】:

以上是关于手机64位ARM处理器有啥用的主要内容,如果未能解决你的问题,请参考以下文章

stm32的arm内核和cortex架构到底是啥意思?有啥区别?求指教!

ARM64架构简介

Android 关于arm64-v8aarmeabi-v7aarmeabix86下的so文件兼容问题

指令,操作系统位数,32位与64位 x86 arm 处理器 ,概念概览

Android 关于arm64-v8aarmeabi-v7aarmeabix86下的so文件兼容问题

想在树莓派上跑TDengine?没问题!TDengine已支持ARM64位处理器