V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maxhhg
V2EX  ›  程序员

不懂就问: 32 位操作系统是如何突破 4G 内存限制的?

  •  
  •   maxhhg · 2020-10-11 15:51:37 +08:00 · 3682 次点击
    这是一个创建于 1285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    32 位的系统能表达的内存位置只有 2 的 32 次方个,也就是 4G,但我在网上看到 内存是可以突破 4G 的

    于是我就去 Google 一下,确实可以,但是基本没有讲原理的,即使讲了,也没有讲得很清楚(可能是我理解力不够吧)

    我想问问大佬们:32 位操作系统是如何突破 4G 内存限制的?

    12 条回复    2020-10-12 14:46:39 +08:00
    louettagfh
        1
    louettagfh  
       2020-10-11 15:57:27 +08:00   ❤️ 1
    开启 Intel 的 PAE (物理地址扩展)模式就可以
    blless
        2
    blless  
       2020-10-11 16:07:53 +08:00
    Intel 的 CPU 可以开启 PAE 机制吧?
    >>> 然而,使用 PAE 的主要问题是线性地址仍然 32 位长。这就迫使内核编程人员用同一线性地址映射到不同的 RAM 区。很明显,PAE 并没有扩大进程的线性地址空间,因为它只处理物理地址。此外,只有内核能够修改进程的页表,所以在用户态下运行的进程不能使用大于 4GB 的物理地址空间。另一方面,PAE 允许内核使用容量高达 64GB 的 RAM,从而显著增加了系统中的进程数量。
    https://www.cnblogs.com/buaasts/p/4038683.html

    毕竟 CPU 指针限制只能支持 4G 寻址,只是可以把不同进程的地址映射到不同的地址空间,提升进程数量而已。其实也不能算突破 4G 内存。
    12101111
        3
    12101111  
       2020-10-11 16:09:23 +08:00
    16 位下能用 20 位的地址宽度,32 位下能用 36 位的地址宽度,前者是靠分段(16 位段描述符), 后者是靠页表映射.
    但是即使是在 32 位下,虚拟地址空间也只能是 4G, 因此单个进程无法直接突破 4G 的寻址限制,只能靠 mmap 之类的方式进行.
    misdake
        4
    misdake  
       2020-10-11 16:18:10 +08:00
    严格来说 “32 位的系统能表达的内存位置只有 2 的 32 次方个,也就是 4G” 其实应该是 “同一时刻,单个进程能寻址的内存位置有 4G”
    多个进程(使用不同的页表)、或者不同时刻(修改页表前后),都可以某种程度上突破这个限制。
    theolin
        5
    theolin  
       2020-10-11 16:18:18 +08:00
    是 Intel PAE 技术。说起来很简单,原本 32 位处理器地址线也是 32 位,但是搭载 PAE 技术的处理器地址线是 36 位。所以,只要操作系统支持,就可以访问多达 64GB 内存。
    maxhhg
        6
    maxhhg  
    OP
       2020-10-11 16:27:09 +08:00
    @louettagfh @blless @12101111 @misdake @theolin
    谢谢各位大佬
    Mohanson
        7
    Mohanson  
       2020-10-11 16:28:49 +08:00 via Android   ❤️ 6
    源头来讲大概是一项古老的技术,最早出现在 8 位机时代,叫做存储体切换 Bank switching,原理和 PAE 几乎一样。

    像 gb 游戏机就在在 64k 寻址的 8080 cpu 中做出了 32 兆大小的游戏

    http://accu.cc/content/gameboy/cartridge/memory_bank_controller/
    nightwitch
        8
    nightwitch  
       2020-10-11 17:45:46 +08:00
    老历史了,类似的思想最早可以追溯到保护模式出现之前。历史里比较有名的是 8086,8086 的寄存器只有 16 位,16 位只能寻址 64KB 的内存。但是实际上 8086 可以最大寻址 20 位,也就是 1MB,因为 8086 使用两个寄存器寻址。
    levelworm
        9
    levelworm  
       2020-10-11 17:50:02 +08:00 via Android
    @Mohanson 不错刚想说这个。。。
    jzmws
        10
    jzmws  
       2020-10-12 09:32:11 +08:00
    这个是 xp 时代最经常用的
    julyclyde
        11
    julyclyde  
       2020-10-12 14:19:19 +08:00
    @jzmws xp 对这俩应该是都不支持的吧
    bclerdx
        12
    bclerdx  
       2020-10-12 14:46:39 +08:00
    现在 32 位操作系统,应该已经逐步要退出历史舞台了吧。我 5 年前就已经换成了 64 位的 Windows 7 了。64 位还是比较好用的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1356 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:41 · PVG 07:41 · LAX 16:41 · JFK 19:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.