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