概念
記憶體映像,指的是核心在記憶體中如何存放可執行程式檔案。像使用虛擬記憶體一樣,使用記憶體映像檔案同樣需要經過保留和提交兩個過程,首先在進程記憶體空間保留一塊區域,然後提交物理存儲給這段區域(映像)。不同的是物理存儲來自於磁碟上的檔案,而不是系統的分頁檔案。也即將磁碟上指定的數據檔案作為虛擬記憶體,這個實現過程被稱為檔案映像,可以將檔案全部或部分映像到進程的地址空間中。檔案映像過以後,可以把檔案映像的部分當作已全部被載入記憶體一樣的去訪問它,這時又稱它為記憶體映像檔案。
記憶體檔案映射也是Windows的一種記憶體管理方法,提供了一個統一的記憶體管理特徵,使應用程式可以通過記憶體指針對磁碟上的檔案進行訪問,其過程就如同對載入了檔案的記憶體的訪問。通過檔案映射這種使磁碟檔案的全部或部分內容與進程虛擬地址空間的某個區域建立映射關聯的能力,可以直接對被映射的檔案進行訪問,而不必執行檔案I/O操作也無需對檔案內容進行緩衝處理,所有的檔案快取操作均由系統直接管理,由於取消了將檔案數據載入到記憶體、數據從記憶體到檔案的回寫以及釋放記憶體塊等步驟,使得記憶體映射檔案在處理大數據量的檔案時能起到相當重要的作用。
套用
1. 系統使用記憶體映像檔案載入和執行.EXE和.DLL檔案。一方面節省了系統分頁檔案空間,另一方面縮短了載入應用程式開始執行所需的時間。
2. 使用記憶體映像檔案訪問磁碟上的數據檔案。繞開對檔案實行I/O操作和對檔案內容的緩衝,交由作業系統核心去完成。
3. 使用記憶體映像檔案可以實現在多個進程間彼此共享數據。Windows提供了在進程間進行數據通信的其它多種方法。但這些方法也是通過記憶體映像檔案來實現的,所以記憶體映像檔案是實現進程間通信最有效率的方法。
區別
可執行程式檔案和記憶體映像的區別
1、可執行程式是位於硬碟上的,而記憶體映像位於記憶體上;
2、 可執行程式沒有堆疊,因為只有當程式被載入到記憶體上的時候才會分配相應的堆疊;
3、 執行程式是靜態的,因為它還沒運行,但是記憶體映像是動態的,數據是隨著運行過程改變的;
布局
Linux下的記憶體映像布局一般有如下幾個段(從低地址到高地址) :
1) 代碼段: 即二進制機器代碼,代碼段是唯讀的,可以被多個進程共享;
2) 數據段: 存儲已初始化的變數,包括全局變數和初始化了的靜態變數;
3) 未初始化數據段: 存儲未被初始化的靜態變數,也就是BSS段;
4)堆: 用於存放動態分配的變數;
5) 棧: 用於函式調用,保存函式返回值,參數等等;