mmap munmap函式詳解

2021-04-22 12:13:51 字數 2259 閱讀 8240

【 mmap/munmap系統呼叫】   

功能描述:

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。munmap執行相反的操作,刪除特定位址區域的物件對映。

基於檔案的對映,在mmap和munmap執行過程的任何時刻,被對映檔案的st_atime可能被更新。如果st_atime欄位在前述的情況下沒有得到

更新,首次對對映區的第乙個頁索引時會更新該字段的值。用prot_write 和 map_shared標誌建立起來的檔案對映,其st_ctime

和 st_mtime

在對對映區寫入之後,但在msync()通過ms_sync 和 ms_async兩個標誌呼叫之前會被更新。

用法:  

#include

void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

int munmap(void *start, size_t length);

引數:   

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:被對映物件內容的起點。

返回說明:   

成功執行時,mmap()返回被對映區的指標,munmap()返回0。失敗時,mmap()返回map_failed[其值為(void *)-1],munmap返回-1。errno被設為以下的某個值   

eacces:訪問出錯

eagain:檔案已被鎖定,或者太多的記憶體已被鎖定

ebadf:fd不是有效的檔案描述詞

einval:乙個或者多個引數無效

enfile:已達到系統對開啟檔案的限制

enodev:指定檔案所在的檔案系統不支援記憶體對映

enomem:記憶體不足,或者程序已超出最大記憶體對映數量

eperm:權能不足,操作不允許

etxtbsy:已寫的方式開啟檔案,同時指定map_denywrite標誌

sigsegv:試著向唯讀區寫入

sigbus:試著訪問不屬於程序的記憶體區

linux之檔案對映mmap munmap

1.檔案對映,能夠將硬碟對映到程序的位址,這樣可以向操作記憶體一樣來操作檔案,而且效率高 但是有一定的限制,檔案的長度必須大於等於對映的長度 對映的offset必須是頁 page 的整數倍 注意 對映不會增長檔案的長度 對映部分的內容應該是檔案本來就應該有的內容 2 檔案對映主要使用到兩個函式 分別...

mod函式詳解

我們知道,mod函式是乙個求餘函式,其格式為 mod nexp1,nexp2 即是兩個數值表示式作除法運算後的餘數。那麼 兩個同號整數求餘與你所知的兩個正數求餘完全一樣 即兩個負整數與兩個正整數的演算法一樣 一 兩個異號整數求餘 1.函式值符號規律 餘數的符號 mod 負,正 正 mod 正,負 負...

CDC PatBlt 函式詳解。

函式功能 該函式使用當前選入指定裝置環境中的刷子繪製給定的矩形區域。通過使用給出的光柵操作來對該刷子的顏色和表面顏色進行組合。函式原型 bool patblt hdc hdc,int nxleft,int nyleft,int nwidth,int nheight,dword dwrop 引數 hd...