功能描述

  • mmap(memory map)
  • 將一個文件或其他對象映射進內存。
  • 文件被映射到多個page上, 若文件的大小不是所有page的大小之和, 最後一個page不被使用的空間將會被清零。
  • mummap(memory unmap)
  • 刪除特定地址區域的對象映射。
  • 在mmap和munmap執行過程的任何時刻, 被映射文件的st_atime可能被更新。
  • 若st_atime字段在上述情況下沒有得到更新, 首次對映射區的第一個頁索引時會更新該字段的值。
  • 使用用PROT(protected)_WRITE 和 MAP_SHARED標誌建立起來的文件映射, 其st_ctime(c: change) 和 st_mtime(m: modification) 在對映射區寫入之後與msync()[memory synchronize]通過MS_SYNC 和 MS_ASYNC[memory asynchronize]兩個標誌調用之前會被更新。

方法

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

參數

start:映射區的開始地址。
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:試着訪問不屬於進程的內存區