1. 程式人生 > >017 虛擬內存2

017 虛擬內存2

local -s bsp ont etl readwrite cal val 情況

技術分享

用戶地址空間

  ● 內存的分配

    ○ 當進程被創建並賦予它的地址空間時,該可用地址空間的主體是空閑的,即未被分配的。

      若要使用該地址空間的各個部分,必須通過調用 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)

技術分享

017 虛擬內存2