Windows核心编程 第十四章 虚拟内存
第1?4章?虛?擬?內(nèi)?存
<這一章沒啥,是說的幾個內(nèi)存相關(guān)的函數(shù)?>
14.1?系統(tǒng)信息
????許多操作系統(tǒng)的值是根據(jù)主機而定的,比如頁面的大小,分配粒度的大小等。這些值決不應(yīng)該用硬編碼的形式放入你的源代碼。相反,你始終都應(yīng)該在進程初始化的時候檢索這些值,并在你的源代碼中使用檢索到的值。G?e?t?S?y?s?t?e?m?I?n?f?o函數(shù)將用于檢索與主機相關(guān)的值:VOID?WINAPI?GetSystemInfo(_Out_?LPSYSTEM_INFO?lpSystemInfo);
必須傳遞S?Y?S?T?E?M?_?I?N?F?O結(jié)構(gòu)的地址給這個函數(shù)。這個函數(shù)將初始化所有的結(jié)構(gòu)成員然后返回。下面是S?Y?S?T?E?M?_?I?N?F?O數(shù)據(jù)結(jié)構(gòu)的樣子。
? ? 當系統(tǒng)引導(dǎo)時,它要確定這些成員的值是什么。對于任何既定的系統(tǒng)來說,這些值總是相同的,因此決不需要為任何既定的進程多次調(diào)用該函數(shù)。由于有了?G?e?t?S?y?s?t?e?m?I?n?f?o函數(shù),因此應(yīng)用程序能夠在運行的時候查詢這些值。在該結(jié)構(gòu)的所有成員中,只有?4個成員與內(nèi)存有關(guān)。表1?4?-?1對這4個成員作了描述。
14.2?虛擬內(nèi)存的狀態(tài)
Wi?n?d?o?w?s函數(shù)G?l?o?b?a?l?M?e?m?o?r?y?S?t?a?t?u?s可用于檢索關(guān)于當前內(nèi)存狀態(tài)的動態(tài)信息:
?
MEMORYSTATUS?mst?=?{sizeof(mst)};
GlobalMemoryStatus(&mst);
我本機是16G內(nèi)存,用上面的那個函數(shù)會出問題,得到的數(shù)據(jù)溢出了,超過4G內(nèi)存的需要用下面的函數(shù)來獲取內(nèi)存狀態(tài)信息。
MEMORYSTATUSEX?mst2?=?{sizeof(mst2)};
GlobalMemoryStatusEx(&mst2);
大致可以獲取的內(nèi)容是CPU使用率,計算機內(nèi)存大小,虛擬內(nèi)存大小等相關(guān)信息。
14.3?確定地址空間的狀態(tài)
Wi?n?d?o?w?s提供了一個函數(shù),可以用來查詢地址空間中內(nèi)存地址的某些信息(如大小,存儲器類型和保護屬性等)。實際上本章后面顯示的V?M?M?a?p示例應(yīng)用程序就使用這個函數(shù)來生成第1?3章所附的虛擬內(nèi)存表交換信息。這個函數(shù)稱為Vi?r?t?u?a?l?Q?u?e?r?y:
Wi?n?d?o?w?s還提供了另一個函數(shù),它使一個進程能夠查詢另一個進程的內(nèi)存信息:
? ? 這兩個函數(shù)基本相同,差別在于使用?Vi?r?t?u?a?l?Q?u?e?r?y?E?x時,可以傳遞你想要查詢的地址空間信息的進程的句柄。調(diào)試程序和其他實用程序使用這個函數(shù)最多,幾乎所有的應(yīng)用程序都只需要調(diào)用Vi?r?t?u?a?l?Q?u?e?r?y函數(shù)。當調(diào)用Vi?r?t?u?a?l?Q?u?e?r?y(E?x)函數(shù)時,p?v?A?d?d?r?e?s?s參數(shù)必須包含你想要查詢其信息的虛擬內(nèi)存地址。?P?m?b?i參數(shù)是你必須分配的M?E?M?O?RY?_?B?A?S?I?C?_?I?N?F?O?R?M?AT?I?O?N結(jié)構(gòu)的地址。該結(jié)構(gòu)在Wi?n?N?T.?h文件中定義為下面的形式:
? ? 最后一個參數(shù)是?d?w?L?e?n?g?t?h,用于設(shè)定?M?E?M?O?RY?_?B?A?S?I?C?_?I?N?F?O?R?M?AT?I?O?N結(jié)構(gòu)的大小。Vi?r?t?u?a?l?Q?u?e?r?y(E?x)函數(shù)返回拷貝到緩存中的字節(jié)的數(shù)量。
? ? 根據(jù)在p?v?A?d?d?r?e?s?s參數(shù)中傳遞的地址,Vi?r?t?u?a?l?Q?u?e?r?y(E?x)函數(shù)將關(guān)于共享相同狀態(tài)、保護屬性和類型的相鄰頁面的范圍信息填入?M?E?M?O?RY?_?B?A?S?I?C?_?I?N?F?O?R?M?AT?I?O?N結(jié)構(gòu)中。表1?4?-?3描述了該結(jié)構(gòu)的成員。
本章的剩余部分就是在說作者自己封裝的一個函數(shù)VMQuery,可以更詳細的獲取內(nèi)存信息。
????該結(jié)構(gòu)的其他成員與內(nèi)存管理毫無關(guān)系,為了完整起見,下面也對它們進行了介紹(見表1?4?-?2)。
總結(jié)
以上是生活随笔為你收集整理的Windows核心编程 第十四章 虚拟内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLL注入-APC注入
- 下一篇: Windows核心编程 第十五章 在应用