當前位置:編程學習大全網 - 源碼下載 - mmap的使用

mmap的使用

mmap 即 memory map,也就是內存映射。

mmap操作提供了壹種機制,讓用戶程序直接訪問設備內存,這種機制,相比較在用戶空間和內核空間互相拷貝數據,效率更高。在要求高性能的應用中比較常用。mmap映射內存必須是頁面大小的整數倍,面向流的設備不能進行mmap,mmap的實現和硬件有關。

映射條件:

mmap()必須以PAGE_SIZE為單位進行映射,而內存也只能以頁為單位進行映射,若要映射非PAGE_SIZE整數倍的地址範圍,要先進行內存對齊,強行以PAGE_SIZE的倍數大小進行映射。

頭文件:

<sys/mman.h>

函數原型:

void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

int munmap(void* start,size_t length);

參數說明:

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:有效的文件描述詞。壹般是由open()函數返回,其值也可以設置為-1,此時需要指定flags參數中的MAP_ANON,表明進行的是匿名映射。

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:試著訪問不屬於進程的內存區

特點:

使用說明:

適用場景:

mmap 的適用場景實際上非常受限,在如下場合下可以選擇使用 mmap 機制:

其他註意項:

  • 上一篇:魔域血族成神之後的技能有什麽?
  • 下一篇:Tbcc bep20通道的新的合約地址
  • copyright 2024編程學習大全網