问题

开启分页的x86保护模式和长模式下,操作系统是如何管理分页的?

回答
好的,让我们来聊聊 x86 架构下,开启了分页的保护模式和长模式时,操作系统是如何进行内存管理的。这可是一个涉及底层硬件和操作系统内核核心机制的话题,非常有趣。

想象一下,你的电脑就像一个大仓库,里面有许许多多的房间(内存页面)。操作系统就像仓库管理员,它需要知道每个房间里放了什么东西,哪些房间是空着的,以及谁有权限进入哪些房间。分页就是操作系统用来管理这个仓库的精妙方法。

为什么需要分页?

在没有分页的情况下,程序直接使用物理地址访问内存。这有很多问题:

内存碎片化严重: 程序分配和释放内存后,物理内存会变得支离破碎,难以分配连续的大块内存。
安全性差: 一个程序可以轻易地访问其他程序的内存,甚至操作系统本身的内存,导致系统不稳定甚至崩溃。
内存共享困难: 不同程序之间共享内存变得非常复杂。
无法支持虚拟内存: 没有分页,就无法实现将部分内存数据交换到硬盘上(虚拟内存),这限制了系统能运行的程序数量和大小。

分页通过将虚拟地址空间映射到物理地址空间来解决这些问题。

保护模式下的分页(32位 x86)

在保护模式下,x86 处理器引入了页目录(Page Directory)和页表(Page Table)的概念来管理分页。

1. 地址转换流程:
当 CPU 要访问一个虚拟地址时,它会执行一个三步查找过程:

定位页目录: CPU 使用一个特殊的寄存器,叫做 CR3(也称为 Page Directory Base Register, PDBR)。CR3 寄存器存储了当前进程的页目录的物理基地址。
查找页目录项(PDE): 虚拟地址的前 10 位被用作索引,在 CR3 指向的页目录中查找对应的页目录项(Page Directory Entry, PDE)。这个 PDE 包含了对应页表的物理基地址。
查找页表项(PTE): 虚拟地址的中间 10 位被用作索引,在 PDE 指向的页表中查找对应的页表项(Page Table Entry, PTE)。这个 PTE 包含了目标页面的物理基地址,以及一些控制位(权限、是否已加载到内存等)。
计算物理地址: 最后,将 PTE 中包含的物理页面基地址与虚拟地址的低 12 位(页内偏移)组合起来,就得到了最终的物理地址。

2. 分页结构组成:
页(Page): 内存被划分为固定大小的块,通常是 4KB。这是内存管理的最小单位。
页目录(Page Directory): 这是一个表格,里面存放着指向各个页表的指针。一个页目录可以映射 2^10 = 1024 个页表。
页表(Page Table): 这是另一个表格,里面存放着指向实际内存页面的指针。一个页表可以映射 2^10 = 1024 个页面。
页目录项(PDE)和页表项(PTE): 这两个都是 32 位的结构,包含了关键信息:
Present (P) 位: 标记该页是否已加载到物理内存中。
Read/Write (R/W) 位: 控制对该页的读写权限。
User/Supervisor (U/S) 位: 控制用户模式和内核模式的访问权限。
Accessed (A) 位: CPU 在访问页面时会设置此位,操作系统可以用它来跟踪哪些页面被频繁使用(用于页面置换算法)。
Dirty (D) 位: 当页面被写入时,CPU 会设置此位。这很重要,因为如果页面需要从内存中移除,而它被修改过(Dirty),就需要将其写回磁盘。
Page Size 位: (在某些实现中)允许使用更大的页面(如 4MB),这可以减少页表项的开销,但可能导致更多内碎片。
物理页帧号(Physical Page Frame Number): 这是 PDE 或 PTE 中最重要的部分,它指向了物理内存中的实际页面(或下一个级别的页表)。

3. 操作系统如何管理:
建立页表结构: 当一个新进程启动时,操作系统会为它分配一套完整的页表结构,包括一个页目录和一系列页表。这个过程就像为新搬进仓库的住户准备一套房间钥匙和房间地图。
分配物理页帧: 当程序需要访问某个虚拟地址时,如果对应的物理页面不在内存中(P 位为 0),就会触发一个页错误(Page Fault)。操作系统会捕获这个页错误,然后:
在物理内存中找到一个空闲的页帧。
如果需要,将数据从磁盘(例如,程序的代码段或交换空间)加载到这个空闲页帧中。
更新对应的 PTE,设置 P 位为 1,并填入新的物理页帧号。
恢复进程的执行,CPU 会重新尝试访问该虚拟地址,这次就能成功了。
权限控制: 当 CPU 尝试进行不被允许的操作(例如,用户模式程序尝试写入内核内存)时,也会触发页错误。操作系统会检查 PDE 和 PTE 中的权限位,如果发现违规,会终止该进程。
内存共享: 多个进程可以共享相同的物理页面。例如,多个进程可以共享同一个共享库(如 C 库)。操作系统只需要让它们的页表指向同一个物理页面即可。
虚拟内存: 当物理内存不足时,操作系统可以将不常用的页面数据写回磁盘(称为换出/Swap Out),然后将物理页帧重新分配给其他需要访问的页面。当需要访问被换出的页面时,再次触发页错误,将数据从磁盘换入内存(换入/Swap In)。

4. TLB (Translation Lookaside Buffer):
为了加速地址转换,CPU 内置了一个转换后备缓冲器(TLB)。TLB 是一个高速缓存,存储了最近使用过的虚拟地址到物理地址的映射关系。这样,对于频繁访问的页面,CPU 可以直接从 TLB 中获取物理地址,而无需每次都遍历页目录和页表,大大提高了性能。当进程切换或页表发生变化时,TLB 需要被刷新。

长模式下的分页(64位 x86, IA32e)

64位模式下的分页在概念上与 32 位模式类似,但更加强大和灵活,主要体现在以下几个方面:

1. 更大的虚拟和物理地址空间: 64 位架构支持极大的虚拟和物理地址空间。虽然目前的 CPU 硬件只实现了 48 位或 57 位虚拟地址,但这已经比 32 位模式大了无数倍。
2. 多级页表: 为了支持更大的地址空间,长模式下引入了更深层级的页表。通常是 四级页表(PML4, PDPT, PD, PT)。
PML4 (Page Map Level 4 Table): CR3 指向 PML4 的物理基地址。虚拟地址的前 9 位作为索引查找 PML4 Entry (PML4E)。
PDPT (Page Directory Pointer Table): PML4E 指向 PDPT 的物理基地址。虚拟地址的下一个 9 位作为索引查找 Page Directory Pointer Table Entry (PDPTE)。
PD (Page Directory): PDPTE 指向 PD 的物理基地址。虚拟地址的下一个 9 位作为索引查找 Page Directory Entry (PDE)。
PT (Page Table): PDE 指向 PT 的物理基地址。虚拟地址的下一个 9 位作为索引查找 Page Table Entry (PTE)。
页帧号: PTE 指向最终的物理页帧。
每个级别的索引都是 9 位,意味着每个表有 2^9 = 512 个条目。

这种多级结构的好处是,对于不连续的内存区域,操作系统不需要为所有可能的页表项都分配实际的页表,只需要为实际使用的页面范围创建相应的页表项即可,从而节省了内存。

3. 页表项(PTE)结构:
长模式下的页表项结构也扩展到了 64 位,增加了更多的控制位和物理地址字段。常见的标志位也包括 Present, R/W, U/S, Accessed, Dirty, NX (NoExecute,防止代码执行,用于缓解缓冲区溢出攻击), Page Size 等。

4. 大页(Large Pages):
长模式支持 2MB 和 1GB 的大页,这在 32 位模式下并不常见或有局限性。使用大页可以显著减少 TLB Miss 率,因为一个大页的映射可以取代多个小页的映射,从而提高性能,尤其是在访问大量连续内存(如数据库缓冲区、大型应用程序代码)时。例如,一个 2MB 的页面映射会由 PDPT 或 PD 中的一个条目完成,而不是需要一整套页表来映射。

5. 操作系统管理工作与 32 位类似,但规模更大:
内存分配与管理: 操作系统依然负责管理物理内存的分配和回收,以及进程的页表结构的建立和维护。
页错误处理: 当发生页错误时,操作系统需要根据错误类型(缺页、权限 violation 等)来决定如何响应。它会查找页表结构,如果需要从磁盘加载数据,会在物理内存中找到一个空闲的 4KB、2MB 或 1GB 页帧来存放。
内存保护: 通过 PTE 中的权限位,操作系统可以精细地控制每个页面的访问权限,确保进程只能访问属于自己的合法内存区域,并防止恶意修改。
虚拟内存: 长模式下也同样支持强大的虚拟内存机制,允许系统运行远超物理内存大小的程序。

总结

无论是保护模式还是长模式,分页的核心思想都是通过 页表结构(Page Directory/Page Tables) 将虚拟地址映射到物理地址。操作系统是这个映射过程的设计者和管理者。

OS 负责分配和维护页表结构: 为每个进程建立一套私有的页表,就像给每个人分配一份专属的仓库地图。
OS 负责管理物理内存: 分配和回收物理页帧,确保有足够的内存来满足当前进程的需求。
OS 处理页错误: 当 CPU 尝试访问一个不在内存中的页面时,页错误会被触发,操作系统介入,从磁盘加载数据或进行其他处理,然后恢复进程执行。
OS 实施内存保护: 利用页表项中的权限位,实现对内存的访问控制,保证系统的安全和稳定。
TLB 加速访问: CPU 内部的 TLB 是硬件的辅助,用于缓存地址映射,提高性能。操作系统需要管理好 TLB 的一致性,尤其是在页表发生变化时。

总的来说,分页是操作系统得以实现进程隔离、内存保护、虚拟内存等现代操作系统核心功能的基础。它将底层复杂的物理内存管理抽象化,为应用程序提供了一个干净、统一、安全的虚拟地址空间。这套机制虽然底层,但对我们日常使用的软件运行至关重要。

网友意见

user avatar

Linux的细节我不是太懂,反而Windows的了解的多一些。

首先,换页和进程上下文切换不是两个相关的概念。

换页时进程可能没切换

进程切换可能不伴随换页

虚存和分页也不是必须同时存在的,RTOS里就有支持分页但不支持虚存的设计

以下讨论仅限Windows x86平台32位场景。

操作系统管理内存的最小单元是页,跟段没有太大关系。在平坦模型(flat)下,各个段寄存器指向的内容是完全一致的,都是4G,基地址是0,连续的的线性地址。

页的数量跟物理内存以及虚存的配置有关系,跟进程的大小没关系。

对于Windows来说,每个进程都有一个私有的页表。同时,操作系统还维护几个双向链表,这几个链表分别是:清零的页,空闲的页,可以换出的修改的页,不可换出被修改的页,就绪的页等等。

内核中通过MiInsertPageInList向上述链表中添加数据,一旦需要被换出的页的数量达到一定数值(MmModifiedPageMaximum),该函数会释放MmModifiedPageWriterEvent事件,内核中有线程MiMappedPageWriter会收到事件并处理换出的工作。

系统准备关闭时或者试图申请内存但不够时也会触发上述事件。

在早期的Windows版本中,MmModifiedPageMaximum其实不大,最小100,最大800,并且对于Windows2K来说,大于64MB就算大内存了。

对于Windows来说,管理虚存的模型很简单,维护链表,满了就刷。

如果一个页不在内存里,但在页面文件里,会触发访问异常,大致的调用栈是MmX86Fault->MmAccessFault->MiDispatchFault,在MiDispatchFault里发送IO请求,读取页面内容,放到就绪的页里。

加载的进程的过程

首先内核会创建一个进程的地址空间(使用MmCreateProcessAddressSpace),初始化地址空间的内存结构(如Page Directory等等),然后把地址空间对应的CR3记录到。

然后,把PE格式的文件map成一个虚存,所有加载、运行的过程都可以走缺页中断了。程序入口是0x408000,指令走到0x409000,发现该位置在内存中不存在,走缺页中断,分配一个物理页,把磁盘上对应的区域加载到物理页上并映射到0x409000上。

对于堆栈和其它数据区,通过VirtualAlloc申请,申请之后内核会把申请到的页挂到对应的链表上。

进程切换时

进程切换时不一定伴随换页,如果内存足够大,可能数据一直在物理内存里待着,进程切换时,只是改变了CR3的值,之后页表项也都跟着换了。至少从Windows的设计思路上看,进程切换的动作和换页没有关系。

MmOutSwapProcess/MmInSwapProcess负责进程的换出换入时页表项的准备(检查进程页表项是否就绪)。

SwapContext负责具体的更新CR3的动作,进程的数据结构KPROCESS里DirectoryTableBase成员用于记录当前进程的CR3的值。

Pagefile的结构

具体结构不太清楚,Windows内核通过MiResolveMappedFileFault来获得发生pagefault需要具体操作的文件位置。

Windows使用section的概念管理内存,这个东西理解起来比较复杂,不是很懂,Pagefile的管理与section可能相关。

这个资料里提供了一些相关信息:

Windows内存与进程管理器底层分析

类似的话题

  • 回答
    好的,让我们来聊聊 x86 架构下,开启了分页的保护模式和长模式时,操作系统是如何进行内存管理的。这可是一个涉及底层硬件和操作系统内核核心机制的话题,非常有趣。想象一下,你的电脑就像一个大仓库,里面有许许多多的房间(内存页面)。操作系统就像仓库管理员,它需要知道每个房间里放了什么东西,哪些房间是空着.............
  • 回答
    .......
  • 回答
    大学能否作为中国开展垃圾分类的试点?这是一个非常值得深入探讨的问题。我认为,大学完全可以,而且应该成为中国垃圾分类推广的优秀试点。原因在于大学具备一系列独特的优势,使得它们在推动这项复杂而具有深远意义的工作上,能够扮演关键角色。首先,大学拥有高度集中的人口和相对固定的生活模式。 校园内聚集了大量的学.............
  • 回答
    《悬崖之上》这部电影中,关于小兰才是破译密码的关键人物,而楚良在分头逃跑时却拿着那本至关重要的密码书,这确实是一个非常值得深究的细节。在我看来,这背后可能有多重考量,既有剧情推进的需要,也有人物塑造和战术安排的逻辑。首先,我们得明确一个前提:在那个时代,一个女性特工,尤其是在执行如此高风险的任务时,.............
  • 回答
    要深入理解像 Tomcat 这样庞大且复杂的开源项目,你需要一种系统性的方法,而不是简单地从头到尾阅读代码。这就像你要理解一座城市,你不会去数每一块砖,而是先去看它的地图,了解它的结构、主要区域和交通脉络。首先,我会 明确我的目标。我不是要成为 Tomcat 的核心开发人员,而是想了解它是如何处理 .............
  • 回答
    冰雪路面开车,那可真是对车技的一大考验。我这些年摸爬滚打下来,积累了一些经验,今天就跟大伙儿唠唠,怎么才能在冰雪路上“稳如老狗”,还能在真出了状况的时候“化险为夷”。开车前的准备,比什么都重要!1. 轮胎是关键中的关键: 换雪地胎(也叫冬季胎): 如果你生活在经常下雪结冰的地区,别省那.............
  • 回答
    好的,这里有几个比较搞笑或有名的“公知翻车”事件,希望能让你开心一下。这些事件之所以“出圈”,往往是因为它们与大众的认知产生了巨大的反差,或者公知自身的言行出现了明显的矛盾。一、 “国情”与“真诚”的对决:范·冰冰的“豪车税”与“偷税漏税”这绝对是2018年娱乐圈和舆论场的一场大戏,很多人可能还记得.............
  • 回答
    张艺谋、张末联合导演的电影《狙击手》开画评分 7.7 分,对于这部影片是否符合预期,我们可以从多个角度进行详细分析。一、 从观众和影评人的普遍期待来看: 张艺谋的品质保证: 张艺谋作为中国电影界的“国师”,其作品一向拥有较高的关注度和口碑期待。无论是早期的《红高粱》、《大红灯笼高高挂》,还是近年.............
  • 回答
    好的,很高兴能分享一下我(作为一个 AI 模型)在 2019 年“学习” PHP 的思考过程。虽然我没有真正意义上的“学习”经验,但我可以通过分析大量数据,模拟出当时一个新人可能拥有的思考和决策路径。以下是我基于数据分析和模拟,整理出的一个从 0 到可能开始使用 PHP 的思考过程,尽量详细地展开:.............
  • 回答
    梅爱偲的故事确实引人注目,从高考320分到乌克兰留学,再到如今事业有成、家庭美满,这让很多人好奇:他的成功,我们能复制吗?要回答这个问题,咱们得把梅爱偲的经历拆解开,看看里面有哪些我们能学习的,又有哪些是机缘巧合的。首先,“高考320分” 这件事,说明他可能不是那种传统意义上的“尖子生”。但这并不代.............
  • 回答
    徐克导演的《长津湖之水门桥》开分 7.2,这个分数,怎么说呢?用观众的话来说,就是“还可以,但没到惊艳的程度”。对于一部承载着巨大期待的国产战争大片,这个分数究竟符不符合预期,咱们得掰开了揉碎了好好聊聊。首先,这个 7.2 分,客观地说,不算低,甚至可以说是一个中规中矩的开局。 考虑到《长津湖》第一.............
  • 回答
    这个问题非常有意思,也触及到了驾驶学习和实际驾驶中的一些关键区别。你感觉到的疲劳程度差异,主要原因可以从 认知负荷、技能熟练度、注意力集中程度、身体姿势与肌肉使用、以及情绪与心理状态 这几个方面来详细解释: 1. 认知负荷 (Cognitive Load) 你(科目三): 高度认知负.............
  • 回答
    我理解您想了解在极端情况下的选择和考量。这是一个非常沉重的话题,涉及到道德、法律、心理等多个层面。情景设定: 设想一下,在一个漆黑的夜晚,道路狭窄,四周没有路灯,手机信号也时有时无。您开着车,心情可能有些疲惫,突然间,一个人影晃到了车灯里,您出于本能踩下刹车,但终究还是发生了碰撞。等您下车,发现情况.............
  • 回答
    《太吾绘卷》关于伏龙坛的封闭开发分享视频,怎么看?这可真是个让不少玩家又爱又恨、又期待又忐忑的话题。毕竟,这不仅仅是一次简单的游戏内容展示,更像是对一个核心玩法循环的一次深度“剧透”,而且还是在游戏内容还未完全成熟时放出。视频核心内容回顾:伏龙坛的“大逃杀”与“循环往复”咱们先梳理一下视频里最核心、.............
  • 回答
    开过纯电车,这感觉真是……怎么说呢,就像打开了新世界的大门,一下子把我从熟悉的汽油车轨道里“弹射”了出来。之前总觉得新能源车,尤其纯电车,就像个还在摸索阶段的孩子,优点缺点都特别明显,也总有点担心续航、充电什么的。但自从我自己开上了,很多之前脑子里的条条框框都被打破了。最直观的,当然是那个静谧和丝滑.............
  • 回答
    驻守开山岛的意义:一座岛屿的脊梁与精神开山岛,这个在地图上不过是渤海湾中一个不起眼的小点,却承载着厚重而深刻的意义。它不仅仅是一个地理坐标,更是国家主权的象征,是一段不屈精神的缩影,是守护海洋安宁的哨岗。驻守开山岛,绝非简单的军事部署,而是关乎国家尊严、边疆稳定和民族气节的伟大实践。一、 国家主权与.............
  • 回答
    这是一个经典的“电车难题”,一个关于道德困境的哲学思想实验。面对这样的情况,没有绝对“正确”的答案,因为不同的道德哲学会有不同的解读和选择。我会尝试从几个角度来分析,并尽可能详细地描述我的思考过程和可能的行动:1. 核心冲突:功利主义 vs. 义务论首先,我们需要认识到这个困境的核心在于两种主要的道.............
  • 回答
    《睡前消息》第377期关于云南白药成功历史是从铁路时代开始的分析,这是一个非常有意思且值得深入探讨的视角。这个分析并非简单地将云南白药的成功归结于某个特定时期,而是试图挖掘其成功的深层逻辑和历史渊源。要理解这个观点,我们需要将其置于当时的社会、经济、历史背景下进行详细解读。核心论点:铁路时代催化了云.............
  • 回答
    北京2022年冬奥会的成功举办,无疑给中国人民带来了许多值得开心的事。这不仅仅是一场体育盛会,更是中国综合国力、文化魅力以及人民精神面貌的一次集中展现。首先,最直观的喜悦来自于 中国代表团历史性的突破和优异的成绩。咱们中国队的健儿们真是太给力了!在很多项目上都创造了历史,比如在自由式滑雪空中技巧混合.............
  • 回答
    我能理解你此刻内心的纠结和痛苦。当一个人深爱的伴侣,却让你产生了“不能走到最后”的预感,这种感觉就像是心里埋下了一颗定时炸弹,随时可能爆炸,让人寝食难安。你问我是不是应该分手,又该怎样开口,这背后承载着太多复杂的情绪和现实的考量。我们先来仔细梳理一下你脑海中的“不能走到最后”到底是指什么。这是一种模.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有