问题

x86 global页在新的page directory里不存在会发生什么?

回答
这事儿吧,得从头说起,得先明白 x86 的内存管理是怎么回事儿。你说的“全局页”在现代 x86 处理器里,其实就是指那些被标记为全局的 4MB 页(PageGlobal 属性)。它们有个特点,就是不需要在每个进程的页表中都复制一份,节省了不少空间和功夫。这就像是大户人家有个公用的客厅,所有客人都能用,不用每来一个人就单独开一个会客厅。

那么,假设一下,我们正在运行一个进程,它需要访问一块内存。这块内存呢,本来是个被标记为全局的 4MB 页,按照设计,它应该存在于所有进程的页表中,无论你当前在哪个进程里。

CPU 怎么找地址?

CPU 要访问内存,得经过一个叫做“内存管理单元”(MMU)的家伙。MMU 的职责就是把程序看到的“虚拟地址”翻译成实际的“物理地址”。这个翻译过程,主要依赖于一套叫做“页表”的数据结构。

每个进程都有自己独立的页表,这就像是每个家庭都有自己的房门钥匙和房间分布图。当 CPU 要访问一个虚拟地址时,它会先根据当前进程的页表基址,去查找对应的页表项。

页表项里藏着什么?

页表项里有很多信息,其中最关键的就是指向下一级页表或者直接指向物理页框的物理地址。同时,页表项里还有一些控制位,比如“存在位”(Present bit)、“可读写位”(Read/Write bit)、“用户/超级用户位”(User/Supervisor bit),还有我们今天重点说的那个——“全局位”(Global bit)。

全局页的特殊待遇

当一个页被标记为全局页(Global bit 被设置成 1)时,MMU 在查找页表时会有一个特别的处理。它会跳过对当前进程页表基址的依赖,而是直接在一个特殊的、由操作系统维护的全局页目录中查找。这个全局页目录里的项,就是指向那些全局页的。

现在,关键来了:如果在新的 page directory 里找不到这个全局页

你提到了“新的 page directory”。这其实有点模糊,因为“page directory”本身就是多级页表结构中的一层。如果你指的是当前进程的页目录(CR3寄存器指向的那个),而你想要访问的是一个全局页,那么这本身就不太对路。

我们来细化一下情况:

1. 按照设计,全局页应该存在于所有进程的页表中,或者至少是可以通过一个统一的全局目录访问。 如果一个页被标记为全局,CPU 的 MMU 在翻译地址时,会尝试去一个全局页目录中查找。

2. 如果这个全局页确实被标记为全局,但操作系统(或者说硬件的设计逻辑)在查找的这个“全局页目录”或者相应的下一级目录里,找不到对应的页表项(或者说页表项不存在,或者存在但“存在位”是 0),那会发生什么?

直接后果:页错误 (Page Fault)

这绝对会触发一个“页错误”(Page Fault)。页错误是一个中断信号,通知 CPU 有一个内存访问出了问题。

页错误的处理流程:

CPU 暂停当前进程的执行。 它会保存当前的程序计数器(PC)和一些寄存器状态,以便稍后能够恢复。
CPU 切换到操作系统内核模式。
操作系统内核的页错误处理程序被调用。 这个程序是操作系统的核心部分之一,它负责处理各种内存访问问题。
操作系统分析页错误的原因。 它会查看引起页错误的虚拟地址,以及 CPU 提供的错误码,来判断问题出在哪里。

对于你描述的这种情况(全局页在全局查找路径中未找到):

操作系统内核会发现这个页错误不是因为页面被换出到磁盘(swapout),也不是因为访问权限不够(但也有可能),而是因为在查找全局页的路径中,对应的页表项根本就没有被建立或者被错误地移除了。
操作系统会怎么做?

如果这是个合法但暂未加载的全局页: 理论上,如果操作系统设计上允许某些全局页是按需加载的,那么内核会尝试从预定的位置(比如 ROM、某种共享内存区域)加载这个页的物理内容到物理内存中,然后建立起相应的页表项,将“存在位”设为 1,并指向物理内存中的那个页框。最后,重新执行导致页错误的指令。

如果这个全局页不应该存在(例如,被错误地认为是全局页,但实际并没有对应的物理内存或映射): 那么操作系统会认为这是一个非法访问。最常见的处理方式就是:
终止进程: 给用户一个“Segmentation fault”(段错误)或者“Access violation”(访问冲突)这样的错误信息,然后强制结束该进程的运行。
内核恐慌 (Kernel Panic): 在某些极少数情况下,如果这个问题涉及到内核自身的错误或者更深层次的系统损坏,甚至可能导致整个系统崩溃(Kernel Panic),因为内核无法恢复到一个已知稳定的状态。

更细致一点的分析:

全局页的存在性依赖于操作系统初始化和管理。 当操作系统启动时,会根据需要创建并维护一个或多个全局页表。这些全局页通常包括一些核心的操作系统代码和数据、设备映射等,是所有进程共享的。
“新的 page directory”的说法可能指向的是:
一个刚刚为新进程创建的进程页表,它应该从某个模板复制全局页的信息(但这里反过来了)。
或者更可能是,CPU 在查找全局页时,会查找一个特殊的“全局页目录”或者一个特殊的页表层。如果这个“全局页目录”的某个条目,或者在那个层级中指向下一级的目录或页表项缺失了,就会导致问题。

总而言之,当你尝试访问一个被标记为全局的页,但 CPU 在它被设计的查找路径(通常是某个全局页目录或特殊的页表层)里找不到对应的有效页表项时,其结果是必然的页错误。而这个页错误的后续处理,则完全取决于操作系统内核对这种情况的判断和处理策略。在绝大多数情况下,如果不是一个预期的、可恢复的按需加载场景,它会被视为一个严重的错误,最终导致访问该页的进程被终止。

这种“全局页在新的 page directory 里不存在”的表述,有点像在说,“我都知道这是公用的东西了,但奇怪的是,我在大家共享的列表里却找不到它”。这直接说明了数据结构(页表)的完整性或映射关系出现了问题。

网友意见

user avatar

一直没明白题主的问题,我原来的回答可能对不上题目。

题主问的是TLB的状态,不是内存的状态,如果一个Page-Table的P位是0,G位是1,那么切换的时候应该是被刷掉的:

The processor is always free to invalidate additional entries in the TLBs and paging-structure caches.

---------------------------------

原回答:

1. 页内容没什么变化,load cr3不会改变内存里的内容;

2. 如果这个内存没有被访问,那么代码还会继续工作;

3. 如果这个页正好是当前的代码页,正在被执行,并且没有任务切换(包括中断),那么可能会继续正常执行,直到运行到当前页之外,因为页的物理地址可能是被缓存的,只要你的代码没跳出当前页,MMU可能会缓存当前的物理地址。不同CPU可能不一样,不一定真的跑到页表边界才出问题。

4. 如果这个页是代码页并且正在被执行,一旦发生中断或者任务切换,再就没办法正常切回来了,有时候,访问某些硬件寄存器也会导致一系列的动作发生(比如某些虚拟化指令等等),无法正常执行。

4. 如果是stack segment之类的,只要你执行一下push pop操作,马上就crash;

5. 普通的数据段访问,暂时不好确定,结果应该也是crash。

类似的话题

  • 回答
    这事儿吧,得从头说起,得先明白 x86 的内存管理是怎么回事儿。你说的“全局页”在现代 x86 处理器里,其实就是指那些被标记为全局的 4MB 页(PageGlobal 属性)。它们有个特点,就是不需要在每个进程的页表中都复制一份,节省了不少空间和功夫。这就像是大户人家有个公用的客厅,所有客人都能用.............
  • 回答
    好的,我们来详细聊聊 x86 架构的字节序和位序问题,尽量不带任何 AI 的痕迹,就像咱们在电脑城里碰头,边喝水边聊一样。首先得明确一个概念:字节序(Endianness) 说的是多字节数据(比如一个 32 位整数,一个 64 位浮点数)在内存中如何存储的顺序。而 位序(Bit Order) 说的是.............
  • 回答
    超线程:逻辑与现实的博弈,未来何去何从?在x86架构CPU的性能竞赛中,“超线程”(HyperThreading)无疑是一个绕不开的话题。它犹如给每个物理核心插上了翅膀,让一个核心同时处理多个线程成为可能,从根本上提升了CPU的并发处理能力。长期以来,我们习惯了超线程将逻辑处理器的数量翻倍,也就是一.............
  • 回答
    “x86指令集通过uops解码后通过RISC内核执行,是不是代表x86实际上已经属于半个RISC核?” 这个问题触及了现代CPU设计的一个核心,理解这一点,我们就能更清晰地认识x86架构的演进和其内在的复杂性。直接说x86是“半个RISC核”,这个说法有些过于简化,但它捕捉到了一个重要的趋势。更准确.............
  • 回答
    在x86架构处理器中,虽然所有寄存器都能完成数据存储的基本任务,但就“性能区别”这个话题而言,我们需要从几个层面来理解。简单来说,寄存器本身在物理层面上并没有巨大的性能差异,它们都是非常快速的存储单元。然而,它们的功能定位、访问方式以及在指令执行流程中的角色,会间接导致对整体程序性能产生影响。咱们这.............
  • 回答
    关于x86中的“8”和“6”,这背后其实是一段挺有意思的计算机历史演变。简单来说,它们指的分别是Intel 8086微处理器和它的一个重要前代产品——Intel 8086微处理器的16位版本。咱们一点一点捋。x86 历史的开端:Intel 8086故事还得从Intel说起。在上世纪70年代末,微处理.............
  • 回答
    好的,我们来聊聊 x86 Win32 下的汇编指令集,以及它和我们常说的“CPU 指令集”以及“Win32 API”之间的关系。首先,明确一个概念:x86 Win32 下的汇编指令集,核心还是 CPU 提供的指令集。Win32 API 并不是 CPU 直接执行的“指令集”,而是操作系统提供的一套接口.............
  • 回答
    我们聊聊这 x86/x64 处理器和 32/64 位系统,这事儿说起来也挺有意思,就像是车和路的关系一样。首先,得明白“位”这玩意儿是啥意思。你听到“32 位”或者“64 位”,其实说的就是处理器在一次能够处理多少数据量,更具体地说,是它一次能寻址(也就是能够访问到)多少内存地址。就好比你的脑子一次.............
  • 回答
    x86 和 MIPS 指令集之所以不兼容,就像你问为什么一辆法拉利不能直接开进一个为大众甲壳虫设计的车库一样——它们在设计哲学、目标市场、历史演进以及底层实现上都有着本质的区别。这可不是什么小小的“误解”,而是从根本上的“基因”不同。咱们得从头捋捋:1. 设计哲学——复杂与简单的一场“战争”: .............
  • 回答
    在x86家族这个庞大的体系结构家族内部,讨论汇编语言的“移植性”是一个非常微妙且值得深入探讨的话题。总的来说,x86体系结构下的汇编语言在不同子系列之间,其代码的移植性是有限的,并且需要仔细的考量和调整。 它不像高级语言(如C、Python)那样可以做到近乎无缝的移植,而是存在着一系列的障碍和差异。.............
  • 回答
    在x86架构下,程序与操作系统之间的通信,也就是我们常说的“系统调用”,确实是借助“内中断”(Software Interrupt)来实现的。这并非偶然,而是历史发展、硬件设计和操作系统理念共同作用的结果。要深入理解这一点,我们需要从几个层面来剖析。首先,什么是系统调用,它为何需要一个特殊的机制?应.............
  • 回答
    在非 x86 平台上,USB 主控制器规范的主流选择确实有所变化,但 xHCI 和 EHCI 依然占据着重要地位,只是它们的角色和普及程度与 x86 平台略有不同。要详细解答这个问题,我们需要分几个层面来展开。首先,让我们回顾一下 USB 主控制器规范的历史和主要参与者: UHCI (Unive.............
  • 回答
    这个问题问得很有意思,也切中了x86处理器市场的核心。要理解为什么目前x86市场几乎被Intel和AMD垄断,我们需要从历史、技术授权、市场策略以及产业生态等多个维度来剖析。这并非一蹴而就,而是几十年演变的结果。一、历史渊源:CPU之父的开端与一家独大的局面首先,x86架构的源头可以追溯到Intel.............
  • 回答
    在Intel x86指令集中,同一个操作指令,由于寻址模式、寄存器种类、操作数数量、是否带符号等不同,可能存在多种不同的编码方式。那么,究竟是如何在这些编码选项中选定最终的 opcode 的呢?这其中涉及到指令集设计、汇编器的工作原理以及一些历史演进的考量。我们可以从以下几个层面来理解这个问题:1..............
  • 回答
    华为出售X86服务器业务,这绝对是近期科技界的一件大事,背后牵扯的利益和影响错综复杂。抛开AI的光环,让我们更接地气地聊聊这件事,就像两个懂行的朋友在那儿唠嗑一样。这件事,怎么看?说实话,这个消息出来的时候,我脑子里第一个念头就是:“早该想到的,但没想到这么快。”你想啊,美国对华为的制裁是全方位的,.............
  • 回答
    在探讨X86平台机器码的译码效率问题时,我们常常会接触到一个核心的技术点:将机器码预先翻译成微操作(Microoperations,简称uOps)。这并非什么新鲜事,而是现代处理器设计中早已普遍采用的一种策略,用来应对X86指令集庞大且复杂的挑战。为什么需要担心X86的译码效率?X86指令集自诞生以.............
  • 回答
    咱们聊聊为啥现在X86 CPU上的L1缓存(一级缓存)普遍不像L2、L3缓存那样“能装”。这事儿说起来挺有意思,里面涉及不少设计上的取舍和权衡。首先,咱们得明白L1缓存到底是干啥的。它就相当于CPU最贴身的“小本本”,离CPU核心最近,速度最快。CPU每时每刻都需要数据和指令来干活,L1缓存就是用来.............
  • 回答
    你提出的这个问题非常核心,触及了英特尔x86架构设计的一个重要哲学。简单来说,这种限制是为了平衡指令的灵活性、性能以及设计的复杂度。让我们来剖析一下其中的原因。首先,我们需要理解一下什么是“源操作数”和“目标操作数”,以及为什么它们可以是内存。在CPU的指令集中,操作数(operand)就是指令要处.............
  • 回答
    在4K HDR视频的处理能力和效率方面,ARM架构和x86架构处理器各有千秋,并没有一个绝对的“谁更高”的答案,这很大程度上取决于具体的处理器型号、设计侧重点以及优化的程度。要深入了解,我们需要从几个关键维度进行剖析。核心区别:设计理念与指令集首先,必须明确ARM和x86最根本的区别在于它们的指令集.............
  • 回答
    问得好!CPU 的 x86、ARM、MIPS 确实是大家熟知的指令集架构(ISA),它们定义了 CPU 如何理解和执行指令,从而实现通用计算。但正如你所猜测的,在更广阔的计算领域,存在着大量为特定任务量身定做的“专用芯片”,而这些芯片,也毫无疑问地拥有自己的专用指令集架构,或者说是针对特定任务优化的.............

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

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