【问题标题】:Why 32-bits OS supports up to 4 GB RAM为什么 32 位操作系统最多支持 4 GB RAM
【发布时间】:2019-01-28 03:04:03
【问题描述】:

所以我知道 32 位操作系统可以支持 232 个不同的值,大约是 4x109

我想每个值的内部表示是这样的:

0000 0000 0000 0000 0000 0000 0000 0000

.....

1111 1111 1111 1111 1111 1111 1111 1111

所以我们在这里有大约 4x109 种不同的模式。 但是由于每个地址由 4 个字节组成(32/8=4),RAM 不应该是 4x4x109?

【问题讨论】:

  • 这更像是一个超级用户的问题,在这里回答:superuser.com/questions/367490/…
  • 对于大多数 32 位处理器,地址是字节级别的,而不是字级别的。一些 32 位处理器支持超过 4 GB 的内存,但每个进程的虚拟地址空间限制为 4 GB。 Windows Server 2008 是少数支持超过 4GB 的 32 位 Windows 版本之一。
  • x86 是字节可寻址的。
  • 不是 4 个字节,是 1 个字节。
  • 您是否假设每个 4 字节地址都指向一个 4 字节内存块?事实上,每个 4 字节的地址都指向一个字节。

标签: c


【解决方案1】:

在典型的现代系统中,每个地址寻址一个字节。

即使硬件一次只能传输 4 个字节或 8 个字节,这样一个单元中的每个字节都有自己的地址。处理器只能使用 28 或 29 或其他位数与内存硬件交互,但它使用额外的位来区分字中的字节。

当程序访问特定地址时,处理器使用低位来隔离字节。读取时,它从内存中获取整个单元,然后使用低位来隔离请求的字节或字节。写入时,它使用低位将选定的一个或多个字节合并为一个数据单元,然后将整个单元写入内存。

因此,如果地址中有 32 位,则 232 = 4,294,967,296 个地址可用,并且可以处理 4,294,967,296 个事物。在典型的现代硬件中,每一个都是一个字节。通常,并非所有这些地址都可供用户程序使用,因为有些地址是为特殊目的而保留的。

【讨论】:

    【解决方案2】:

    x86 是字节寻址的,这意味着每个字节都有一个唯一的地址。这使得(在正常情况下)可寻址内存的总量为2^32 bytes(大约为4 GB)。并且不可寻址的内存(您无法为其分配地址的内存)完全无法使用。

    在整个地址空间中,并非所有地址都指向主存。其中一部分是为 IO 保留的,因此最大 RAM 量甚至低于4 GB


    我会尽力解决你的困惑

    所以我们在这里有大约 4x109 种不同的模式。

    正确

    但由于每个地址由 4 个字节组成 (32/8=4)

    无关

    内存不应该是 4x4x109 吗?

    没有

    地址的位数决定了可以有多少不同的值。我们已经确定32 bits 给了我们准确的2^32 ≈ 4^10 不同的地址。因此,我们可以拥有≈4^10 具有唯一地址的不同对象。忍受我,让我们跳出框框思考一下。如果地址是城市地址,那么我们最多可以有≈4^10 个城市。如果地址是街道地址,我们最多可以有≈4^10 个街道。如果地址是苹果的地址,我们最多可以有≈4^10apples。与我一起?如果地址是64-bit QWORDS 的地址,那么我们最多可以有≈4^10 64-bit qwords。如果地址是32-bit DWORDS,那么我们最多可以有≈4^10 32-bit qwords。但是在x86 中,地址不是以上任何一个。在x86 中,地址是一个字节(8 位)的地址,因此我们最多可以有≈4^10 bytes 又名≈4 GiB

    如您所见,地址的宽度仅给出了我们可以寻址的不同对象的数量。在x86 中,那些对象 是字节,所以我们最多可以有2^32 可寻址字节。


    2^32 bytes 的正常限制可以用Physical Address Extension 克服。这需要操作系统和硬件(CPU、芯片组和主板)的支持,即使满足这些,每个程序仍然只能使用32 bit 地址。

    【讨论】:

    • 看到我感到困惑的是,因为它是一个 32 位操作系统,每个地址都有 32 位。一个字节由 8 位组成,因此每个地址有 4 个字节。我们可以有大约 4x10^9 的地址模式。那么为什么我们说虚拟地址空间的限制是 4GB 呢?
    • 存储一个地址需要 4 个字节,但地址存储的是各个字节的索引,而不是 32 位字。换句话说,您认为正在发生的是:Address 0: 0000 0000 0000 0000 0000 0000 0000 0000, Address 1: 1111 1111 1111 1111 1111 1111 1111 1111...,而实际发生的是Address 0: 0000 0000, Address 1: 1111 1111, Address 2: 1010 1010。例如,一个 32 位的 int 占用 4 个字节,因此占用 4 个地址。关键是每个字节都有自己唯一的地址。
    【解决方案3】:

    对于现代操作系统,通常会有被转换为物理地址的虚拟地址。

    对于 32 位操作系统,虚拟地址通常(但不一定)是 32 位的。使用字节寻址,这意味着您可以拥有 1234 个进程,其中每个进程具有 4 GiB 的虚拟空间(或总共 4936 GiB 的虚拟空间)。然而,通常每个虚拟地址空间都被分割成一部分是“用户空间”,另一部分是“内核空间”;所以它可能更像是每个进程 2 GiB 加上内核 2 GiB(或 1234 个进程总共 2470 GiB)。

    但是,由于虚拟地址被转换为物理地址,因此虚拟地址的大小不必与物理地址的大小相同。这意味着即使虚拟地址是 32 位的,物理地址也可以大于(或小于)32 位。例如,对于大多数较旧的 80x86 CPU,有一个“物理地址扩展”(PAE) 功能可以将物理地址大小扩展到 36 位(为您提供 16 GiB 的物理地址空间),而对于现代 80x86 CPU(能够运行 64 位操作系统)PAE 得到增强,允许 32 位操作系统使用高达 52 位(“当前架构最大值”)的物理地址,为 32 位操作系统提供高达 4096 TiB 的物理地址空间大小位操作系统(理论上)。

    当然,物理地址空间包含 RAM、一些 ROM、一些设备区域等。例如,对于 16 GiB 的物理地址空间,1.5 GiB 可能会保留给非 RAM 的东西,因此最大 RAM您可能拥有(以及 32 位操作系统可以使用的最大值)可能是 14.5 GiB。

    遗憾的是(?)大多数主板不支持 CPU 能够使用的最大 RAM 量。例如,许多现代 CPU 支持 48 位物理地址(256 TiB 物理地址空间),但我从未见过能够支持超过 8 TiB RAM 的主板,而大多数现代主板甚至不支持 1内存的 TIB。

    同样,各种操作系统都有自己的限制。例如,大多数 32 位版本的 Windows 不支持 PAE(最初是因为设备驱动兼容性问题,后来因为大家都采用了 64 位,所以没人关心);因此,如果您的计算机具有(例如)8 GiB RAM,则操作系统无法使用大部分 RAM(并且可能只能使用 3 GiB 的 RAM,因为 ROM 可能保留/使用了 1 GiB 的空间、设备等)。

    请注意,对于 80x86 上的 64 位操作系统;虚拟地址是 48 位(不是 64 位),物理地址是从 32 位(Atom)到 52 位(也不是 64 位)的任何东西;并且英特尔一直在考虑“5 级分页”扩展以允许 57 位虚拟地址(仍然不是 64 位)。

    一般情况下(如果您忽略特定的 CPU);通用寄存器的大小、虚拟地址的大小和物理地址的大小都可以完全不同;对于 32 位操作系统(使用 32 位通用寄存器),虚拟地址空间大小可以是任何东西,而物理地址空间大小可以是任何东西;您在物理地址空间中可以拥有的最大 RAM 量可以是任何值。

    【讨论】:

      【解决方案4】:

      [我可能误解了这个问题。我以后可能会删除这个答案。]

      对于具有 32 位(4 字节 -- 假设 8 位字节)地址的系统,有 232 个不同的地址值。如果内存空间被 RAM 完全填充,那么您可以使用 32 位地址来引用系统上 232 字节内存中的任何一个。

      但是您不能同时将所有这 232 个地址值存储在内存中。正如您所说,您需要 4 * 232 个字节来存储所有这些地址值。

      幸运的是,没有必要将所有这些不同的内存地址值存储在内存中。您只需要存储您实际使用的那些地址值。

      (我忽略了虚拟内存与物理内存的问题。)

      【讨论】:

      • 所以你是说人们说4GB的时候,是指最大的地址数,也就是4x10^9(0到4GB-1)?但我仍然感到困惑的是,我的教科书上写着“32 位字长将虚拟地址空间限制为 4GB,即刚好超过 4 x 10^9 字节。”这句话中的“字节”一词对我来说没有意义。
      • 2^32 个可能的地址值中的每一个都指向一个字节在内存中的位置。教科书中的陈述暗示地址值恰好占据一个“单词”。例如,32 位地址值 0x12345679 将引用地址值 0x12345678 所引用的字节之后的字节。
      • 我认为您误解了 OP 的问题。它与将所有可能的内存地址存储在 RAM 中无关。 OP 认为内存地址指向 32 位块而不是单个字节。
      • @FeiXiang:我想你可能是对的。如果 OP 确认这一点,我将删除我的答案。
      • 顺便说一句,我不是反对者,所以我不知道这是否是其背后的真正原因。
      猜你喜欢
      • 2010-11-10
      • 2021-02-12
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2012-12-02
      • 2013-10-31
      • 2013-08-29
      相关资源
      最近更新 更多