Linux mmap函式的記憶體對映

2021-07-02 07:44:08 字數 2756 閱讀 8847

#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段存放的是被初始化為零的全...