进程页表

2024-02-01

我有兴趣更好地了解虚拟内存和页面机制,特别是 Windows x86 系统。根据我从各种在线资源收集的信息(包括在 SO 上发布的其他问题),

1) 每个进程的单独页表位于同一进程的内核地址空间内。

2) 每个进程只有一个页表,包含虚拟页到物理页(或帧)的映射。

3) 给定虚拟地址对应的物理地址是由内存管理单元(MMU)计算出来的,本质上是使用提供的虚拟地址的前20位作为页表的索引,使用该索引来检索页表的起始地址物理帧,然后根据虚拟地址的剩余 12 位向该地址应用一些偏移量。

这三种说法是否正确?或者我误解了这些信息?


因此,首先让我们澄清一些事情:

  1. 对于 x86 架构,决定分页策略的不是操作系统,而是 CPU(更具体地说是 MMU)。操作系统如何看待分页系统与其实现方式无关。正如评论者正确指出的那样,分页模型有一个特定于操作系统的组件。这从属于硬件的工作方式。
  2. 32 位和 64 位 x86 处理器具有不同的分页方案,因此如果不指定处理器的字大小,就无法真正谈论 x86 分页模型。

下面是 32 位 x86 分页模型的大规模压缩版本,使用的是最简单的版本。还有许多可能的额外调整,我知道各种操作系统都使用它们。我不会讨论这些,因为我不太熟悉大多数操作系统的内部结构,而且在掌握了更简单的东西之前,你真的不应该讨论这些。如果您想了解 x86 分页模型的所有奇妙之处,您可以访问 Intel 文档:英特尔系统编程指南 http://www.intel.com/Assets/PDF/manual/325384.pdf

在最简单的分页模型中,内存空间被划分为 4KB 的块,称为页。其中 1024 个连续块被映射到页表(大小也是 4KB)。对于进一步的间接级别,所有 1024 页表都映射到 4KB 页目录,并且该目录的基地址位于特殊寄存器中%cr3在处理器中。这种两级结构的存在是因为操作系统中的大多数内存空间都是sparse这意味着其中大部分未被使用。您不想为未触及的内存保留一堆页表。

当您获得内存地址时,最高有效 10 位将索引到页目录中,从而为您提供页表的基础。接下来的 10 位索引到该页表中,为您提供物理页(也称为物理帧)的基础。最后,最后 12 位索引到帧中。 MMU 会为您完成所有这些工作,假设您已设置%cr3到正确的值。

64位系统有一个4 level分页系统,因为它们的内存空间更加稀疏。此外,页面大小也可以不是 4KB。

要真正回答您的问题:

  1. 所有这些分页信息(表、目录等)都位于内核内存中。请注意,内核内存是一大块,并且不存在为单个进程提供内核内存的概念。
  2. 只有一页目录每个进程。这是因为页目录定义了一个内存空间,每个进程都只有一个内存空间。
  3. 上面的最后一段介绍了地址的分割方式。

编辑:清理和细微修改。

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

进程页表 的相关文章

随机推荐

  • fstream 文件结尾问题

    我正在读取多个文件 这些文件大约有 300 个 由于某种原因 如果我将循环设置为运行超过 3 次迭代 则应该迭代每一行的 while 循环将变得无限 我的问题是 我是否忘记在 while 循环中包含一些内容 现在我只是尝试一次读取一行 最终
  • Android + 字符串

    谁能告诉我 Android 中的 toString 是什么以及如何使用它 作为例子将受到高度赞赏 toString http download llnw oracle com javase 6 docs api java lang Obje
  • SQL 中的特殊字符转义

    Oracle 有没有一种简单的方法来转义 SQL 语句中的特殊字符 即 我看到了这个link http orafaq com faq how does one escape special characters when writing s
  • php://输入返回空

    我有骨干应用程序 当模型更新时 PUT 请求会发送到我的服务器 客户端看起来不错 但在服务器端 PHP 我遇到了一些麻烦 当我第一次在 PHPStorm 中测试这个请求时 file get contents php input 返回我所期望
  • 使用 jQuery 确定相对路径

    我在顶级域下的子文件夹中安装了几个 WordPress 站点 http www mydomain com site a http www mydomain com site a http www mydomain com site b ht
  • 节点 - 将 jest 与 esm 包一起使用

    我想知道如何合并esm包裹https www npmjs com package esm https www npmjs com package esm在节点后端使用笑话 我尝试设置一个安装文件require esm and require
  • 谷歌分析 4 与 React

    我一直在尝试在我的应用程序中将 React ga 包与 google Analytics 4 一起使用 测量 ID 不适用于它 并且我可以使用的 google Analytics 4 中没有跟踪代码 拜托 我需要帮助 import Reac
  • jquery根据背景图像名称选择元素

    我正在尝试选择一个具有特定背景图像的 div 这是我迄今为止所拥有的 不工作 对我做错了什么有什么想法吗 我正在尝试遵循 jQuery 文档 var markerShadow0 div background image url http w
  • 在电子邮件中发送内嵌图像

    通过电子邮件将图像作为正文中的嵌入图像发送时遇到问题 图像文件显示为附件 这没问题 但内联图像部分仅显示为红色 x 这是我到目前为止所拥有的 LinkedResource inline new LinkedResource filePath
  • 如何使用 mox 模拟类属性?

    我有一堂课 class MyClass object property def myproperty self return hello Using mox http code google com p pymox and py test
  • AS3:调用静态类方法 - 类和方法名称是字符串

    我有一个丑陋的问题 我有两个字符串变量 className 和 staticMethod 存储类的名称以及我必须调用的静态方法 package import flash display Sprite import flash utils g
  • 如何显示定义的值

    在一些 doxygen 文档中 我想显示 define 而不是标签本身 例如 在一个 C 文件中我有 define REPEAT N TIMES 10 现在我想在我的文档中显示 该动作进行10次 如果我使用 ref REPEAT N TIM
  • 无符号函数必须返回一些东西吗?

    嘿 我正在做一个练习 我必须用 C 编写一个无符号函数 我有一个问题 我是否必须因为函数的类型而返回一些东西 还是可以选择的 在正常使用中 任何声明返回值的函数都应该返回一个值 这很大程度上是一个良好的编程实践的问题 未能返回值通常是错误的
  • 从 Java 类生成 JSON 模式

    我有一个 POJO 类 public class Stock int id String name Date date 是否有任何注释或开发框架 API 可以将 POJO 转换为 JSON 模式 如下所示 id type int name
  • 如何获取 Qt 应用程序的当前工作目录路径?

    我正在使用 Qt 库用 C 编写程序 我想获取我的程序的当前工作目录 我找到了QDir 当前路径 and QCoreApplication applicationDirPath 函数 但它们返回应用程序可执行文件所在的目录 我不想获取包含应
  • 选择许多三层深度

    我可以使用 SelectMany 展平集合中子集合的结果 a list of Foos a Foo contains a List of Bars var source new List
  • 使用 lm 对独特因子组合的子集进行回归

    我想对由分组变量的独特组合定义的子集自动执行简单的多元回归 我有一个数据框 其中包含多个分组变量 df1 1 6 和一些自变量 df1 8 10 以及响应 df1 7 这是数据的摘录 structure list Surface struc
  • HttpsServer 使用curl 导致CPU 负载100%

    我已经围绕 Java 创建了一个最小的应用程序HttpsServer https docs oracle com en java javase 11 docs api jdk httpserver com sun net httpserve
  • LogonUserEx、DuplicateTokenEx 用于在 C# 中使用 ObjectContext 进行模拟

    我们有一个特定的 SQL Server 我们需要从厚客户端 Net 4 0 WPF 访问它 并且我们用于该连接的唯一凭据是 服务 帐户 该帐户实际上是具有 SQL 权限的 Active Directory 帐户服务器 我在整个项目中使用实体
  • 进程页表

    我有兴趣更好地了解虚拟内存和页面机制 特别是 Windows x86 系统 根据我从各种在线资源收集的信息 包括在 SO 上发布的其他问题 1 每个进程的单独页表位于同一进程的内核地址空间内 2 每个进程只有一个页表 包含虚拟页到物理页 或