【问题标题】:How does a Windows Kernel mode Driver, access paged memory?Windows 内核模式驱动程序如何访问分页内存?
【发布时间】:2011-03-24 17:42:17
【问题描述】:

1) 用户模式进程有自己的“地址上下文”,它将用户模式虚拟地址映射到唯一的物理页框集合。 也就是说,当 Windows XP 调度程序切换线程时,任何特定虚拟地址的含义都会随着时间的推移而变化。

“切换线程”的部分工作是更改页表,以便它们引用传入线程的进程上下文。

_

2) Windows 内核模式驱动程序在“任意线程上下文”中执行。

驱动程序可能会创建一个系统线程并在其上下文中工作……但我说的是不创建系统线程的情况。

驱动程序可以使用“ExAllocatePoolWithTag”来分配分页(易失性存储中的内存)。

_

3)那么驱动程序如何没有任何上下文访问分页内存?

如第 1 点所示,分页内存是通过“特定于上下文”的页表访问的。

当驱动程序在其他线程上下文中运行时...即页表条目指向与线程相关的 phy。 mem,那么驱动程序如何访问他的分页内存?

PS:我是内核编程的菜鸟。不要生气。

【问题讨论】:

    标签: operating-system window kernel driver wdm


    【解决方案1】:

    使用的概念是“用户/内核地址空间分割”。每个进程地址空间被分成较低的部分(通常为 2 GB),在用户模式下进程可以访问并且每个进程都不同,而较高的部分(剩余的地址空间)只能在内核模式下访问,并且是每个进程相同

    驱动分配分页内存时,分配在地址空间分割的内核一侧,因此无论当时加载哪个进程页表,对内核代码都是可见的(因为这部分地址空间每个进程都以相同的方式映射)。

    【讨论】:

      【解决方案2】:

      需要注意的主要一点是所有线程都具有相同的内核内存映射。 因此,线程之间的上下文切换(几乎)不会对前 2GB 的虚拟内存产生任何影响。

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2022-10-25
        • 1970-01-01
        • 2012-02-19
        • 2015-07-08
        相关资源
        最近更新 更多