qemu-i386 和 Linux IA32 仿真之间的差异

qemu-i386 和 Linux IA32 仿真之间的差异

在 x86-64 Linux 上,有两种运行 32 位应用程序的选项:一种可以通过 选项内置到内核本身中CONFIG_IA32_EMULATION(通常对于大多数内核而言是打开的),另一种是qemu-i386.

有什么区别?可以qemu-i386接近本机性能运行——它更像本机,还是更像 JIT 重新编译器?

答案1

内核配置选项CONFIG_IA32_EMULATION为 x86-64 内核提供支持 32 位二进制文​​件执行的可能性。
这种支持主要包括

  • 为 i386 系统调用提供入口点。 (i386 和 x86_64 有不同的系统调用号)并将 32 位参数转换为 64 位。
  • 破解 ELF 加载程序(fs/binfmt_elf.c,它负责将可执行文件从文件系统加载到进程的地址空间中以开始执行),以符合 32 位 ELF 文件结构。

然后可以执行 32 位二进制文​​件,而无需在它们和内核之间添加任何附加层。
一些严重漏洞的历史很短(都经过精心修补,但是……没人知道)

qemu-i386(正如你所要求的,vg不是qemu-system-i386) 是一个用户空间模拟器。即在用户态执行并负责在内部加载 32 位的程序,将 32 位系统调用转换为 64 位系统调用等......而不需要内核的任何特殊 32 位支持。

这个主要区别(在用户空间中运行的附加层)使您无法期望使用 qemu-i386 达到接近本机的性能(只需考虑一下通过 Wine 运行 Windows 程序),这会增加动态链接的可执行文件和需要的各种可能的麻烦当愿意调试 32 位应用程序时需要专用工具。


编辑以下有关 qemu 的 OP 重新版:

它更像是原生的,还是更像是 JIT 重新编译器?

正如我们可以读到的翻译器内部结构, qemu 是一个基于“微型代码生成器”作为后端,它只不过是一个(抽象)代码生成器。
由于该抽象代码随后将被转换为特定目标的机器代码(经过一定程度的优化),因此该抽象代码可以说是已编译的。
因此,我们确实更接近某种(代码的)JIT 编译器,而不是本机(代码的执行)……尽管……”及时“可能会被质疑……;-)

相关内容