2009-11-11 87 views
2

如果我理解正确,系统空间中的内存加法器只能从内核模式访问。这是否意味着当执行系统空间映射的组件时,处理器必须转换为内核模式?内核模式转换

例如:虚拟内存管理器是一个经常使用的组件,映射到系统空间。每当VMM在用户进程的上下文中运行(可以说它翻译了地址),处理器是否必须转换到内核模式?

谢谢, 苏雷什。

回答

1

以您的虚拟内存管理器为例,它实际上从不在用户空间中运行。为了分配内存,用户模式应用程序调用Win32 API(NTDLL.DLL作为一个例子),例程为VirtualAlloc

关于地址转换,下面是它的工作原理的总结(基于Windows Internals 5th Edition的内容)。

VMM使用页表,CPU用它将虚拟地址转换为物理地址。页面表位于系统空间中。每个表包含许多PTE(页表条目),它存储虚拟地址映射到的物理地址。在这里我不会详细讨论,但重点是所有VMM的工作都是在系统空间而不是用户空间中执行的。

对于上下文切换 - 当用户空间中运行的线程需要在系统空间中运行时,会发生上下文切换。由于内存管理器存在于系统空间中,因此线程永远不需要进行上下文切换,因为它已经存在于系统空间中。

对于简单解释的道歉,这是一个相当复杂的讨论话题。我强烈建议你拿起Windows Internals的副本,因为这听起来像它可以派上用场。

+0

您好,我同意VMM的工作是在系统空间中执行的。让我们举个例子。假设发生页面错误,并且陷阱处理程序将调用VMM中的MmAccessFault方法,该方法运行在发生错误的线程的上下文中。但是,MmAccessFault方法位于系统空间中,如果处理器需要执行它,则处理器需要处于内核模式。所以,问题是,在方法被调用之前,转换是否会发生? 我确实拥有Windows Internals的副本(尽管第4版)。谢谢。 – Suresh 2009-11-11 21:49:46

+0

即使在页表中有效地址的情况下,由于页表驻留在系统空间中,因为地址转换发生在用户线程的上下文中,是否需要切换到内核模式? 类似地,当在内核模式下运行的任何组件在用户模式线程的上下文中运行时,在开始执行之前是否需要切换到内核模式?谢谢。 – Suresh 2009-11-11 21:50:19

+0

无可否认,我无法完全回答您的问题,因为您需要帮助的深度有点超出我的范围。我给了它一个,但也许更有知识的Windows专家可以在这里帮助。 – 2009-11-11 22:10:24

1

通常情况下,涉及2个部分。MMU(内存管理单元)是一个硬件组件,用于执行从虚拟地址到物理地址的转换。和操作系统虚拟机子系统。

操作系统部分需要以特权模式(也称为内核模式)运行,并且将基于用户空间需求设置/更改MMU中的映射。

E.g.要请求更多(虚拟)内存或将文件映射到内存中,则需要转换到内核模式,并且VM子系统可以更改进程的映射。

在这附近,通常会有大量的技巧 - 电子克。将内核的整个地址空间映射到用户进程虚拟空间,但改变它的访问权限以便进程不能使用该内存 - 这意味着无论何时转换到内核模式,都不需要重新加载内核映射。

+0

您是否说当执行任何驻留在系统空间的代码段(无论是VMM还是线程调度程序)时,必须进行内核模式转换?谢谢。 – Suresh 2009-11-12 00:58:19

+0

是的。请注意,翻译内存地址等内容是由硬件单元完成的,它不需要代码执行(除非导致页面错误) – nos 2009-11-12 08:19:42

+0

好的,谢谢。我同意翻译地址是由硬件完成的,但它仍然需要访问驻留在系统空间中的页表吗?所以,要访问页表,应该将处理器切换到内核模式,还是完全由硬件来处理,而不涉及处理器?谢谢。 – Suresh 2009-11-12 20:03:14