0

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

这是我对与虚拟内存相关的页表的了解。

假设用户只是在 Windows 操作系统(32 位)上运行一个名为“A”进程的进程。

首先,操作系统为A进程创建并维护4GB的虚拟地址空间。

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

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

然后,操作系统在物理内存中为A进程创建并维护一个页表,将虚拟内存地址映射到物理内存地址。

这是我的问题。

OS为A进程创建页表后,该页表是否映射到A的内核地址空间,以便用户可以从源代码间接访问页表?

或者页表没有映射到 A 的任何虚拟地址空间,而只是驻留在物理内存中,因此用户无法访问页表?

4

1 回答 1

2

为了加快对页表的操作,内核通常使页目录中的一项指向页目录。这使得地址空间中的所有页表都被映射和访问。但是,正如 Raymond Chen 所指出的,这些不能从用户模式访问。没有充分的理由允许应用程序弄乱页表。有用于分配(和映射)地址空间区域的 API,应该使用这些 API。

您的意思是“A”进程虚拟内存的内核地址空间中有页表条目,这些条目映射到驻留在物理内存中的真实页表。因此,进程只有在具有内核模式时才能访问这些页表条目,而进程没有内核模式。因此,进程终究无法访问其页表。这样对吗?

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

于 2017-01-04T11:11:36.850 回答