ARMv8 - 在64位操作系统上运行传统的32位应用程序

5

阅读ARMv8手册时,我有以下问题帮助理解整体情况。

  1. 传统的32位应用程序(ARMv7或更早版本)能否在ARMv8操作系统上直接运行?

  2. 如果需要为ARMv8重新构建传统应用程序,并假设我将应用程序重新构建为32位(Aarch32),这是否需要32位操作系统的底层支持?(了解寻址机制如何工作很有趣。)

请尽可能提供参考资料。

附注:我正在针对具备Aarch64支持的Linux操作系统进行开发(3.7及更高版本)。


理论上来说,在ARMv8架构上运行ARMv7二进制文件不应该有问题,因为它是向下兼容的(http://www.arm.com/products/processors/armv8-architecture.php)。然而,当涉及到特定的GNU/Linux发行版时(您没有提到我们正在讨论哪一个),情况可能会略有不同,因为它可能没有所有库与您的32位二进制文件链接。 - user2845360
2
正如iPhone5s和iPad Air的所有者所能证明的那样,是的——这是可能的。为了使其工作,整个32位用户空间都是必需的,包括动态链接器和libc。在同一个进程中混合使用32位和64位二进制文件是不可能的。在运行同时包含两种类型进程的系统时,会需要更多的RAM,因为32位和64位库的部分内容将常驻内存。 - marko
感谢Sami Laine和Marko的评论。是的,由于系统调用API中内核支持兼容性,这看起来是可能的。感谢您在库方面提出重要的注意事项。 :) - MS.
2个回答

5

Aarch64平台可以运行32位的ARM,但这种兼容性是可选的。

要运行AArch32二进制文件,您需要使用所有应用程序在32位版本中使用的库。与x86-64系统上的i686二进制文件相同。


谢谢Marcin。是的,正如Marko所提到的那样,Aarch32确实需要所有应用程序及其库均为32位版本。 - MS.

2
还有一个 Linux arm64 的 CONFIG_COMPAT,在 https://github.com/torvalds/linux/blob/v4.17/arch/arm64/Kconfig#L1274 中,它的意思是:
  This option enables support for a 32-bit EL0 running under a 64-bit
  kernel at EL1. AArch32-specific components such as system calls,
  the user helper functions, VFP support and the ptrace interface are
  handled appropriately by the kernel.

这段文字提到了一个 ARM 员工在 https://community.arm.com/processors/f/discussions/5535/running-armv7-binaries-on-armv8 上的评论,指出可能需要进行一些修改来运行 ARMv7 二进制文件,并且用户空间指令基本相同,但有一些例外。对于 Linux 应用程序来说,ARMv8-A 包括 AArch32,提供与 ARMv7-A 的向后兼容性,但某些指令(例如 SWP 指令)不再受支持,但这些是应用程序不太可能使用的类型(并且在 ARMv7 中已被弃用)。对于 baremetal,您将面临在一个平台上使用另一个平台的二进制文件的所有常规问题。因此,在大多数情况下,您需要进行某种程度的移植。作者还提到了他自己尝试使用 this QEMU full system setup 进行 ARMv7 编译器编译 C hello world 的尝试失败了。
arm-linux-gcc -static hello_world.c

将生成的文件放入aarch64目标中,但是当我尝试运行它时,它失败了,并显示以下信息:
a.out: line 1: syntax error: unexpected word (expecting ")")     

尽管/proc/config.gz显示CONFIG_COMPAT已设置,但似乎Linux内核没有将其识别为ELF文件,而是退回到了/bin/sh,如果我执行以下命令,会得到相同的错误提示:
sh /mnt/9p/a.out

正在尝试使用 shell binfmt 而不是 ELF。
特别地,我知道 Linux 内核可以根据 binfmt 签名从架构中选择,因为 qemu-user 这样做:https://unix.stackexchange.com/questions/41889/how-can-i-chroot-into-a-filesystem-with-a-different-architechture

arm-linux-gcc...如果您编译的不是静态库,而是动态库(这是默认值),它将能够运行。 - user1742529

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接