#include
//將檔案對映到記憶體
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
len:需要分配的記憶體長度
prot:期望的記憶體保護標識,不能與檔案開啟模式衝突
prot_exec //頁內容可以被執行
prot_read //頁內容可以被讀取
prot_write //頁可以被寫入
prot_none //頁不可訪問
flags:在呼叫mmap()時必須要指定map_shared 或map_private。
map_fixed //使用指定的對映起始位址,如果由start和len引數指定的記憶體區重疊於現存的對映空間,重疊部分將會被丟棄。如果指定的起始位址不可用,操作將會失敗。並且起始位址必須落在頁的邊界上。
map_shared //與其它所有對映這個物件的程序共享對映空間。對共享區的寫入,相當於輸出到檔案。直到msync()或者munmap()被呼叫,檔案實際上不會被更新。
map_private //建立乙個寫入時拷貝的私有對映。記憶體區域的寫入不會影響到原檔案。這個標誌和以上標誌是互斥的,只能使用其中乙個。
map_denywrite //這個標誌被忽略。
map_executable //同上
map_noreserve //不要為這個對映保留交換空間。當交換空間被保留,對對映區修改的可能會得到保證。當交換空間不被保留,同時記憶體不足,對對映區的修改會引起段違例訊號。
map_locked //鎖定對映區的頁面,從而防止頁面被交換出記憶體。
map_growsdown //用於堆疊,告訴核心vm系統,對映區可以向下擴充套件。
map_anonymous //匿名對映,對映區不與任何檔案關聯。(此時 fildes=-1)
map_anon //map_anonymous的別稱,不再被使用。
map_file //相容標誌,被忽略。
map_32bit //將對映區放在程序位址空間的低2gb,map_fixed指定時會被忽略。當前這個標誌只在x86-64平台上得到支援。
map_populate //為檔案對映通過預讀的方式準備好頁表。隨後對對映區的訪問不會被頁違例阻塞。
map_nonblock //僅和map_populate一起使用時才有意義。不執行預讀,只為已存在於記憶體中的頁面建立頁表入口。
fildes :開啟的檔案描述符open()
off:檔案的偏移
對返回得到的位址,我們就可以在這個位址上進行操作修改對映得到的記憶體。
注:經過自己對程序間通訊的嘗試,如果是空檔案的對映的話,是會出現bus error錯誤的,是越界行為,所以需要在建立檔案後寫入一些東西。
ex write(fildes," ",1);
//將記憶體中的對映寫回檔案(因此在之前都是不會寫回檔案的,map_anonymous除外)
int msync(void *addr, size_t len, int flags);
addr
指向的記憶體位址
len
重新整理區域長度
flags:
ms_aync
ms_sync
ms_invalidate//檔案中讀回資料
//釋放對映記憶體
int munmap(void *addr, size-t len);
如果有map_shared標識,是會被寫回檔案的。
如果標識為map_private,是不會被寫回檔案的。
addr
指向對映的記憶體位址
len
將更要被釋放的長度(所以此處可見,使可以分塊釋放對映的)
#include
#include
#include
#include
#include
#include
#include
int main()
char *addr=(char *)mmap(0,1024,prot_read|prot_write,map_shared,fildes,0);
if(addr==map_failed)else
}munmap(addr,1024);
close(fildes);
return
0;}
#include
#include
#include
#include
#include
#include
int main()
content=(char *)mmap(0,1024,prot_read,map_shared,fd,0);
if(content==map_failed)elseelse}}
//delete the file
unlink("./tmp");
munmap(content,16);
close(fd);
return
0;}
Linux mmap函式簡介
一 簡介 linux提供了記憶體對映函式mmap,它把檔案內容對映到一段記憶體上 準確說是虛擬記憶體上 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改,先來看一下mmap的函式宣告 原型 void mmap void addr,size t length,int prot,int flags,...
Linux mmap記憶體對映,檔案空洞詳解
我們知道,cpu從 i o裝置 讀寫的速度非常慢,而從 記憶體 讀寫的速度非常快,如果對乙個檔案需要進行多次讀寫,那麼每一次都呼叫 i o 讀寫操作時很不划算的,於是我們便將這個檔案 對映 到記憶體中,這樣cpu就可以直接快速讀寫。mmap記憶體對映是一種空間換時間的思想。另外,mmap記憶體對映可...
c語言學習筆記 記憶體管理 linux的記憶體映像
程式在記憶體中的儲存形式 程式儲存在flash中 程式在記憶體中主要分為以下幾段 段,資料段,唯讀資料段,bss段,堆,棧,檔案對映區,核心對映區 作業系統核心 程式一般存放在 段,在linux中又稱為文字段 資料段存放的一般是靜態變數和被初始化為非零值的全域性變數 bss段存放的是被初始化為零的全...