|
|
|
|
|
|
|
Windows内核调试
帖子发起人: 特来劲同学 发起时间: 2010-12-17 15:20 下午 回复: 8
|
帖子排序:
|
|
|
|
2010-12-17, 15:20 下午
|
特来劲同学
注册: 2009-08-28
发 贴: 37
|
|
|
关于系统页面内存的问题,比如当一个内核模块加载到系统中中,不仅在当前进程的页表中有所体现,系统内部的一个全局系统页表也会被更新,所以当这个内核模块的代码和数据在其他进程中引用中,虽然相应的页表没有对应的pte,当时页错误处理例程会利用系统的这个全局页表来更新当前的进程系统页表。我的问题是,当这个内核模块卸载时(或者当该内核模块代码或数据发生改变时),是否相应的物理页面被释放?如果没有被被释放,那不就等于没卸载吗?如果被释放了,而那其他进程的系统相应的pte没有被更新,下次访问到不就产生错误了么?难道遍历系统中所有的进程来更新?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2010-12-17, 22:13 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
问题的关键是多级映射, 今天的大多数系统都是启用PAE的, 因此最顶级是页目录指针表, 而后是页目录表, 最后才是页表.
当系统创建进程时, 会"巧妙的"安排页目录内容, 使其中的一部分表项指向用于描述"内核空间"的页表.
当加载内核模块时, 可以理解为主要是用于描述内核空间的页表内容变化, 每个进程中的"内核"页目录项并不需要变化, 它们仍指向原来的页表.
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2010-12-18, 11:21 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
有没有PAE都没有关系, 是页目录中的表项决定指向何种页表. 可以理解为每个进程的页目录中都有一系列页目录项指向描述内核空间的页表. 如果有《软件调试》的话,建议你看一下2.7节, 特别是图2-12.
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2010-12-19, 21:42 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
准确说,复制的是PDE,可以把PDE比喻成指向页表的链接,卸载模块时,只要更新页表就行了,不需要更新链接。打个比方,PDE好像是指向网页的链接,网页内容变化了,指向网页的链接不需要改,只要这个网页的路径没有变...
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2010-12-20, 13:33 下午
|
特来劲同学
注册: 2009-08-28
发 贴: 37
|
|
|
先感谢老师,有点开窍了,呵呵,太笨了
那照老师这样说,进程的C0000000-C0800000的进程页表中,后半部分C0400000-C0800000除了页目录之外(好像还有什么超空间之类的其他私有页)其他所有都为0咯? 老师我这种说发对吗?
刚用windbg看了一下
lkd> !pte 805cc3fc VA 805cc3fc PDE at 00000000C0602010 PTE at 00000000C0402E60 contains 00000000004009E3 contains 0000000000000000 pfn 400 -GLDA--KWEV LARGE PAGE pfn 5cc
lkd> dd 0C0402E60 c0402e60 ???????? ???????? ???????? ???????? c0402e70 ???????? ???????? ???????? ???????? c0402e80 ???????? ???????? ???????? ????????
LARGE PAGE 查了下大页面 发现相关资料讲的很少,不知道其页面映射机制和页交换机制是怎么完成的,老师能都指点下 ?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 请张老师看一下关于系统页面内存的问题
|
|
|
|
|
|