【问题标题】:Is a process' page table mapped to Kernel address space?进程的页表是否映射到内核地址空间?
【发布时间】:2017-05-18 05:16:57
【问题描述】:

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

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

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

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

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

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

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

这是我的问题。

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

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

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为它询问的是有关 Windows 的内存实现问题,而不是直接与编程相关的问题。
  • @DanielA.White 抱歉,我在编程时试图找到访问页表的方法。我刚刚编辑了帖子并添加了内容。
  • 短语“源代码级别”在这种情况下没有意义。我不确定你在问什么。
  • 参见 MSDN 上的 Accessing User-Space Memory。
  • 应用程序无法访问内核地址空间,因此即使映射到内核空间,应用程序也无法访问。

标签: windows systems-programming virtual-address-space page-tables


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2012-10-12
    • 2016-05-05
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2014-01-14
    相关资源
    最近更新 更多