OS"如何处理"虚拟地址和物理地址

时间:2018-04-13 12:53:48

标签: x86 operating-system virtual-memory

根据我从Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide的理解,基于每个核心启用分页:关闭或开启。

因此,OS"如何处理"在物理地址?最直接的是,它将如何管理页表结构和相关的页面框架?

我能想到的两件事:

  • 操作系统实际上会禁用分页来执行这些类型的任务,然后重新启用它。
  • 操作系统在启动期间和启用分页之前,会将一段线性地址直接映射到物理地址。

2 个答案:

答案 0 :(得分:2)

  

基于每个核心启用分页:关闭或开启。

是的,每个核心都有自己的一组控制寄存器。

  

操作系统会在启动期间以及启用分页之前映射a   线性地址部分直接指向物理地址。

通常,操作系统会在启动期间启用分页。在此之前,它首先创建一个多级页表。必须至少有一个虚拟到物理页面映射,以便在启用分页时,至少可以访问一个页面而不会触发页面错误。然后,OS将第一级页表(页目录)的物理基地址存储在CR3控制寄存器中。最后,要实际启用分页,OS sets CR0[PG] to 1。当指令将CR0 [PG]从0更改为1时,所有后续指令都有效地开始使用寻呼单元(有一个例外,见下文)。这意味着由核心的地址生成单元生成的所有有效地址,并由分段单元映射到相应的线性地址(如果适用)被寻呼单元拦截,以使用该映射单元映射到物理地址。页表。这里的关键点是CR3包含物理地址,而不是逻辑地址或线性地址,这会破坏地址转换的无限循环。

这意味着操作系统使用的数据结构及其代码也必须映射到虚拟页面。通常,每个进程的虚拟地址空间被划分为用户模式部分和内核模式部分。每个进程的虚拟地址空间的内核分区映射到相同的物理页面。因此,无论哪个进程调用内核,内核都可以使用相同的虚拟地址和调用进程的相同虚拟地址空间。通过在页表条目中设置标志来保护内核页面。

  

操作系统实际上会禁用分页来执行这些类型的任务,   然后重新启用它。

从技术上讲,操作系统可以随时禁用分页。但这不是必要的。页表本身也映射到虚拟地址,以便操作系统可以在不禁用分页的情况下维护它们。这是通过以一种称为self-mappingrecursive mapping的特殊方式设置一个第一级页表条目来完成的(该文章包含很好的解释这个概念的数字)。

但是,可能会在操作系统无法控制的情况下禁用分页。发生系统管理模式中断(SMI)时会发生这种情况,在该系统管理模式中断上禁用分页和保护模式分段。 SMI处理程序(由OS注册)以称为SM模式的特殊模式运行,该模式类似于实模式。从SM模式返回并且在SMI发生之前启用了保护模式分段和分页时,它们将自动重新启用。

答案 1 :(得分:1)

大多数操作系统将所有物理内存映射到一系列虚拟地址,并使用仅内核映射。例如https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt是Linux的内存映射。

注意最高64TB"直接映射"区域。如果您知道物理地址,则可以访问内核虚拟地址空间中的0xffff880000000000 + phys_addr

Linux使用1G大页面进行直接映射,因此TLB未命中率很少。

当没有足够的虚拟地址空间来轻松地将所有物理RAM映射到虚拟地址空间的一部分时,事情会变得复杂,就像32位的RAM超过2GiB一样。然后内核必须将部分物理RAM视为" highmem"不能直接用于某些事情(例如页面表)。