2021 01 06 記憶體對映檔案

2021-10-14 03:35:13 字數 1453 閱讀 1592

好處:

免去了開啟檔案關閉檔案等等操作,想操作時直接操作自身的虛擬記憶體即可。

當要讀寫的檔案特別大的時候,記憶體對映檔案可以提供遠比io讀寫檔案更好的效能。

handle g_hmapfile;

lptstr g_lpbuff;

if (hmapfile == null)

//對映到虛擬記憶體

lpaddr = mapviewoffile(hmapfile, file_map_all_access, 0, 0, 0);

if (lpaddr == null)

//讀取檔案

dword dwtest1 = *(pdword)lpaddr;

dword dwtest2 = *((pdword)lpaddr + 0x20);

printf("dwtest1:%x dwtest2:%x\n", dwtest1, dwtest2);

//寫檔案

*(pdword)lpaddr = 0x41414141;

printf("寫入:%x\n", *(pdword)lpaddr);

//強制更新快取 立即顯示

//預設為了效率不會立即顯示 所以如果需要立即顯示 使用該api即可

flushviewoffile(((pdword)lpaddr), 4);

//關閉

其次對映到虛擬記憶體(mapviewoffile)。

讀取資料或修改資料。

最後釋放。

每個程式用到的dll(無論是kernel32.dll、user32.dll還是ntdll.dll),本質上在物理記憶體中都只有乙份。

作業系統不會為每個程序單獨分配記憶體,只不過是每個程序各自映**乙份。

a程序和b程序,如果a程序修改的時候,會複製乙份新的物理頁,讓a程序修改,而b程序不會受到影響。

例如:

在kernel32.dll中某個函式頭下了乙個斷點,位元組被修改為0xcc,但是其他程序並不受影響。

當資源釋放時,不會寫回到檔案裡,真正寫回去的還是原來的物理記憶體,而不是被複製的那乙份物理記憶體。

記憶體對映檔案

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的位址空間中去,在此之後程序操作文 件,就像操作程序空間裡的位址一樣了,比如使用 memcpy 等記憶體操作的函式。這種方法能 夠很好的應用在需要頻繁處理乙個檔案或者是乙個大檔案的場合,這種方式處理 io效率比 普通 io效率要高。另外,unix 把它做...

記憶體對映檔案

記憶體對映檔案有三種,第一種是可執行檔案的對映,第二種是資料檔案的對映,第三種是借助頁面交換檔案的記憶體對映.應用程式本身可以使用後兩種記憶體對映.1.可執行檔案對映 windows在執行乙個win32應用程式時使用的是記憶體對映檔案技術.系統先在程序位址空間的0x00400000以上保留乙個足夠大...

記憶體檔案對映

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...