如果我理解正确,系统空间中的内存加法器只能从内核模式访问。这是否意味着当执行系统空间中映射的组件时,处理器必须被切换到内核模式?
例如:虚拟内存管理器是一个经常使用的组件,并映射到系统空间中。每当VMM在用户进程的上下文中运行时(假设它转换了一个地址),处理器是否必须转换为内核模式?
谢谢, 苏雷什。
答案 0 :(得分:1)
以虚拟内存管理器为例,它实际上从未在用户空间中运行。要分配内存,用户模式应用程序会调用Win32 API(NTDLL.DLL
作为示例)来调用VirtualAlloc
等例程。
关于地址转换,以下是其工作原理的摘要(基于 Windows Internals第5版的内容)。
VMM使用页表,CPU使用它来将虚拟地址转换为物理地址。页表存在于系统空间中。每个表包含许多PTE(页表条目),它们存储虚拟地址映射到的物理地址。我不会在这里详细介绍,但重点是所有VMM的工作都是在系统空间而不是在用户空间中执行。
对于上下文切换 - 当在用户空间中运行的线程需要在系统空间中运行时,将发生上下文切换。由于内存管理器存在于系统空间中,因此它的线程永远不需要进行上下文切换,因为它已经存在于系统空间中。
为简单化解释道歉,这是一个相当复杂的讨论话题。我强烈建议您选择 Windows Internals 的副本,因为这听起来对您来说非常方便。
答案 1 :(得分:1)
通常,涉及2个部分.MMU(内存管理单元)是一个硬件组件,它执行从虚拟地址到物理地址的转换。和操作系统VM子系统。
操作系统部分需要以特权模式(例如内核模式)运行,并根据用户空间需求设置/更改MMU中的映射。
E.g。要请求更多(虚拟)内存,或将文件映射到内存,需要转换到内核模式,VM子系统可以更改进程的映射。
在这周围,通常会有大量的技巧 - 例如e-g。将内核的整个地址空间映射到用户进程虚拟空间,但更改其访问权限以使进程无法使用该内存 - 这意味着无论何时转换到内核模式,您都不需要重新加载内核的映射。