【问题标题】:Start x86_64 code on x86 (32bit) Linux, running on x86_64 CPU在 x86(32 位)Linux 上启动 x86_64 代码,在 x86_64 CPU 上运行
【发布时间】:2011-09-07 00:54:08
【问题描述】:

?是否可以在 i686 Linux(x86,32 位)上启动 x86_64 代码?我的 CPU 是现代 Core 2,它本身可以运行 x86_64 64 位代码,但操作系统是 32 位的。

开始的代码是纯数学的,几乎不需要与操作系统交互。

我想测量,与 32 位模式相比,我的程序在 64 位模式下的速度有多快。该程序旨在解决巨大的组合问题,全尺寸运行数十小时。

我可以用 qemu 启动 64 位代码,但它不是原生执行,qemu 中的速度与实际 cpu 速度无关。

【问题讨论】:

  • 理论上您可以编写一个内核模块来接管内核并用 64 位内核替换它,同时保持数据结构(经过一些转换)完整。但我猜你不会那样做。

标签: linux x86 x86-64


【解决方案1】:

如果没有某种形式的仿真,您将无法在 32 位内核上运行 x86_64 程序。 (不过,反过来也可以,没有仿真。)

为了能够在 x86_64 上运行 64 位代码,您必须进入“长模式”,这需要设置适当的页表(除其他外)。 32 位内核不会完成任何 64 位页表或映射。所以用户空间代码不能进入64位模式。借助一些内核帮助也许可以实现,但 32 位内核根本不适合这种事情。

而且由于您可以使用 64 位内核运行 32 位代码,因此现在没有真正的理由不使用 64 位内核,尤其是如果您有一些可以从 64 位模式中受益的代码(尤其是更多的寄存器)。

为什么不直接从 64 位 live-cd 启动?还是在单独的磁盘或分区上安装 64 位发行版?

【讨论】:

  • 为什么“不能在 32 位内核上运行 x86_64 程序”? i686 linux 因政策原因无法关闭和/或更换。
  • 澄清了我的回答。 64 位模式的内存/页表结构与 32 位模式不同(大尺寸,多了一层间接层,可能有不同的页面尺寸),必须由内核设置。
  • 由于政策,我无法更改内核。
  • 那你就必须模拟,或者继续在 64 位模式下运行,或者使用 live-cd 来测试。
  • 但我的 linux “无法关闭和|或更换”。仿真不会给我一个真正的 32 和 64 代码之间的速度可比性,是吗?
【解决方案2】:

使用vmware;只要 CPU 支持,它就可以在 32 位主机操作系统上运行 64 位 VM 正常工作。

【讨论】:

  • vmware 能否在 32 位 CPU 上与 64 位客户机一起正常工作? Qemu 会的。
  • 否,但 vmware 将以可用的速度运行 VM。模拟指令并不酷,除非您尝试运行非常旧或速度很慢的系统。
  • 另外,你不能再购买 32 位 CPU。
  • 我可以。有使用过的 CPU,有较旧的 Atom,还有威盛和其他 nano-x86 生产商。此外,已经使用了数万亿个 32 位 x86 CPU。
【解决方案3】:

有一个适用于 x86/x86_64 的周期精确模拟器。默认情况下,它将模拟 AMD 的 K8

PTLsim 是用于 x86 和 x86-64 指令集的最先进的周期精确微处理器模拟器和虚拟机。 PTLsim 对完全乱序的处理器内核进行建模,具有广泛的内存和具有重放功能的分支推测、具有各种问题队列设计的高度可配置的集群微架构、完整的缓存层次结构和内存子系统以及支持硬件。

很遗憾,它无法在 32 位 x86 上运行 x86_64 代码(引用自常见问题解答)

当然,32 位版本的 PTLsim 会缺少 x86-64 支持

但是速度应该与实际运行相关,并且有很多信息可用。

【讨论】:

    猜你喜欢
    • 2022-10-31
    • 2014-02-20
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2015-07-15
    • 2012-01-06
    相关资源
    最近更新 更多