Re: 物理内存
Windows内核调试
物理内存
guozf
2009-08-05, 18:35 下午
请问如何获得物理内存的大小呢?
在boot.ini里可以限制Windows可以使用的最大内存,但是如何得到真正的物理内存大小呢?
请指教实现方法!
Re: 物理内存
格蠹老雷
2009-08-05, 22:49 下午
内核中的全局变量MmNumberOfPhysicalPages标志着物理内存的大小,以页为单位,x86架构中,即以4KB为单位。
内核函数NtQuerySystemInformation(SystemBasicInformation, ...)可以获取MmNumberOfPhysicalPages的值。
SDK中提供了一个API来调用这个内核服务,目前不推荐使用,但是仍可以使用。
Re: 物理内存
guozf
2009-08-06, 09:14 上午
问题:
1. 这样的方法得到的是真正的物理内存大小,还是Windows使用的物理内存的大小?
2. NtQuerySystemInformation这个函数好像NTDLL和NTOSKRNL都有export,一个是从User Mode调用,一个从Kernel Mode调用。但是结果会不会有什么不同?
3. WDK或者DDK中为什么查不到NtQuerySystemInformation或者ZWQuerySystemInformation。但是我用dependency walker确实有看到这两个函数。
Re: 物理内存
guozf
2009-08-06, 09:27 上午
另外的一个问题是:
NtQuerySystemInformation或者ZWQuerySystemInformation有什么区别么?
多谢Raymond的回答
Re: 物理内存
guozf
2009-08-06, 14:09 下午
我的电脑物理内存为1G。
测试如下:
1。 修改Boot.ini
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional 512M" /noexecute=optin /fastdetect /maxmem=512
2. 分别用选项1和选项2启动
3. 调用User mode的函数NtQuerySystemInformation来查看物理内存的大小
选项1:1G
选项2:512M
结论:NTDLL的函数NtQuerySystemInformation不能获得真正的物理内存大小。
Re: 物理内存
benlong
2009-08-06, 14:15 下午
Nt和Zw的区别可以看看这篇文章
http://advdbg.com/download/storeshow.aspx?id=cba1a009-706b-46b9-9cd6-aab77e2b608c
Re: 物理内存
格蠹老雷
2009-08-06, 23:07 下午
用个时髦的词,晕。原来楼主想知道主板上到底插了多少内存,是写BIOS么?通常BIOS负责做这个事,要根据内存的类型(DDR,DDR2等),基于一种名为SPD(Serial Presense Detect)的协议去检测,然后再根据内存类型和具体协议来计算。下面的网页有一个比较老的SPEC:
http://www.datasheetcatalog.org/datasheet/SamsungElectronic/mXqququ.pdf
Re: 物理内存
格蠹老雷
2009-08-07, 22:51 下午
BIOS会把检测到的部分结果登记到北桥的寄存器中,因此如果是操作系统阶段需要,那么读取寄存器是比较快捷的方式,不过不确认这些寄存器的位置是否公开了。
Re: 物理内存
guozf
2009-08-10, 09:42 上午
嗯,好像看到一个工具可以读到这个值,不知道是怎么做的.
多谢Raymond.