【问题标题】:What defines a machine to be 32-bit什么将机器定义为 32 位
【发布时间】:2014-03-25 03:51:42
【问题描述】:

我只是想知道,通过说 32 位机器和 64 位机器,机器中的 32(64)位究竟是什么,因此我们将其定义为 32(64)位机器。由于我目前正在学习 C,我发现指针和内存之间的关系很好地解释了这一点。由于一个内存地址指向一个字节,所以如果内存地址由 32 位组成(即一个指针是 4 个字节),它最多可以有 2^32 种可能性,也就是说它最多可以表示 2^32 个字节导致 32 位机器最多支持 4GB RAM。这是公平的假设吗?那么32位机还是64位机是由其内存地址大小来定义的呢?

此外,如果一台机器是 32 位的,那台机器上的 C 中的指针是否总是 4 字节(32 位)?

【问题讨论】:

  • @SLaks 我读过它,所以如果一台机器是 32 位的,那么指针是否也总是 32 位?我看不到 int 等其他数据类型与机器架构之间的这种关系,但我很好奇 C 中的指针与机器架构之间是否存在这种对应关系
  • 以 8088 为例:它结合了两个 16 位寄存器以创建一个 20 位地址,该地址在 8 位总线上输出到内存。突然间,“指针”和“地址”的定义变得有点模糊……近指针还是远指针? ;)

标签: c architecture 32bit-64bit


【解决方案1】:

在现代、高性能、普遍可用的 CPU(读取,x86)中,N 位架构区别是指架构上首选的整数运算所操作的数据宽度。这些 CPU 包含许多不同大小的寄存器,但是,其中一些可以将多个数据值打包到一个寄存器中,就像 SIMD 指令使用的一样。

内存地址空间和这种 N 位架构区别之间的关系仅仅来自这样一个事实:一旦 32 位可以容纳在单个寄存器中,内存偏移计算可以在单个周期内执行,并且 32 位似乎足够的地址空间可预见的未来。最终,可预见的未来到期了,现在我们在 64 位地址空间中使用 64 位值执行内存偏移计算。

这种与地址空间的关系有点武断,并且基于这样一个事实,即这些值变得足够大以提供合理的内存量。例如,在 12 位小型机中,内存不限于 (2^12) 4096 字节,内存地址只是跨越多个寄存器,偏移量计算需要不止一次循环。今天,一些 8 位微控制器也使用相同的方法,这种类型的微控制器可以在微波炉中找到。它们可以通过将地址存储在两个寄存器而不是一个寄存器中来提供 16 位地址空间、64kB 内存。

因此,除非您处理的是非主流 CPU,否则您可以将 N 位区别视为地址空间。然而,即使在今天,也有一些情况并没有映射。例如,如前所述的微控制器,以及可能使用“超大指令字”的特定领域或超级计算架构,这些架构可以被视为“2048 位 CPU”,但很可能在 64 位地址空间中运行。

【讨论】:

    【解决方案2】:

    并没有说 ALU、地址总线和数据总线的宽度都必须相同。因此,没有正式的定义来定义它的含义,例如。 32 位。

    【讨论】:

      【解决方案3】:

      此外,如果一台机器是 32 位的,则该机器上的 C 中的指针 总是 4 字节(32 位)?

      您可以使用自动多路复用器来仅使用 32 位寻址 12GB。(效率非常低,因为只有 1/3 的周期访问 4GB 区域)

        *****************************************************************
        Multiplexer clock cycle1
      
      
      
                                  first 4GB
        32-bit wide addressing     /
       ---------------------------M----
                                   \
      
        *************************************************************
        Multiplexer clock cycle2
      
      
      
      
        32-bit wide addressing     /
       ---------------------------M----- second 4GB
                                   \
      
      
        **************************************************************
        Multiplexer clock cycle3
      
      
      
      
        32-bit wide addressing     /
       ---------------------------M-----
                                   \
                                 third 4GB
      

      在说明设计中,您可以:

       waitFor(multiplexer%3==0)write value to address;// you know this writes to first 4GB region
                                                  //blocks until multiplexer is ready
        waitFor(multiplexer%3==1)write value2 to address;// you know this writes to second 4GB region
                                                   //blocks until multiplexer is ready
        waitFor(multiplexer%3==2)write value3 to address;// you know this writes to last 4GB region
                                                  //blocks until multiplexer is ready
      
       Multiplexer value can be accessed by a cpu register easily.
      

      所以,答案是否定的。它可以小于 32 位。

      【讨论】:

        【解决方案4】:

        现代操作系统和计算机使用一种称为虚拟内存的结构。每个程序(进程)都认为它拥有整个 RAM 可供使用。实际上,RAM 在许多并发进程之间共享。

        通常,您在编译器中看到的“地址”并不等同于 RAM 中的地址或物理地址 (PA)。相反,它是一个“虚拟地址”(VA)。操作系统与您的处理器一起将 VA 转换为 PA。

        为什么要这样做?因为您的 RAM 通常太小而无法通过 64 位或 32 位寻址。 2^64 的单位是 Z 字节!没有内存那么大!将 RAM 视为硬盘的高级缓存:我们仅在需要使用时将当前运行的程序的一小部分从磁盘放入 RAM。

        如果您需要的程序片段不在 RAM 中,则会触发“页面错误”,将所需数据从磁盘带入 RAM,并在此过程中从 RAM 中剔除一些旧的、未使用的数据。

        回答您的问题:您的计算机可以处理的 RAM 量(几乎)完全独立于您的虚拟地址的长度(以位为单位)。以具有 128 GB RAM 的服务器机架为例。所有这些 RAM 有什么好处?!好处是您将能够并行运行多个进程,并且仍然可以非常快速地运行所有内容。

        这是计算机体系结构中的一个大主题。阅读有关虚拟内存、分页和页表以及内存组织的知识,以更好地了解。

        希望这会有所帮助!

        【讨论】:

        • 注意:2^64 ~= 16e18,即 16 艾字节(比泽字节小很多)!
        猜你喜欢
        • 2017-07-16
        • 2017-02-03
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2011-11-08
        • 2016-10-20
        • 2017-04-07
        • 2011-02-08
        相关资源
        最近更新 更多