mmap函式及其對映失敗原因分析

2021-06-10 05:51:21 字數 1622 閱讀 5430

mmap函式

標頭檔案:#include

函式原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

引數  start:對映區的開始位址,設定為0時表示由系統決定對映區的起始位址。

length:對映區的長度。

prot:期望的記憶體保護標誌,不能與檔案的開啟模式衝突。是以下的某個值,可以通過or運算合理地組合在一起

prot_exec //頁內容可以被執行

prot_read //頁內容可以被讀取

prot_write //頁可以被寫入

prot_none //頁不可訪問

flags:指定對映物件的型別,對映選項和對映頁是否可以共享。它的值可以是乙個或者多個以下位的組合體

map_fixed //使用指定的對映起始位址,如果由start和len引數指定的記憶體區重疊於現存的對映空間,重疊部分將會被丟棄。如果指定的起始位址不可用,操作將會失敗。並且起始位址必須落在頁的邊界上。

map_shared //與其它所有對映這個物件的程序共享對映空間。對共享區的寫入,相當於輸出到檔案。直到msync()或者munmap()被呼叫,檔案實際上不會被更新。

map_private //建立乙個寫入時拷貝的私有對映。記憶體區域的寫入不會影響到原檔案。這個標誌和以上標誌是互斥的,只能使用其中乙個。

map_denywrite //這個標誌被忽略。

map_executable //同上

map_noreserve //不要為這個對映保留交換空間。當交換空間被保留,對對映區修改的可能會得到保證。當交換空間不被保留,同時記憶體不足,對對映區的修改會引起段違例訊號。

map_locked //鎖定對映區的頁面,從而防止頁面被交換出記憶體。

map_growsdown //用於堆疊,告訴核心vm系統,對映區可以向下擴充套件。

map_anonymous //匿名對映,對映區不與任何檔案關聯。

map_anon //map_anonymous的別稱,不再被使用。

map_file //相容標誌,被忽略。

map_32bit //將對映區放在程序位址空間的低2gb,map_fixed指定時會被忽略。當前這個標誌只在x86-64平台上得到支援。

map_populate //為檔案對映通過預讀的方式準備好頁表。隨後對對映區的訪問不會被頁違例阻塞。

map_nonblock //僅和map_populate一起使用時才有意義。不執行預讀,只為已存在於記憶體中的頁面建立頁表入口。

fd:有效的檔案描述詞。如果map_anonymous被設定,為了相容問題,其值應為-1。

offset:被對映物件內容的起點。

第三個引數一般只用prot_read|prot_write,第四個引數一般用map_shared。

mmap裝置操作  mmap操作提供了一種機制,讓使用者程式直接訪問裝置記憶體,這種機制,相比較在使用者空間和核心空間互相拷貝資料,效率更高。在要求高效能的應用中比較常用。mmap對映記憶體必須是頁面大小的整數倍,面向流的裝置不能進行mmap,mmap的實現和硬體有關。

mmap失敗原因分析:若第二個引數length或者其大小不是頁面大小的整數倍時會導致對映失敗。

Linux記憶體對映 mmap函式

linux提供了記憶體對映函式mmap,它把檔案內容對映到一段記憶體上 準確說是虛擬記憶體上 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改,先來看一下mmap的函式宣告 原型 void mmap void addr,size t length,int prot,int flags,int f...

Linux記憶體對映 mmap函式

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。標頭檔案 include函式原型void mmap void start,size t length,int prot,...

C語言mmap 函式 建立記憶體對映

標頭檔案 include include 定義函式 void mmap void start,size t length,int prot,int flags,int fd,off t offsize 函式說明 mmap 用來將某個檔案內容對映到記憶體中,對該記憶體區域的訪問即是直接對該檔案內容的讀...