32 位系统上 4GB 限制背后的数学原理

2023-12-24

我有一个与 32 位内存地址相关的非常基本的问题。我的理解是2^32是32位系统上可能的内存地址的最大数量。我感到困惑的是我们如何从这个数字达到所谓的 4GB 限制。在我的研究中我看到有些人 http://www.zdnet.com/blog/hardware/clearing-up-the-3264-bit-memory-limit-confusion/3124做这个:

2^32 = 4,294,967,296 字节

4,294,967,296 / (1,024 * 1,024) = ~4 GB

首先,这个(1,024 * 1,024)从哪里来?

其次,如果我错了,请纠正我,但 4,294,967,296 被标记为字节,因为字节是 RAM 中可以寻址的最小存储空间单位。由于我们限制为 2^32 个地址,这就是可以寻址的字节数。

第三,尽管 RAM 中的最小可寻址空间是一个字节,但硬盘驱动器的情况一定不是这样,因为 32 位系统的硬盘空间通常超过 4 GB。有人可以简要描述一下硬盘的寻址方案吗?


这是基本算术的情况:每个寻址单元的字节数乘以可寻址单元数等于可寻址字节数。

困难的部分是,从哪里获得这些数字。这是我的看法:

1 - 什么是千字节、兆字节、千兆字节?

  • 对于 RAM,人们一致认为 1 Gigabyte 为 1024 MB,每个兆字节由 1024 KB 组成,每个 KB 为 1024 字节。这是因为 1024 是 2^10,但足够接近 1000,历史上允许使用 Kilo 前缀
  • 对于存储,供应商多年前就开始严格使用十进制单位,1 兆字节为 1000000 字节(因为它使容量在精美的手册中看起来更大)

这导致 1024*1024 字节被称为 MiB,1000*1000 字节被称为 MB

2 - 可寻址单元

  • 对于 RAM,可寻址单元是字节,即使它是以至少 4 个块的形式从物理 RAM 中获取的。
  • 对于海量存储,可寻址单位是扇区或块,最常见的是 512 字节,但 4096 字节也很快赶上。

3 - 可寻址单元的数量要复杂得多,让我们从 RAM 开始:

  • 32 位 CPU(sansMMU!)可以寻址 2^32 字节或 4 GiB
  • 所有现代 32 位 CPU 都包含一个 MMU,它将这 4 GiB 虚拟地址空间映射到物理地址空间
  • 该物理地址空间的大小可以不同于 4 GiB,具体取决于 MMU 使用多于(或在史前时期少于)32 条物理地址线。当今最常见的实现是 36 个或更多物理位,从而产生 16*4 GiB 或更多(PAE 或物理地址扩展)
  • 这个 MMU 魔法可以做到not围绕以 32 位模式运行的 CPU,即对于每个进程,地址空间不能大于 4 GiB
  • 为了让事情变得更有趣,在我所知道的每个现代操作系统中,该地址空间的一部分都用于内核功能。这导致最大 2 GiB 或 3 GiBusable所有主流操作系统的每个进程的地址空间。
  • 因为这仍然太简单了:在操作系统必须支持的模式下运行 MMU,它实际上可以使用超过 4 GiB 的物理 RAM。一个显着的例子是 Windows XP 32 位,它不允许这样做。
  • 最后但并非最不重要的一点是:物理地址空间的一部分最常用于内存映射硬件。如果这与上述操作系统限制相结合,则会导致 Windows XP 32 位有时只能使用 2.5 到 3.5 GiB 的物理 RAM

存储方面的麻烦要少得多:

  • 在我所知道的所有现代基于 PC 的情况下,可寻址单元只是用 32 或 48 位(LBA 或逻辑块寻址)来计数。即使在最基本的版本中,2 TiB 的存储也足够了per disk(2^32 个块,每个块 512 字节)。具有 48 位 LBA 和每块 4 KiB 的最大输出版本导致大约。每个磁盘有 Gazillion TiB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

32 位系统上 4GB 限制背后的数学原理 的相关文章

  • 在 Python 中读取和解释二进制文件中的数据

    我想逐字节读取文件并检查每个字节的最后一位是否已设置 usr bin python def main fh open tmp test txt rb try byte fh read 1 while byte if int byte 16
  • 以 4 为底的二进制 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何将数字从二进制转换为基数 4wi
  • 在 64 位 C++ 程序中使用 32 位库

    有什么方法可以在 64 位系统中使用旧的 32 位静态库 a 吗 没有机会获得这个旧库的源代码来再次编译它 我也不想在 gcc 中使用 m32 因为该程序使用许多 64 位库 谢谢 这完全取决于您运行的平台 例如 PowerPC 上的 OS
  • 在 32 位和 64 位 C# 世界中使用 System.Data.SQLite 的选项

    我了解为什么在 32 位和 64 位版本中提供 System Data SQLite dll 因此 我们不要纠缠于此 继续前进 由于采用这种方式 纯 C 开发似乎变得更加困难 需要做出 3 个选择 是只支持32位并强制有托管 编译 x86
  • x86 32 位汇编代码是否有效 x86 64 位汇编代码?

    所有 x86 32 位汇编代码都对 x86 64 位汇编代码有效吗 我想知道32位汇编代码是否是64位汇编代码的子集 即每个32位汇编代码都可以在64位环境中运行 我想答案是肯定的 因为64位Windows能够执行32位程序 但是后来我看到
  • 为什么 C 没有二进制文字?

    我经常希望我能在 c 中做这样的事情 val1 0b00001111 clear high nibble val2 0b01000000 set bit 7 val3 0b00010000 clear bit 5 使用这种语法似乎是对 C
  • 在 Swift 中,如何将现有的二进制文件读入数组?

    作为我的项目的一部分 我有一个二进制数据文件 其中包含大量 32 位整数 我的一个类在初始化时读入该文件 在我的 C 库中 我使用以下初始化程序读入它 Evaluator Evaluator m HandNumbers resize 324
  • 64 位定点乘法错误

    我正在 C 中实现一个 64 位定点有符号 31 32 数字类型 基于long 到目前为止 加法和减法都很顺利 然而 乘法有一个我正在尝试解决的恼人的情况 我当前的算法包括将每个操作数分为最高和最低有效 32 位 执行 4 次乘法分为 4
  • 什么是低位和高位?

    谁能告诉我什么是低位和高位 如何识别高位和低位 下面是二进制形式 如何0110里面有更高位吗 0110 0111 1100 1010 1100 0111 1001 1011 就像十进制一样 二进制中较高位通常写在左侧 所以如果你看到0111
  • 是否存在用于将 C++ 代码移植到 64 位的自动转换工具?

    我正在研究将大量 gt 10M 行 C 代码移植到 64 位的方法 我已经研究了静态代码分析器和编译器标志 现在正在研究可以进行常见的重复更改的宏或其他工具 我写了一些正则表达式来看看它们在实践中的效果如何 正如预测的那样 它们非常有效 也
  • 如何将 std::map 输出到二进制文件?

    我怎样才能输出一个std map到二进制文件 地图声明如下所示 map
  • 如何创建二进制补丁?

    为二进制文件制作补丁的最佳方法是什么 我希望用户能够简单地应用 一个简单的patch应用程序会很好 在文件上运行 diff 只是给出Binary files differ 查看bsdiff and bspatch website http
  • 在Windows中比较2个二进制文件的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个工具来比较两个二进制文件 文件相当大 我在互联网上找到的一些免费软件或试用工具不方便用于大文件
  • 如何使用 hibernate JPA 2 以二进制形式存储 uuid

    我有一个关于通过休眠持久化 JPA2 在数据库中以二进制形式存储字符串uuid的问题 我现在正在使用这段代码 private UUID id Id Type type uuid char GeneratedValue generator s
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • 是否存在 UTF-8 编码中未使用的字节?

    据我了解 UTF 8 是 ASCII 的超集 因此包括不用于表示可打印字符的控制字符 我的问题是 是否有任何字节 256 个不同的字节 未被 UTF 8 编码使用 我想知道你是否可以转换 编码UTF 8 文本转二进制 这是我的思考过程 我不
  • 如何将十进制整数转换为十六进制整数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions cout lt
  • 计算数字的二进制表示形式中 1 的数量的最佳方法。 (MIPS)

    我需要计算二进制数中 1 的数量 比如说 5 所以 00001001 将是 2 或 n 2 我正在使用 MIPS 最好的方法来做到这一点 最好的方法是count them 您可以检查是否设置了最低有效位 a1 by and用一个来代替它 如
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 在 64 位操作系统上以 32 位运行 IIS 与以 64 位运行 IIS 有何优缺点?

    可能更适合 机架溢出 但从开发人员的角度来看 在 64 位 Windows 主机上将 IIS 同时服务于传统经典 ASP 和 NET 作为 32 位进程而不是 64 位进程运行有哪些优点和缺点 32 64 iis 服务器 相对于 32 32

随机推荐

  • jQuery - 从所选选项获取自定义属性

    鉴于以下情况
  • 使用批处理脚本附加文件夹名称并加 1

    我对批处理脚本的这一部分有点陌生 但我想做的是附加一堆文件夹名称并递增 1 同时尊重时间戳 即最新的文件夹在前 最旧的文件夹在最后 我看过其他脚本没有效果 Before Folder 1 Folder 2 Folder 3 Folder 4
  • 仅在时间序列中填充有限数量的 NA

    有什么办法可以让我们填补NAs in a zoo or xts数量有限的对象NA向前 换句话说就像填充NA最多连续 3 个NAs 然后保留NA从第 4 个值开始直到有效数字 像这样的东西 library zoo x lt zoo 1 20
  • 自动布局 UILabels

    我有三个UILabels按照我的习惯UITableViewCell 这可能是一些UILabels将是空的 label text UITableViewCell tableView UITableView tableView cellForR
  • 在 R 中为逻辑回归模型绘制多条 ROC 曲线

    我有一个逻辑回归模型 使用 R 作为 fit6 lt glm formula survived ascore gini failed data records family binomial summary fit6 我在用着pROC用于绘
  • Javascript通知解决方案库:桌面、声音、弹出、标题栏闪烁等

    是否有任何 Javascript 库支持在长时间运行的操作 例如上传 结束时发出通知 通知最好是通用的 这样即使某些技术不起作用 例如桌面通知 浏览器仍然能够引起注意 声音铃声 桌面通知 Chrome Stackoverflow com 风
  • 在Python中解析JSON时出现各种错误

    尝试从需要登录的 url 解析 json 在这里包括我的所有代码 因为我不确定错误在哪里 try import simplejson as json except ImportError import json import urllib2
  • 使用 .after() 添加 html 关闭和打开标签

    我试图通过找到列表的中间点并添加将无序列表分成两列 ul 在那之后 这可能是完全错误的方法 但这是我的想法 我的js看起来像这样 container ul each function var total this children leng
  • 有没有办法在 Racket 中查看 lambda 的主体?

    假设我有这段代码 lang racket define a x x y y z w w z 我凭直觉知道这个 lambda 表达式 扩展地 等于 z z 我的问题是是否有办法打印出正文a如果我想看看 Racket 在内部简化了多少功能 更多
  • 如何从数组元素中删除字符?

    我有一个像这样的数组 ee 3 4 22 22 我想删除逗号 或将其替换为 34使数组看起来像这样 ee 3 4 22 22 or this ee 3 4 34 22 34 22 34 原因是我试图将该数组从 Ruby 传递到 JavaSc
  • Asp Core 发布时错误的程序集重定向

    使用 Visual Studio 发布我的 ASP Core 项目时 config文件与我的可执行文件一起创建 The config包括几个bindingRedirect像这样
  • NIO SocketChannel 读取超时? [复制]

    这个问题在这里已经有答案了 如果连接建立后一段时间内没有收到数据 设置超时关闭 NIO SocketChannel 的最佳方法是什么 Either 您正在使用一个Selector 在这种情况下 您可以选择一个可以使用的超时 如果超时 sel
  • 如何手动创建 Apache Windows 服务

    我在尝试安装另一个 Apache Web 服务器时不小心删除了 Apache Windows 服务 有谁知道如何从 cmd 创建另一个 Apache Windows 服务 我尝试了 sc create 但最后缺少一个脚本 例如 k star
  • @PreAuthorize 和 hasPermission() 执行代码两次

    我想使用 PreAuthorize Spring 注释来控制应用程序中的访问 问题是 我有很多条件不取决于请求参数 而是取决于数据库实体 概述 我有一个Route实体 具有User owner场地 您可以删除Route仅当您是所有者时 我已
  • 为什么 tanh 在我的机器上比 exp 快?

    这个问题源于一个单独的问题 https stackoverflow com questions 43033593 why is using tanh definition of logistic sigmoid faster than sc
  • 如何从 R 中的帮助页面获取文本数据?

    在全球范围内 我有兴趣从 R 文档中获取所有文本数据 将它们放入数据框架中并应用文本挖掘技术 包级别 假设我对一个包感兴趣 例如 utils 并且我想获取向量中的所有文本数据 这有效 package d lt packageDescript
  • Omnipay PayPal Express 是否有信用卡功能?还是只能在 PayPal Pro 中使用?

    这个问题可能类似于THIS https stackoverflow com questions 28218397 using paypal pro in omnipay and THIS https stackoverflow com qu
  • 如何使用 nltk 从字符串中提取名称

    我正在尝试从非结构化字符串中提取名称 印度 这是我的代码 text Balaji Chandrasekaran Bangalore Senior Business Analyst Lead Business Analyst An accom
  • Stub_chain 与 should_receive 一起

    我正在尝试测试方法调用链中的方法之一是否获得特定参数 在下面的代码中 例如 MyModel 必须接收该方法的参数 0offset 不幸的是 下面的代码不起作用 似乎不可能混合should receive和stub chain 我该如何解决这
  • 32 位系统上 4GB 限制背后的数学原理

    我有一个与 32 位内存地址相关的非常基本的问题 我的理解是2 32是32位系统上可能的内存地址的最大数量 我感到困惑的是我们如何从这个数字达到所谓的 4GB 限制 在我的研究中我看到有些人 http www zdnet com blog