我当时正在做 Windows 系统编程,想知道是否可以在源代码级别访问进程的页表。
这是我所了解的与虚拟内存相关的页表。
假设用户刚刚在 Windows 操作系统(32 位)上运行一个名为“A”进程的进程。
首先,操作系统为A进程创建并维护4GB虚拟地址空间。
(其中 2GB 是内核地址空间,另外 2GB 是用户地址空间。
用户地址空间中的任何代码都不能直接访问内核地址空间。)
然后,操作系统在物理内存中为A进程创建并维护页表,以将虚拟内存地址映射到物理内存地址。
这是我的问题。
操作系统为A进程创建页表后,该页表是否映射到A的内核地址空间,以便用户可以从源代码间接访问该页表?
或者页表没有映射到 A 的任何虚拟地址空间,而只是驻留在物理内存中,因此用户无法访问页表?
为了加速页表的操作,内核通常使页目录中的一个条目指向该页目录。这使得所有页表在地址空间中被映射和访问。然而,正如 Raymond Chen 所指出的,这些不能从用户模式访问。没有充分的理由允许应用程序弄乱页表。有一些 API 可以分配(和映射)地址空间区域,应该使用这些 API。
您的意思是“A”进程的虚拟内存的内核地址空间中有页表条目,并且这些条目被映射到驻留在物理内存中的真实页表。所以,进程只有具有内核模式才可以访问这些页表项,但进程不具有内核模式。因此,该进程最终无法访问其页表。这样对吗?
正确的。页面的可访问性由当前权限级别(用户与内核)、段访问权限和页面访问权限控制。系统中使用的这些的特定组合不允许在用户模式下运行的代码访问内核数据,包括页目录和页表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)