【问题标题】:Use 64bit timestamp on a 32bit machine在 32 位机器上使用 64 位时间戳
【发布时间】:2014-12-16 14:05:54
【问题描述】:

我们都知道千年虫问题,这个问题将在 2038 年很快到来。我读到的所有解决方案都是“使用 64 位操作系统”,所以我有一个问题;如果我的程序是使用任何 64 位平台编译的,那么它可以在仅使用 32 位的机器上运行,例如旧的 Pentium CPU?我读到一些资源说 int_64bit 可以通过使用两个 32 位整数在 32 位机器上表示。

【问题讨论】:

  • 你在说什么编程语言? C?
  • @TheSandman 一般,但假设它是 C
  • 我不知道我是否正确理解了这个问题,但据我所知,您无法在 32 位系统上运行 64 位程序(除非您使用一些奇怪的解决方法)。我只是建议使用更大的类型来解决 2038 问题。这也将允许更高的精度(即毫秒)。

标签: unix integer timestamp cpu 32bit-64bit


【解决方案1】:

简单的答案是

  • 为 64 位平台编译的程序无法在 32 位处理器上运行。

  • 时间戳主要是特定于应用程序的,您的编程语言会负责处理它,而操作系统会负责处理。

看到你需要了解两件事

  1. 在 64 位平台上编译并不意味着您的应用程序是 64 位的。您可以在 64 位平台上编译 32 位应用程序。

  2. 现在看看你在计算机上运行的程序或应用程序的所有内容都是由处理器执行的,因此每个程序在被处理器执行之前的最后时刻都会被转换或目标代码或机器代码,而这些“位”实际上代表处理器拥有的“寄存器”(处理器使用的内存类型)的大小。所以关键是每当像程序 C++ 这样的高级语言被转换为机器代码时。编译器遵循这些步骤(简单来说)

    您的源代码 ---> 转换为系统特定程序集 ---> 二进制代码

然后这个二进制代码由处理器执行。 现在看到我提到的汇编语言是特定于机器/处理器的。 ARM 处理器、x86 处理器、PowerPC 处理器等不同。(这些是处理器架构)

现在假设我们现在正在考虑 32 位 Intel 处理器 (x86) 将如何运行 64 位程序

您编写了一个用于将数字 10 和 20 相加的程序并编译了二进制文件以直接在处理器上运行(暂时忘记操作系统及其库)

现在让我们看看“您的源代码”转换为 32 位汇编程序和 64 位汇编程序

汇编输出(32 位或 x86 代码)

    mov eax, 10     
    add eax, 20 ;OUTPUT IS SAVED TO "EAX" REGISTER WHICH IS A 32 BITS REGISTER 

汇编输出(64 位或 x86_64 代码)

    mov rax, 10
    add rax, 20 ;OUTPUT IS SAVED TO "RAX" REGISTER WHICH IS A 64 BIT REGISTER

现在这些汇编程序被逐行转换为二进制代码 当您在 32 位处理器上运行 64 位代码的输出二进制文件时,32 位处理器甚至不知道“RAX”是什么,这将立即导致中断(来自处理器的错误)

处理器寄存器的图像如图所示(x86_64特定)

为简单起见,处理器内部有许多可用寄存器,我只使用 x86_64 处理器的 EAX 和 RAX 寄存器。对于 x86_64 处理器(64 位),知道这些“RAX”和“EAX”是什么意思。但是 32 位处理器(x86)不会理解“RAX”的含义。这就是为什么 32 位程序可以在 64 位机器上运行而相反是不可能的唯一原因....

注意:它不仅仅是寄存器,还有处理器特定的指令。较新处理器支持的所有指令可能不被较旧处理器支持。

示例:“imul reg, reg”(整数乘法)指令仅适用于 Intel 80386 及更高版本

我知道这有点令人困惑。解释起来有点复杂。我仍然希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2015-04-02
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多