1)用户模式进程有自己的“地址上下文”,它将用户模式虚拟地址映射到唯一的物理页面帧集合。 也就是说,当Windows XP调度程序切换线程时,任何特定虚拟地址的含义会随时改变。
“切换线程”的部分工作是更改页表,以便它们引用传入线程的进程上下文。
_
2)Windows内核模式驱动程序在“任意线程上下文”中执行。
驱动程序可以创建一个系统线程并在其上下文中工作......但我在讨论的情况是当一个人没有创建系统线程时。
驱动程序可以使用“ExAllocatePoolWithTag”来分配分页(内存在易失性存储中)。
_
3)那么驱动程序如何访问分页内存没有任何上下文?
如第1点所示,分页内存是通过“特定于上下文”的页表访问的。
当驱动程序在其他一些线程上下文运行时...即。页表条目指向线程相关的phy。 mem,那么驱动程序如何才能访问他的分页内存?
PS:我在内核编程方面的努力。不要生气。
答案 0 :(得分:7)
使用的概念是“用户/内核地址空间拆分”。每个进程地址空间被分成一个较低的部分(通常为2 GB),该进程在用户模式下可供进程访问,并且每个进程都有所不同,以及只能在内核模式下访问的上部(剩余地址空间),并且每个进程的相同。
当驱动程序分配分页内存时,它被分配在地址空间拆分的内核端,因此无论当时加载哪个进程页表,它都会对内核代码可见(因为这部分地址空间)每个进程都以相同的方式映射。)
答案 1 :(得分:0)
需要注意的是,所有线程都具有相同的内核内存映射。 因此线程之间的上下文切换对虚拟内存的前2GB没有(几乎)任何影响。