Linux 如何在 x86-64 中支持超过 512GB 的虚拟地址范围?

2024-04-16

Linux 中 x86-64 的用户虚拟地址空间为 47 位长。这本质上意味着 Linux 可以映射大约 128 TB 虚拟地址范围的进程。

然而,令我困惑的是,x86-64 架构支持 ISA 为每个进程定义的 4 级分层页表(排列为基数树)。页表的根最多只能映射 512 GB 的连续虚拟地址空间。那么Linux如何能够支持超过512GB的虚拟地址范围呢?每个进程是否使用多个页表?如果是,那么对于一个进程,CR3(x86-64 的寄存器,包含页表基地址)应该包含什么?我错过了什么吗?


页表的根最多只能映射 512 GB 的连续虚拟地址空间。那么Linux如何能够支持超过512GB的虚拟地址范围呢?每个进程是否使用多个页表?如果是,那么对于一个进程,CR3(x86-64 的寄存器,包含页表基地址)应该包含什么?我错过了什么吗?

我不知道“页表的根”是什么意思,但 x86-64 上的分页看起来像这样:

  • 页表——最低级别的分页结构。每个都有 512 个 8 字节条目 (PTE) 描述一个 4 KiB 页,因此 PT 描述512 * 4 KiB = 2 MiB内存(它也可以用作 2 MiB 页,但我们暂时保留它)。
  • 页目录 - 表,类似于 PT,包含 512 个 8 字节条目(PDE),指向 PT;所以,PD 描述512 * 2 MiB = 1 GiB内存(也可以用作 1 GiB 页,类似于 PT)。
  • 页目录页表——与PD类似,但包含512个指向PD的8字节条目(PDPTE);所以,PDPTE 描述512 * 1 Gib = 512 GiB的记忆。
  • PML4,最高级别的分页结构,是包含指向 PDPT 的 512 个 8 字节条目(PML4E)的表;所以,PML4描述了512 * 512 GiB = 256 TiB的记忆。

我不知道 Linux 的确切内存映射,但可能是上半部分(从 -128 TiB 到 0 - 从0xFFFF800000000000 to 0xFFFFFFFFFFFFFFFF)保留给内核,下半部分(从 0 到 128 TiB - 从0x0000000000000000 to 0x00007FFFFFFFFFFF) 适用于用户空间应用程序。因此,Linux 支持您所要求的 512 GiB 虚拟地址范围的 512 倍;甚至 Torvalds 也不会说“我们不会支持 PML4”。我不知道是什么让您感到困惑 - 是不是您错过了说页表映射 2 MiB 的部分,而您却将其视为映射一页 - 4 KiB - 但如果有什么我可以澄清的,请询问它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 如何在 x86-64 中支持超过 512GB 的虚拟地址范围? 的相关文章

随机推荐

  • Rails,将文件上传到服务器时获取文件名

    我在 Rails 3 中使用 AJAX 上传器以及 paper clip 并在此处上传文件 def upload photo Photo create photo gt params file title gt params filenam
  • 有哪些 CSS 属性可以让元素脱离正常流程?

    有哪些 CSS 属性可以让元素脱离正常流程 这些属性可以是 float position absolute 等 这个问题涉及正常流程的所有可能的改变 只有以下属性会影响任何给定元素的正常流程 float right left positio
  • 在共享主机上安装 PHP 扩展

    我需要启用mcrypt https www php net manual en book mcrypt php我的网站上的功能 除了我在共享主机上 运行 Linux 并且显然无权访问php ini文件 似乎确实有安装 PEAR 模块的选项
  • 在 R 中从 MySQL 获取 UTF-8 文本返回“???”

    我一直在尝试从 R 获取 MySQL 数据库中的 UTF 8 文本 我在 OS X 上运行 R 通过 GUI 和命令行都尝试过 其中默认区域设置是 en US UTF 8 并且没有无论我尝试什么 查询结果都显示 对于所有非 ASCII 字符
  • Plotly 中子图的标题

    我正在尝试在 Plotly 中制作 3x3 子图的网格 我正在尝试为每个子图获取标题并在顶部获取主标题 但我似乎无法让它发挥作用 我看到这个很棒的网站 http takwatanabe me data science plotly layo
  • Python multiprocessing.Pool在MacOS和Linux系统上的不同性能

    我是 Python 初学者 我在项目中使用了 multiprocessing Pool 来提高性能 这是我使用 multiprocessing Pool 的代码片段 我在驻留服务器的开头构建池 并在每次服务器收到请求时使用 Pool app
  • 不定长度的数组[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在未知长度的排序数组中找到随机元
  • MFC:如何在一个函数中捕获对话框每个控件的设置焦点

    我有 n 个对话框 它们具有相同的基本对话框 每个对话框都有自己的控件 编辑框 组合框 列表控件 etc 在基本对话框中 如何设置每个控件的焦点消息 例如 给出一个消息框 text Hello I got focus my ID is d
  • XAMPP:无法启动 Apache (Windows 10)

    我正在使用 XAMPP 并且可以启动 Apache 但是 MySQL php我的管理员 https en wikipedia org wiki PhpMyAdmin start 当我开始时 我收到此错误 10 07 49 Apache Er
  • 无法更改视图中绘制的圆圈的颜色

    我正在尝试更新我在子类中创建的圆圈的颜色UIView通过在类中创建一个方法来更新颜色 如下所示 但颜色不会改变 import UIKit class badge UIView struct mine static var p UIBezie
  • Linux 文件权限的正则表达式(数字表示法)

    我一生都无法找出正确的正则表达式 我正在寻找的是一个正则表达式来匹配 Linux 文件权限的有效数字表示 例如 740 表示全部读取无 777 表示全部全部 到目前为止 我已经尝试过以下操作 strtotest 740 echo strto
  • 如何从视图范围的 JSF bean 获取请求参数?

    我有查看范围bean 应该在 init PostConstruct 上访问请求 URL 中的值并在其生命周期内存储它们 我了解到 为了获得价值http请求 我需要以下代码 ManagedProperty param x private in
  • iOS 相当于 Android 片段/布局

    在 Android 中 您可以使用 Fragments 只开发一款针对手机和平板电脑的应用程序 这样您就可以拥有不同的 UI 您甚至可以仅使用布局并对代码设置一些条件来运行平板电脑或手机逻辑 我需要为 iPhone 和 iPad 开发一个应
  • 仅根据lucene中term出现次数较多的文档来计算分数

    我开始研究基于 lucene net 引擎的简历检索 文档 组件 它工作得很好 它会获取文档并根据 VSM 背后的理念是 查询词出现在 a 中的次数 文档相对于数量 该术语出现在所有 集合中的文档越多 该文件的相关内容是 询问 Lucene
  • 在 sphinx 侧边栏中启用版本阅读文档主题

    我想将 versions html 包含在侧边栏中 但无法成功 我尝试在 中为侧边栏添加 versions html 但这没有效果 html sidebars versions html 另外如何声明不同的版本conf py 我看过sphi
  • data.table 中的条件(不等式)连接

    我只是想弄清楚如何对两个 data tables 进行条件连接 我写了一个sqldf条件连接给我提供其开始或结束时间在其他开始 结束时间之内的电路 sqldf select dt2 start dt2 finish dt2 counts d
  • XCode:如何在上传前验证 IPA 是否有效?

    我在创建 IPA 文件时遇到问题 TestFlight 向我展示了这个原因 http help testflightapp com customer portal articles 402843 mismatched keychain ac
  • 在数字中添加逗号(分组分隔符)而不修改小数?

    我正在尝试格式化字符串以在 3 位数字组之间添加逗号 EG 1200 20 gt gt 1 200 20 15000 gt gt 15 000 我正在尝试弄清楚如何使用 DecimalFormat 来完成此操作 到目前为止 我一直在使用自己
  • 如何在 Windows 上安装 Boost.Build?

    http www boost org boost build2 doc html bbv2 installation html http www boost org boost build2 doc html bbv2 installati
  • Linux 如何在 x86-64 中支持超过 512GB 的虚拟地址范围?

    Linux 中 x86 64 的用户虚拟地址空间为 47 位长 这本质上意味着 Linux 可以映射大约 128 TB 虚拟地址范围的进程 然而 令我困惑的是 x86 64 架构支持 ISA 为每个进程定义的 4 级分层页表 排列为基数树