在x86上,启用分页是否会导致;“无条件跳转”;(因为EIP现在是一个虚拟地址)?

在x86上,启用分页是否会导致;“无条件跳转”;(因为EIP现在是一个虚拟地址)?,x86,cpu,paging,X86,Cpu,Paging,当通过将CR0中的分页位设置为1来启用分页时,所有指针(包括EIP)现在都被解释为虚拟地址而不是物理地址。除非CPU当前执行的内存区域是“标识映射”(虚拟地址映射到相同的物理地址),否则这似乎会导致CPU执行相当于“无条件跳转”的操作——它应该从不同的(物理)地址开始执行代码 这真的发生了吗?要让操作系统启动代码可靠地处理这种行为,似乎是非常棘手的。或者所有受保护模式的OSs标识映射自己的内核代码吗?这不需要完整的标识映射;例如,Linux实际上在完成运行后会完全删除启动代码。相关代码在中,其中

当通过将CR0中的分页位设置为1来启用分页时,所有指针(包括EIP)现在都被解释为虚拟地址而不是物理地址。除非CPU当前执行的内存区域是“标识映射”(虚拟地址映射到相同的物理地址),否则这似乎会导致CPU执行相当于“无条件跳转”的操作——它应该从不同的(物理)地址开始执行代码


这真的发生了吗?要让操作系统启动代码可靠地处理这种行为,似乎是非常棘手的。或者所有受保护模式的OSs标识映射自己的内核代码吗?

这不需要完整的标识映射;例如,Linux实际上在完成运行后会完全删除启动代码。相关代码在中,其中使用平坦模式(32位标识映射),启用保护模式后立即执行跳转。值得注意的是,由于切换到32位模式,跳转是以机器代码形式编写的。从那里开始,它通过设置页面表。我不确定是否完全需要状态更改后的无条件跳转(例如,这是未按预期进行此类操作的意外副作用)

是与否 ,在非正式意义上,因为现在MMU将虚拟地址转换为线性地址,并且CPU获取虚拟地址。如果我们在执行地址为
4000h
的指令时打开分页,假设下一条指令位于
4003h
,则4003h可能被转换为
8003h
,因此实际上从
4000h
跳到
8003h
。因此,我们必须将当前执行的页面映射到其中,否则我们将不知道CPU将从何处执行代码

,在技术意义上,这不是跳转,因为CPU没有看到任何跳转指令及其所有副作用(如丢弃OoO指令)此外,CPU仅在整个缓存层次结构丢失后才访问内存,这意味着即使页面映射到不同的地址,您仍然可以执行来自
4003h
的指令

那么,我们是否需要一张身份地图? 是的,我们需要它。不是完整的身份映射,例如,我通常只映射第7页和第8页(对应于线性范围7000h-8fffh)

通过比较启用分页和启用受保护模式,您可以看到它们有多么不同。分页会立即生效,因此您需要在激活它之前创建所有的页表,并且需要至少一个标识页来处理当前运行的代码,而不依赖缓存。
相反,启用受保护模式更“容易”,您甚至可以在进入受保护模式后创建GDT条目,并且您可以通过更改段寄存器(通常是带跳转的
CS
)来控制何时首次使用它


实际上,如果您知道自己在做什么(比如复制代码或使用一些硬件内存别名),就不需要严格的标识页,但这是非常特定于上下文的,在一般情况下,它只会使事情变得毫无意义地复杂

经验答案:在这个最小的分页示例上注释掉分页标识映射设置:并观察操作系统的中断。因此,是的,它会“跳跃”。

我真的不明白为什么它会导致任何跳跃,或者启动代码如何工作会是一个问题。分页在内存控制器中,操作系统根据自己的喜好进行设置,它可以将当前正在运行的页面映射为具有相同的物理和虚拟地址。或者不,如果它选择,在这种情况下,它将在物理内存中“跳转”,而不是虚拟内存。在@YannVernier提供的链接的帮助下,我发现在打开分页之前,Linux内核构建了一个页面表,将内核代码映射到两个不同的虚拟内存地址范围:一个与加载它的物理地址相同,另一个是它最终希望从中运行的地址。在启动过程稍晚的时候,它会切换到不同的页表,其中只有第二个映射范围,而不是第一个映射范围。这避免了我所问的问题。我想知道NT是怎么做的?这很有趣。但是在研究了pmjump.S之后,我发现它支持内存保护,但不支持分页。您可以说它在“平坦模式”下运行,因为所有段寄存器的基数都是0。但这个问题是关于启用分页时会发生什么。应该有一个更好的概述。我不太熟悉这个部分。谢谢你的链接+1在内核4.2上,身份映射设置为:谢谢!当你说“我通常只写第7页和第8页的标识映射”时,这是否意味着你要定期编写x86操作系统?@AlexD当我想尝试硬件(CPU新功能、系统组件)时,我通常会编写一个小的启动程序。除了开发整个操作系统(这是一项艰巨的任务),我编写操作系统的一小部分是为了巩固理论、发现或只是为了好玩:)这太棒了。我想看看你的GitHub项目,如果你有。@AlexD ahaha我是在GitHub不存在的时候开始的,我只有56Kbps的PSTN连接(从而限制了每周几小时的互联网访问)。我有很多关于HD的文件/项目,很少有评论和奇怪的名字:)然后我就习惯于写一个文本(只有文本)文件和我的注释,我会给你这些,但我用意大利语写的所有东西