Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 特来劲同学   发起时间: 2010-12-17 15:20 下午   回复: 8

Print Search
帖子排序:    
   2010-12-17, 15:20 下午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
请张老师看一下关于系统页面内存的问题
Reply Quote
关于系统页面内存的问题,比如当一个内核模块加载到系统中中,不仅在当前进程的页表中有所体现,系统内部的一个全局系统页表也会被更新,所以当这个内核模块的代码和数据在其他进程中引用中,虽然相应的页表没有对应的pte,当时页错误处理例程会利用系统的这个全局页表来更新当前的进程系统页表。我的问题是,当这个内核模块卸载时(或者当该内核模块代码或数据发生改变时),是否相应的物理页面被释放?如果没有被被释放,那不就等于没卸载吗?如果被释放了,而那其他进程的系统相应的pte没有被更新,下次访问到不就产生错误了么?难道遍历系统中所有的进程来更新?
IP 地址: 已记录   报告
   2010-12-17, 22:13 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote
问题的关键是多级映射, 今天的大多数系统都是启用PAE的, 因此最顶级是页目录指针表, 而后是页目录表, 最后才是页表.
当系统创建进程时, 会"巧妙的"安排页目录内容, 使其中的一部分表项指向用于描述"内核空间"的页表.
当加载内核模块时, 可以理解为主要是用于描述内核空间的页表内容变化, 每个进程中的"内核"页目录项并不需要变化, 它们仍指向原来的页表.

IP 地址: 已记录   报告
   2010-12-18, 10:38 上午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote

老师的意思是如果是pae的话,则全部指向系统的那个系统页表,这样的话,确实可以理解,但是我的系统确实关掉了pae,没有了那个指向全局系统页表的指针,那该怎么办呢?


IP 地址: 已记录   报告
   2010-12-18, 11:21 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote
有没有PAE都没有关系, 是页目录中的表项决定指向何种页表. 可以理解为每个进程的页目录中都有一系列页目录项指向描述内核空间的页表. 如果有《软件调试》的话,建议你看一下2.7节, 特别是图2-12.
IP 地址: 已记录   报告
   2010-12-19, 12:22 下午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote

老师 ,还是有点疑问,根据老师的指引,我再把我的疑惑表述下:在进程,创建时,他复制了系统内核页表的页目录到自身(实际上是拷贝的父进程),想应整个页表中的高于80000000的页表项pte也复制么?好像是复制,呵呵忘记了。先不管,复制也好,不复制也好,当后来一个内核模块加载到系统中时,并且在某一个进程是调用其代码和数据时,页错误总能把代码和数据带到该进程,正确设置其pte使其能正常执行,我的疑惑是,当该内核模块从系统中卸载时,系统如何保持相关的一致性的?假如系统所有进程都引用过该内核模块,则其页表中pte必定指向相关pfn,既然卸载了,相关fpn则应该释放,否则不是还可以继续引用么?难道系统卸载内核模块是遍历系统所有进程,删除相关pte?不解

 


IP 地址: 已记录   报告
   2010-12-19, 21:42 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote
准确说,复制的是PDE,可以把PDE比喻成指向页表的链接,卸载模块时,只要更新页表就行了,不需要更新链接。打个比方,PDE好像是指向网页的链接,网页内容变化了,指向网页的链接不需要改,只要这个网页的路径没有变...
IP 地址: 已记录   报告
   2010-12-20, 13:33 下午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote

先感谢老师,有点开窍了,呵呵,太笨了

那照老师这样说,进程的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 地址: 已记录   报告
   2010-12-20, 14:03 下午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote

老师,如何是4m的大页面,那一次访问不就要立马分配4m的大页面么?


IP 地址: 已记录   报告
   2010-12-20, 14:50 下午
tangyuan1988 离线,最后访问时间: 2012/9/29 9:28:41 特来劲同学

发帖数前25位
注册: 2009-08-28
发 贴: 37
Re: 请张老师看一下关于系统页面内存的问题
Reply Quote

既然内核是用大页面映射,而其他模块用小页面映射,那么大页面的虚拟内存和物理内存(pfn)如何管理?内存管理器如何协调两种不同大小的页面?


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 请张老师看一下关于系统页面内存的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.