为什么 32 位处理器只能寻址 4GiB 内存,即使字大小很大?

2024-01-24

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)),因此进一步限制了用户内存。有几种方法可以解决这个问题

  • 生成多个进程,用于 Adob​​e Premiere CS4
  • 将所需的内存部分映射到当前地址空间,例如地址窗口扩展 https://en.wikipedia.org/wiki/Address_Windowing_Extensions在 Windows 上
  • ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 32 位处理器只能寻址 4GiB 内存,即使字大小很大? 的相关文章

随机推荐

  • 如何配置 ACTION_IMAGE_CAPTURE 将照片存储在公共外部存储中?

    The 拍照简单记录 https developer android com training camera photobasics html建议将使用设备相机拍摄的图像存储为 应保存在设备上的公共外部存储中 但如何做到这一点呢 提供的示例
  • 麦克风实时音频播放。 C#

    我希望创建一个应用程序 允许我从麦克风录音并通过其他电脑播放录音 然而 此时我只想让它在我自己的计算机上播放 这样我就可以让它工作了 过去几个小时我一直在关注 NAudio 它似乎可以帮助我实现这个目标 我只是想知道其他人是否有这方面的经验
  • 如何设置 joingrid 中每个 kdeplot 的线条样式

    我正在使用seaborn创建一个具有边际分布的kdeplot 如中所述这个答案 https stackoverflow com a 49658133 1232833 我对代码做了一些修改 得到了这个 import matplotlib py
  • 例如,在 C++ 中,set precision (12) 和 set precision (012) 之间存在差异的原因是什么?

    例如 在 C 中 当您编写 set precision 12 时 12 是以 10 为底数 但是当您编写 set precision 012 时 它是一个八进制数 为什么 因为带有前导零 前导 0x 除外 的常量始终是八进制 八进制整数文字
  • 如何在android上使用socket.io和后台服务?

    我在android聊天应用程序上使用gottox socket io java client 现在我想使用socket io作为后台服务 在聊天应用程序中如果有新消息 当聊天应用程序关闭时 发送一条通知 如 聊天应用程序上的新消息 如果您想
  • 如何获取应用程序中给定目录中所有文件的文件名 NSArray?

    我想做的事情似乎很简单 在我的应用程序上的给定 目录 中获取文件名数组 但是我越多地使用 NSFileManager 和 NSBundle 我发现自己越迷失 我只想获取在我的 iPhone Xcode 项目中的特定目录中组织的文件的文件名
  • 如何检查项目的 vue.js 版本?

    I use 乌班图16 04我想知道如何检查vue js version我的项目使用的 我怎么做 让我们总结一下 jonrsharpe JamesAMohler 和 MartinCalvert 的解决方案 供寻求快速答案的朋友参考 Run
  • Guice - 使用静态辅助方法将依赖项注入到类中

    我对 Guice 还很陌生 之前没有使用过任何 DI 框架 在阅读了官方 wiki 和许多其他文档后 我仍然无法完全理解它 在我的特定情况下 我想编写一个使用其他 待注入 类的 EL taglib 函数 由于所有 taglib 函数都必须声
  • Ionic 4 标签样式

    我试图为 ionic 4 应用程序中的选项卡提供渐变背景 我还尝试为每个页面设置不同的颜色 渐变 背景 控制每个页面的 scss 中选项卡的样式 想要的效果如下 For
  • 使用 Roslyn 编译 xaml [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有办法使用Roslyn编译器来编译WPF UserControl 假设您想要编译一个包含标准 C
  • Resharper 中的 Jasmine 测试不会停止执行

    我使用 Visual Studio 2012 和 ReSharper 8 2 来测试我的 JavaScript 代码 到目前为止 使用 QUnit 工作得很好 在编写 Jasmine 测试时 当在文件开头添加以下行时 测试不会停止
  • Flexbox 等高不起作用

    我正在尝试将 flexbox 与 susy 一起使用 但不知何故它不起作用 我尝试了我在这里找到的所有问题 但它总是会中断 并且文本容器和图像容器不能保持相同的高度 移动视图从 38 em 开始工作 但不能 这就是我尝试过的 一旦我添加di
  • C++ 阻塞工作队列

    这个问题应该比我上几个简单一点 我在我的程序中实现了以下工作队列 Pool h tpool class It s always closed glasses ifndef POOL H define POOL H class tpool p
  • ImageMagick:此图像格式“”没有解码委托@ error/constitute.c/ReadImage/504

    Problem ImageMagick Convert 无法裁剪图像 看起来它不识别图像类型 我尝试过的 我在网上搜索了一下 发现了几个类似的问题 但不是我的 我尝试过他们的解决方案 包括 通过brew卸载并重新安装ImageMagick
  • 在Java中使用“instanceof”[重复]

    这个问题在这里已经有答案了 instanceof 运算符的用途是什么 https stackoverflow com questions 7313559 what is the instanceof operator used for 我了
  • 不同处理器上的浮点计算是否会有所不同? (+在 C# 和 C 之间传递双精度数)

    我有一个用 C 编写的应用程序 它也调用一些 C 代码 C 代码获取一些双精度值作为输入 对其执行一些计算 将其传递到本机层 由本机层对其执行自己的计算 然后传回 C 层 如果我在不同的机器上运行相同的exe dll 它们都是Intel的x
  • 从 gradle 中的多个依赖项中排除同一组?

    我的 Android 项目的应用程序模块的 build gradle 中有以下代码 implementation com google firebase firebase core 16 0 1 exclude group com andr
  • XCode 4,签名无效 (-19011)

    我要疯了 我正在使用 XCode 4 最后我完成了我的应用程序 我正准备将其提交到 App Store 上传到 iTunes Connect 我尝试构建存档 但出现了此警告 Application failed codesign verif
  • cx_freeze 错误:找不到模块 tkinter

    我开始遇到一些 miniconda 和 PyCharm 问题 所以我不得不重新安装它们 但是 现在当我使用 cx freeze 创建 exe 时 出现以下错误 这是我的代码 from tkinter import from tkinter
  • 为什么 32 位处理器只能寻址 4GiB 内存,即使字大小很大?

    Until now I thought that a 32 bit processor can use 4 GiB of memory because 232 is 4 GiB but this approach means process