Linux 内存映射函数 mmap()函数笔记
1.所需頭文件:<sys/mman.h>
2.函數原型:void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
(1)start:要映射到的內存區域的起始地址,通常都是用NULL(NULL即為0)。NULL表示由內核來指定該內存地址 ;
(2)length:要映射的內存區域的大小 ;
(3)prot:期望的內存保護標志,不能與文件的打開模式沖突。是以下的某個值,可以通過or運算合理地組合在一起 :
? ? ? ? ?PROT_EXEC //頁內容可以被執行?
? ? ? ? ?PROT_READ //頁內容可以被讀取?
? ? ? ? ?PROT_WRITE //頁可以被寫入?
? ? ? ? ?PROT_NONE //頁不可訪問?
(4)flags:指定映射對象的類型,映射選項和映射頁是否可以共享。它的值可以是一個或者多個以下位的組合體 :
? ? ? ? ?MAP_FIXED :使用指定的映射起始地址,如果由start和len參數指定的內存區重疊于現存的映射空間,重疊部分將會被丟? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 棄。如果指定的起始地址不可用,操作將會失敗。并且起始地址必須落在頁的邊界上。?
? ? ? ? ?MAP_SHARED :對映射區域的寫入數據會復制回文件內, 而且允許其他映射該文件的進程共享。?
? ? ? ? ?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一起使用時才有意義。不執行預讀,只為已存在于內存中的頁面建立入?口。
(5)fd:文件描述符(由open函數返回)?
(6)offset:表示被映射對象(即文件)從那里開始對映,通常都是用0。 該值應該為大小為PAGE_SIZE的整數倍 ;
(7)返回值:成功執行時,mmap()返回被映射區的指針,失敗時,mmap()返回MAP_FAILED
errno被設為以下的某個值?
EACCES:訪問出錯?
EAGAIN:文件已被鎖定,或者太多的內存已被鎖定?
EBADF:fd不是有效的文件描述詞?
EINVAL:一個或者多個參數無效?
ENFILE:已達到系統對打開文件的限制?
ENODEV:指定文件所在的文件系統不支持內存映射?
ENOMEM:內存不足,或者進程已超出最大內存映射數量?
EPERM:權能不足,操作不允許?
ETXTBSY:已寫的方式打開文件,同時指定MAP_DENYWRITE標志?
SIGSEGV:試著向只讀區寫入?
SIGBUS:試著訪問不屬于進程的內存區?
(8)使用例子:
int fd = open("/dev/mem",O_RDWR|O_SYNC);if(fd < 0) {printf("opent /dev/mem error! \r\n");close(fd);return; }maped_addr = (unsigned long*)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0xF8001000);3. int munmap(void *start, size_t length)?
start:要取消映射的內存區域的起始地址?
length:要取消映射的內存區域的大小。?
返回說明?
成功執行時munmap()返回0。失敗時munmap返回-1.
總結
以上是生活随笔為你收集整理的Linux 内存映射函数 mmap()函数笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 使用笔记
- 下一篇: kmalloc、vmalloc、mall