Until now I thought that a 32-bit processor can use 4 GiB of memory because 232 is 4 GiB, but this approach means processor have word size = 1 byte. So a process with 32-bit program counter can address 232 different memory words and hence we have 4 GiB.
但如果处理器有字大小大于 1 字节,我相信现在大多数处理器都是这种情况(我的理解是字大小等于数据总线的宽度,因此具有64位数据总线的处理器必须具有字大小= 8字节).
现在具有 32 位程序计数器的同一处理器可以寻址 2^32 个不同的内存字,但在这种情况下字大小为 8 字节因此它可以解决更多的内存问题,这与 4 GiB 的事情相矛盾,那么我的论点有什么问题呢?
Indeed a 32-bit program counter can address 232 different memory locations, but word-addressable memory is only used in architectures for very special purposes like DSPs https://en.wikipedia.org/wiki/Digital_signal_processor or antique architectures in the past https://stackoverflow.com/q/6971886/995714. Modern architectures for general computing all use byte-addressable memory.
See 为什么是字节寻址存储器而不是 4 字节寻址存储器? https://stackoverflow.com/q/1586944/995714
但实际上,现代 32 位 ISA 具有允许更宽地址的扩展,这通常是在 64 位版本 ISA 准备就绪之前作为权宜之计引入的。
你的前提是不正确的。32位架构可以寻址超过4GB的内存, 就像大多数(如果不是全部)8 位微控制器可以使用超过 256 字节的内存 https://stackoverflow.com/q/13674924/995714。当 32 位系统刚刚出现时,4 GiB 是巨大的,但现在却相当狭窄,尤其是系统范围的总内存(物理地址空间,与单个进程的虚拟地址空间)。
即使在现代 32 位字节可寻址架构中,也有很多方法可以访问超过 4GB 的内存。例如,64 位 JVM 可以使用 32 位指针寻址 32GB 内存压缩哎呀 http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop。请参阅JVM 压缩 Oops 背后的技巧 https://stackoverflow.com/q/25120546/995714
32 位 x86 CPU 还可以寻址 64GB(或更高版本中的更多)内存PAE https://en.wikipedia.org/wiki/Physical_Address_Extension。它基本上在 TLB 中添加了另一级间接寻址,并在地址中添加了更多位。这使得整个系统可以访问超过 4GB 的内存。然而应用程序中的指针仍然是 32 位长,因此每个进程最多仍然限制为 4GB。 ARM 上的模拟是LPAE https://en.wikipedia.org/wiki/ARM_architecture#Large_Physical_Address_Extension_.28LPAE.29.
每个进程的 4GB 地址空间通常分为用户空间和内核空间(崩溃之前 https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)),因此进一步限制了用户内存。有几种方法可以解决这个问题
- 生成多个进程,用于 Adobe Premiere CS4
- 将所需的内存部分映射到当前地址空间,例如地址窗口扩展 https://en.wikipedia.org/wiki/Address_Windowing_Extensions在 Windows 上
- ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)