首页
社区
课程
招聘
[求助]如何获取物理内存分布图
发表于: 2014-7-23 12:50 7032

[求助]如何获取物理内存分布图

2014-7-23 12:50
7032
如何获取物理内存分布图,该使用哪个API啊?内核态API是哪个啊?
如下图所示

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1933
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知道 啊 ,抢个 沙发 !!
2014-7-23 20:07
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=squdong;1303030]如何获取物理内存分布图,该使用哪个API啊?内核态API是哪个啊?
如下图所示
[/QUOTE]

从你的截图,硬件啊,他们占用的内存,不是内存条是物理内存啊,是他们有自身的内存,映射到物理内存空间而已,所以,如果你的物理内存,是指内存条的内存的话,那可以这么说。他们占用物理内存空间,但不占用物理内存。

对于这个图的地址范围怎么来的,那就得看设备类型了。如果是PCI设备,其实大部分都是可以从PCI空间里,获取所有PCI设备的配置,里头就包括这些设备占用的内存范围,注意这里所说的内存,不是内存条里的内存,是PCI自身的内存。至于其他的设备,很多由于比较古老,所以都是有固定的内存范围的,这些在硬件系统设计的时候,就应该考虑兼容性,专门留着这块地址空间这些老设备使用。

再来解释下物理内存空间和内存条的物理内存的区别。CPU可以直接访问物理内存,但是CPU访问内存的范围是定的,假设CPU有32个管脚用来访问内存,那么可以访问的物理内存地址范围就是0到2^32=4G,不管你的系统有多少G的内存,1G,还是10G,CPU都可以访问的范围是4G,那么,这个内存条大小,就是物理内存,而CPU可以访问的范围,就是物理内存空间了。为了让CPU可以操作设备,设备内存也是映射到这个空间来的,比如PCI设备的内存,就被映射到某一个物理地址内存范围了,这个时候,可能存在设备内存跟内存条的内存重叠,那这块重叠部分的物理内存,就无法访问到了。这个,是利用南北桥芯片来实现的,当CPU发出内存访问请求后,该请求发到北桥,北桥一看,没有设备内存,那就直接发给内存条,如果在设备内存区,就发往南桥,到了南桥,在判断下,究竟是那个设备的,如果是PCI,在发往PCI,PCI再把这些数据读出来。这个过程对CPU是透明的,CPU也不知道这个空间是内存条空间还是设备空间,这个只有主板设计人员和BIOS人员才知道,BIOS有调用,可以区分出那些内存是内存条内存,那些内存是保留内存,但是没有你的图那么详细,这个调用,主要给操作系统搜集物理内存用的
2014-7-24 00:05
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
我要的就是Windows下面时E820,int15h的BIOS调用返回的内存分布图,想了解windows是不是按照这个分配內存的,Win8.1update以后好象不完全按BIOS分配。要原理,要API
2014-7-24 00:38
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
很好很强大
2014-7-24 01:39
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
关于PFN DataBase

页帧号数据库 ( PFN DataBase ) 概述

    物理内存被分页,对于32位的CPU来说,每个物理页大小是4K。对于每一个物理页,系统使用一个24字节长的结构来保存它的相关信息,比如该物理页是否已经被使用。为了便于描述,我们把这个结构叫做PfnDataBaseEntry ,页帧号数据库项。页帧号数据库就是一个 PfnDataBaseEntry 数组,这个数组的每一项对应一个物理页。比如 PfnDataBase 数组第0项,对应物理页0,也就是页帧号为0的物理页。第1项,对应物理1,也就是页帧号为1的物理页。系统把PfnDataBase的首地址保存在全局变量 MmPfnDatabase 中。现在我们来分析一下 物理页的页帧号(PFN),物理页的物理地址范围,物理页的页帧号数据库项之间的关系。对于物理页i,它的页帧号是i。由物理地址从i*0x1000到i*0x1000+0xFFF,这4KB物理内存单元组成。对应的页帧号数据库项为第i项,虚拟地址为 *MmPfnDatabase+i*0x18。比如在当前我所在的Win2k中,对于物理页3,它的页帧号是3,由物理地址0x3000-0x3FFF这4k的物理内存单元组成,当前我的 MmPfnDatabase 中的值为 0x81456000,即PfnDataBase 的首地址为 0x81456000,所以对应的 PfnDataBaseEntry 虚拟地址为 0x81456000 + 3*0x18 = 0x81456048。

PfnDataBaseEntry 的具体内容如下

struct PfnDataBaseEntry (大小24个字节,即0x18个字节)
/*00*/ uint32 flink
/*04*/ uint32 pteaddress
/*08*/ uint32 blink / share count
/*0C*/ byte flags
/*0D*/ byte page state
/*0E*/ uint16 reference count
/*10*/ uint32 restore pte
/*14*/ uint32 containing page
/*00*/ uint32 flink
链上前一个 PfnDataBaseEntry 的页帧号,如果为 0xFFFFFFFF 表示没有前一个 PfnDataBaseEntry。
/*08*/ uint32 blink / share count
对于使用链表链在一起的物理页,表示后一个 PfnDataBaseEntry 的页帧号,如果为 0xFFFFFFFF 表示没有后一个 PfnDataBaseEntry。对于没有使用链表链在一起的物理页,表示共享计数。
/*0C*/ byte flags
一些标志信息。
/*0D*/ byte page state
指出物理页的状态,就是从这里判断一个物理页是否已经被使用。物理页共有8种不同的状态。
Active(Valid):
这个物理页在某个进程的 Working Set 中,该进程的一个有效的页表项中的高20bit正是这个物理页的PFN。
Transition:
系统正在从一个文件将内容读入该物理页,或者正在向一个文件写出该物理页内容。
Standby:
这个物理页曾经在某个进程的 Working Set 中,并且物理页中的内容在被该进程使用时没有被改变过。但是现在已经被移出该进程的 Working Set,不过物理页中的内容仍是在该进程 Working Set 中时的内容。该进程相应的PTE中的高20bit仍然是这个物理页的页帧号,只是该PTE被标为 invalid 和 transition。当该进程需要再次访问这一页的内容时,只需要重新设定该PTE的标志,并把该PTE变为有效。把该物理页从 Standby 状态变为Active(Valid) 状态就可以了。
Modified:
这个物理页曾经在某个进程的 Working Set 中,并且物理页中的内容在被该进程使用时被改变过。但是现在已经被移出了该进程的 Working Set,不过物理页中的内容仍是被移出时的内容。该进程相应的PTE中的高20bit仍然是这个物理页的页帧号,只是该PTE被标为 invalid 和 transition。当该进程需要再次访问这一页的内容时,只需要重新设定该PTE的标志,并把该PTE变为有效。把该物理页从 Modified 状态变为Active(Valid) 状态就可以了。在该物理页被系统作为其他用途使用之前,该物理页中的内容需要被写入硬盘中的交换文件的相应页。
Modified no-write:
内存管理器的 Modified Page Writer 将不会把这种物理页写入硬盘,其他和 Modified 物理页一样。比如,NTFS使用这个状态来保证在log之前,该页不会被写入硬盘。
Free:
该物理页中的内容不再被需要,比如一个进程结束,这个进程所使用的一些物理页就会变为 Free 状态。(由于安全的原因,这些页需要被用零初始化,才能给一个用户进程使用)
Zeroed:
该页free并且已经被用零初始化。
Bad:
该页存在硬件错误,不能被使用。
其中 Zeroed,Free,Standby,Modified,ModifiedNoWrite,Bad 这6种状态的 PfnDataBaseEntry 使用PfnDataBaseEntry 的 flink,blink 链在该状态的 PfnDataBaseEntry链上。系统通过全局变量MmZeroedPageListHead,MmFreePageListHead,MmStandbyPageListHead,MmModifiedPageListHead,MmModifiedNoWritePageListHead,MmBadPageListHead 可以找到这6个链。这样当需要使用物理页的时候系统就可以很快的从相应的链中取出物理页。Active(Valid) 和 Transition 状态的 PfnDataBaseEntry 没有被任何链表链在一起,但是通过各个进程的PTE我们就可以找到,PTE的高20bit就是一个页帧号。
上传的附件:
2014-7-24 06:40
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
http://bbs.pediy.com/showthread.php?t=111508

乱侃Windows NT内核之内存管理
2014-7-24 07:00
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
瞎掰的,大牛不要信以为真啊
2014-7-24 14:24
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大哥,这是操作系统的物理内存管理,你的图指的是设备内存,这是两码事好不好,我说了半天你难道没搞明白么
2014-7-24 14:25
0
游客
登录 | 注册 方可回帖
返回
//