017 虛擬記憶體2

2022-10-11 04:54:12 字數 2626 閱讀 7618

使用者位址空間

● 記憶體的分配

○ 當程序被建立並賦予它的位址空間時,該可用位址空間的主體是空閒的,即未被分配的。

若要使用該位址空間的各個部分,必須通過呼叫 virtualalloc函式來分配它裡邊的各個區域。

每當你保留位址空間的乙個區域時,系統要確保該區域從乙個分配顆度的邊界開始。

當你保留位址空間的乙個區域時,系統還要確保該區域的大小是系統的頁面大小倍數。

● 分配顆粒

○ 所有cpu平台都會使用相同的分配顆粒即 64kb.

● 頁面大小

○ 4kb

● virtualalloc 函式

函式原型

1

lpvoid winapi virtualalloc(

2_in_opt_ lpvoid lpaddress,

3_in_ size_t dwsize,

4_in_ dword flallocationtype,

5_in_ dword flprotect

6 );

○ 引數1:lpaddress

要分配的記憶體區域的位址

○ 引數2:dwsize

分配的大小

○ 引數3:flallocationtype

分配的型別

○ 引數4:flprotect

該記憶體的初始保護屬性

可能的數值

含義mem_commit 0x1000

為指定位址空間提交物理記憶體。這個函式初始化內在為零

試圖提交已提交的記憶體頁不會導致函式失敗。這意味著您可以在不確定當前頁的當前提交狀態的情況下提交一系列頁面。

如果尚未保留記憶體頁,則設定此值會導致函式同時保留並提交記憶體頁。

mem_reserve 0x2000

保留指定位址空間,不分配物理記憶體。

這樣可以阻止其他記憶體分配函式malloc和localalloc等再使用已保留的記憶體範圍,直到它被被釋放。

當使用上面的virtualalloc函式保留了一段地止空間後,接下還你還可以繼續多次呼叫同樣的函式提交這段位址空間中的不同頁面。

mem_reset0x80000

表示,在所指定的記憶體範圍內的資料lpaddress的dwsize不再是利益。頁面不應該被讀出或寫入到分頁檔案。然而,將再次使用的記憶體塊後,所以它不應該decommitted的 。這個值不能使用任何其他的價值 。

使用這個值並不保證範圍與經營mem_reset將包含零。如果你想的範圍包含零,decommit記憶體,然後將它重新作出 。

當您指定mem_reset,virtualalloc函式忽略值flprotect。但是,您仍然必須設定flprotect有效的值,比如,page_noaccess。

如果你使用mem_reset的記憶體範圍對映到乙個檔案,virtualalloc返回乙個錯誤。如果它被對映到分頁檔案共享檢視是唯一可以接受的的 。

分配型別 也可以是下列值

可能的數值

含義mem_large_pages0x20000000的

分配記憶體使用大頁面支援。

大小和對齊必須是乙個大頁面的最低多個 。要獲得這個值,使用getlargepageminimum。

mem_physical0x400000

儲備的位址範圍,可用於記憶體位址視窗擴充套件(awe)的頁面。

此值必須使用mem_reserve,並沒有其他值。

mem_top_down0x100000

在盡可能高的位址分配記憶體。這可以比普通的分配速度較慢,尤其是當需要許多分配。

mem_write_watch0x200000

導致系統來跟蹤分配的地區,都寫在頁面 。如果指定此值,則還必須指定mem_reserve。

要檢索的頁面是否寫入,因為該地區被分配或寫跟蹤狀態被重置位址,呼叫getwritewatch功能。要重置寫跟蹤狀態,呼叫getwritewatch或resetwritewatch。寫跟蹤功能仍然啟用,直到該地區被釋放。

訪問型別

page_readonly 0x02

該區域為唯讀。如果應用程式試圖訪問區域中的頁的時候,將會被拒絕訪問。

page_execute 0x10

區域包含可被執行的**。試圖讀寫該區域的操作將被拒絕。

page_execute_read 0x20

區域包含可執行**,應用程式只能讀該區域。

page_readwrite 0x04

區域不可執行**,應用程式可以讀寫該區域。

page_execute_readwrite 0x40

區域可以執行**,應用程式可以讀寫該區域。

page_guard 0x100

區域第一次被訪問時進入乙個status_guard_page異常,這個標誌要和其他保護標誌合併使用,表明區域被第一次訪問的許可權

page_noaccess 0x01

任何訪問該區域的操作將被拒絕

page_nocache 0x200

ram中的頁對映到該區域時將不會被微處理器快取(cached)

虛擬記憶體應用

虛擬記憶體的重要性體現在下面幾個方面 1 虛擬記憶體可以對映到硬碟,以達到擴充套件記憶體的作用,這樣系統在物理記憶體已經用滿的情況下,就不會因為沒有記憶體可用,而導致系統崩潰。2 虛擬記憶體是以程序空間為定址空間的,一般情況,程序使用者模式下的定址空間 是2g,為了避免記憶體的碎片,可以把2g程序空...

虛擬記憶體(Virtual Memory)

虛擬記憶體 virtual memory 是windows管理所有可用記憶體的方式。對於32位windows系 統,每個程序所用到的虛擬記憶體位址從0到2 32 1,總容量4gb,其中2gb是與作業系統以 及其他所有程序所共享,另外2gb分派給程序獨佔 這就是常說的32位windows中乙個進 程最...

虛擬記憶體使用

虛擬記憶體使用一 簡介windows 提供了3 中進行記憶體管理的方法,包括 虛擬記憶體 一般用來管理大型資料結構,受到硬碟調頁檔案的支援 記憶體對映檔案 常用來管理大型資料流和多程序共享。記憶體堆 最適合用來管理大量的小物件。二 虛擬記憶體的使用 1 我們可以在程序的位址空間中保留乙個區域 pvo...