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

时间:2014-03-17 17:00:50

标签: linux arm arm64

通过ARMv8手册,我有以下问题来帮助理解大局。

  1. 可以使用传统的32位应用。 (ARMv7或更早版本)在ARMv8 OS上按原样运行?

  2. 如果需要为ARMv8重建遗留应用程序并假设我将应用程序重建为32位(Aarch32),那么这需要32位操作系统底层支持吗? (了解寻址机制如何在这里工作很有趣。)

  3. 请尽可能提供参考。

    PS:我的目标是支持Aarch64支持的Linux操作系统(3.7及更高版本)

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

https://github.com/torvalds/linux/blob/v4.17/arch/arm64/Kconfig#L1274处还有一个Linux arm64 CONFIG_COMPAT,上面写着:

  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,用户级指令基本相同,但有一些例外:

  

对于类似Linux应用程序的应用程序,则可以。 ARMv8-A包括AArch32,它提供与ARMv7-A的向后兼容性。存在一些限制,例如不再支持SWP指令。但是这些是应用程序不太可能使用的东西(在ARMv7中已弃用)。

     

对于裸机,您通常会遇到从另一个平台使用二进制文件的所有常见问题。因此,在大多数情况下,您将需要进行某种程度的移植。

然后我用this QEMU full system setup自己尝试了一次,但是尝试失败了:我使用armv7编译器编译了一个C hello世界,如下:

arm-linux-gcc -static hello_world.c

并将生成的文件放入aarch64目标中,但是当我尝试运行该文件时,它失败了:

a.out: line 1: syntax error: unexpected word (expecting ")")     

即使/proc/config.gz说设置了CONFIG_COMPAT

似乎Linux内核不是identifying it as an ELF file,而是回退到/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