-
-
[求助]关于Windows NT中进程PDE的存储问题
-
发表于:
2013-4-19 15:20
3907
-
[求助]关于Windows NT中进程PDE的存储问题
阅读WRK中KiAttachProcess的源码可以发现MS采取了很巧妙的处理:如果目标进程不在内存中,就让附加上的线程暂时等待,直到目标进程被换入内存中。这样子似乎很安全,但其中有一个问题:一个进程(不考虑系统进程)的页表(或者页目录)一定在内存中么。
KiSwapProcess/KiSwapContext/SwapContext中,似乎都没有看到探测目标进程的页表是否在内存中的代码,基本上都是直接Load CR3完事。由于CR3中存储的是页表物理地址的高位,个人认为这里一旦出错(页表压根不再物理内存中)系统应该会崩溃,由于虚拟内存机制已经起效,一旦页表是完全无效的连继续执行指令的机会都没有,不可能再采取其它措施处理这个问题了。这里先不考虑TLB……
那么如果假设所有进程的第一级页表都始终在物理内存中,看上去这和合理,上述问题都可以解决,但这内存开销似乎有点大,按最节约内存的情形计算(32位,关闭PAE),一个进程的PDE也有4KB,MS会在这方面付出几百KB-几MB(几十个到几百个进程,假设每个进程都有独立的地址空间)而不是采取别的机制?
假设非系统进程的页表是可换出的话,那么线程调度/附加时对于页表换入换出的处理在何处?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)