线性地址的管理
文章目錄
- +0x11c VadRoot : Void
- FilePointer
- 結(jié)點(diǎn)中如何查看屬性
EPROCESS中
+0x11c VadRoot : Void
這就是個(gè)入口點(diǎn),從這個(gè)入口點(diǎn)開(kāi)始是一個(gè)搜索二叉樹(shù),這個(gè)二叉樹(shù)里面每個(gè)結(jié)點(diǎn)都記錄了一塊被占用的線(xiàn)性地址空間,結(jié)點(diǎn)類(lèi)型是_MMVD
類(lèi)型是 _MMVD,如下:
接下來(lái)探索一下:
因?yàn)樗歉?jié)點(diǎn),所以呢?父節(jié)點(diǎn)也就為null
左右子樹(shù)都是_MMVD,往下繼續(xù)找即可。左右子樹(shù)的父節(jié)點(diǎn)一定是上一個(gè)點(diǎn)。
為什么采用二叉樹(shù)的方式管理線(xiàn)性地址空間呢?
最主要的原因是使用二叉樹(shù)查詢(xún)的性能會(huì)更好(涉及數(shù)據(jù)結(jié)構(gòu))
這個(gè)StartingVpn和這個(gè)EndingVpn是以頁(yè)為單位也就是(4KB)0x1000
在StartingVpn這個(gè)地址后添加3個(gè)0,也就是這個(gè)結(jié)點(diǎn)描述的線(xiàn)性地址的起始地址
EndingVpn這個(gè)地址后添加3個(gè)0,也就是這個(gè)結(jié)點(diǎn)描述的線(xiàn)性地址的結(jié)束地址,也就是說(shuō)這塊線(xiàn)性地址已經(jīng)被占用了
(如果想知道整個(gè)用戶(hù)空間低2G的線(xiàn)性地址哪些地方?jīng)]有被占用的話(huà),需要遍歷這棵二叉樹(shù),然后去找哪些未在起始地址和結(jié)束地址中的線(xiàn)性地址,也就沒(méi)有被占用)
FilePointer
如果想知道這塊線(xiàn)性地址到底是被誰(shuí)占用的呢?可以通過(guò)ControlArea
看到這個(gè)結(jié)構(gòu)體后,再去看看這個(gè)結(jié)構(gòu)體中的一個(gè)FilePointer值
如果FilePointer的值是NULL,那就說(shuō)明這塊線(xiàn)性地址對(duì)應(yīng)的是真正的物理頁(yè)(這個(gè)內(nèi)存是使用VirtualAlloc 來(lái)分配的)
再來(lái)看看其它情況
近一步看到FilePointer值不為空,再來(lái)近一步查看FilePointer指向的地方
它是一個(gè)Map內(nèi)存,通過(guò)文件映射的內(nèi)存(這塊內(nèi)存通過(guò)文件映射得到的)
遍歷搜索鏈表操作:
!vad 根節(jié)點(diǎn)的地址(即vadRoot值)
結(jié)點(diǎn)中如何查看屬性
這里的_MMVAD_FLAGS(是+0x014中結(jié)構(gòu)體的成員)
dt _MMVAD_FLAGS
內(nèi)存分為兩類(lèi):
1.VirtualAlloc分配的普通內(nèi)存
2.map文件映射內(nèi)存
總結(jié)
- 上一篇: 私有句柄表(内核对象,并非用户对象),全
- 下一篇: 物理内存的管理