Windbg的显示物理内存的!dd命令的问题

WinDbg

Windbg的显示物理内存的!dd命令的问题


iNarcissuss 2009-06-30, 09:07 上午
大家好

最近我写程序中用到了MmMapIoSpace来读取某块物理内存的内容

在调试中我想验证一下读得对不对,所以就用了 !dd aPhysicalAddress 命令,但是windbg提示如下内容:

kd> !dd e9000
physical memory read at e9000 failed
If you know the caching attributes used for the memory,
try specifying Coffee [C], [uc] or [wc], as in !dd Coffee [C] <params>.
WARNING: Incorrect use of these flags will cause unpredictable
processor corruption. This may immediately (or at any time in
the future until reboot) result in a system hang, incorrect data
being displayed or other strange crashes and corruption.

然后我就加了参数Coffee [C],发现果然能正确显示,后来又试了[uc] [wc]参数,发现三者显示的内容都一样,

MmMapIoSpace读出来的内容也一样

我就很奇怪,加了这三个参数与不加参数有什么区别么?其中的原理是什么?不加那三个参数时windbg是从哪里

读取物理内存的内容呢?为什么有时候会显示错误信息呢?

后来google了一下,MS的Andre Vachon这样说

This is by design on windows XP.  You must read the message and do what it
says.
-Andre

那么为什么要这么设计呢?

希望各位牛牛有时间的话,给我指点一下迷津,或者推荐一些资料,或者说说应该查找什么方面的资料都可以

谢谢


Re: Windbg的显示物理内存的!dd命令的问题


iNarcissuss 2009-07-15, 09:52 上午
汗。。。

我的人品差到这种程度。。。

Re: Windbg的显示物理内存的!dd命令的问题


格蠹老雷 2009-07-16, 21:09 下午
Don't feel frustrated :-)
的确没有看过官方的文档说明其中的原因,但是看一下内核中供调试用的内存访问函数就可以知道答案了(当然是看汇编)。

对于读取物理内存的请求(DbgKdReadPhysicalMemoryApi),KD需要调用
MiDbgTranslatePhysicalAddress函数来获取指定物理地址所对应的线性地址,因为在保护模式下,CPU是没有办法直接读取物理地址的,总是要先将其映射到页表和页目录中,因为这个原因,如果要读地址已经映射过,那么!dd命令中不加Cache选项就可以读取成功;但是如果要读的物理地址还没有映射过,那么就需要将其映射到专用于调试的一套页目录和页表中,在映射时需要制定Cache选项,这些信息是登记到PTE中的,所以当!dd命令读取这样的物理内存时就需要指定Cache选项。

因为Cache选项是影响内存瞬态的选项,比如是否可以对内存做高速缓存(是<img src="/emoticons/emotion-44.gif" alt="Coffee [C]" />,不是[uc]),而在调试时,如果内存的值没有变化,那么是否Cache没什么影响,所以读到的值都一样是合乎情理的。


Powered by Community Server Powered by CnForums.Net