进程的页面 table 是否映射到内核地址 space?

Is a process' page table mapped to Kernel address space?

我在做 Windows 系统编程,想知道我是否可以在源代码级别访问进程的页面 table。

这是我所知道的与虚拟内存相关的页面table。

假设用户刚刚在 Windows OS(32 位)上运行一个名为 'A' 进程的进程。

首先,OS为A进程创建并维护4GB虚拟地址space。

(其中2GB是内核地址space,另外2GB是用户地址space。

用户地址space中的任何代码都不能直接访问内核地址space。)

然后,OS在物理内存中为A进程创建并维护一个页面table,用于将虚拟内存地址映射到物理内存地址。

这是我的问题。

在 OS 为 A 进程创建页面 table 之后,此页面 table 是否映射到 A 的内核地址 space 以便用户可以间接访问该页面 table 来自源代码?

或者页面 table 没有映射到 A 的任何虚拟地址 space 而只是驻留在物理内存中所以用户无法访问页面 table?

为了加快页表的操作速度,内核通常使页目录中的一个条目指向页目录。这使得所有页表都在地址 space 中映射和访问。然而,正如 Raymond Chen 所指出的,这些不能从用户模式访问。没有充分的理由允许应用程序弄乱页表。有一些 API 可以分配(和映射)地址 space 的区域,应该改用这些 API。

You mean there are page table entries in the kernel address space of 'A' process' virtual memory, and those entries are mapped to the real page table residing in physical memory. So, the process can access these page table entries only if it has kernel mode, but the process does not have it. Therefore, the process cannot access its page table after all. Is it right?

没错。页面的可访问性由当前权限级别(用户与内核)、段访问权限和页面访问权限决定。系统中使用的这些特定组合不允许用户模式下的代码 运行 访问内核数据,包括页目录和页表。