【发布时间】:2012-11-18 15:49:14
【问题描述】:
如果我理解正确,系统空间中的内存添加器只能从内核模式访问。这是否意味着在系统空间中映射的组件执行时必须将处理器切换到内核模式?
例如:虚拟内存管理器是一个经常使用的组件,它被映射到系统空间中。每当 VMM 在用户进程的上下文中运行时(假设它翻译了一个地址),处理器是否必须切换到内核模式?
谢谢, 苏雷什。
【问题讨论】:
标签: windows
如果我理解正确,系统空间中的内存添加器只能从内核模式访问。这是否意味着在系统空间中映射的组件执行时必须将处理器切换到内核模式?
例如:虚拟内存管理器是一个经常使用的组件,它被映射到系统空间中。每当 VMM 在用户进程的上下文中运行时(假设它翻译了一个地址),处理器是否必须切换到内核模式?
谢谢, 苏雷什。
【问题讨论】:
标签: windows
通常涉及两部分。MMU(内存管理单元)是一个硬件组件,负责从虚拟地址到物理地址的转换。和操作系统VM子系统。
操作系统部分需要在特权模式(也称为内核模式)下运行,并将根据用户空间的需要设置/更改 MMU 中的映射。
例如要请求更多(虚拟)内存,或将文件映射到内存,需要转换到内核模式,VM 子系统可以更改进程的映射。
围绕这一点,通常需要制作大量的技巧 - 例如。将内核的整个地址空间映射到用户进程虚拟空间,但更改其访问权限,使进程无法使用该内存 - 这意味着每当您转换到内核模式时,您都不需要重新加载内核的映射。
【讨论】:
以虚拟内存管理器为例,它实际上从未在用户空间中运行。为了分配内存,用户模式应用程序调用 Win32 API(例如NTDLL.DLL)到诸如VirtualAlloc 之类的例程。
关于地址转换,这里是其工作原理的摘要(基于 Windows Internals 5th Edition 的内容)。
VMM 使用页表,CPU 使用该页表将虚拟地址转换为物理地址。页表位于系统空间中。每个表包含许多 PTE(页表条目),其中存储了虚拟地址映射到的物理地址。在这里我不会详细介绍,但重点是 VMM 的所有工作都是在系统空间而不是用户空间中执行的。
至于上下文切换——当运行在用户空间的线程需要运行在系统空间时,就会发生上下文切换。由于内存管理器存在于系统空间中,它的线程永远不需要进行上下文切换,因为它已经存在于系统空间中。
抱歉,解释过于简单,这是一个相当复杂的深入讨论话题。我强烈建议您选择一份Windows Internals,因为这听起来对您很有用。
【讨论】: