void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
引數:addr
指定對映的起始位址(通常不指定)通常為null
,由系統指定
length
對映到記憶體的檔案長度
prot
對映區的保護方式:
prot_exec:對映區可被執行
prot_read:對映區可被讀取
protwrite:對映區可被寫入
flags
對映區的特性:
map_shared:寫入對映區的內容最後要寫入檔案
map_private:最後不會寫入檔案 fd
由open
返回的檔案描述符,代表要對映的檔案
offset
以檔案開始處的偏移量,必須是分布大小的整數倍,通常為0
,表示從檔案頭開始對映 返回
會返回起始位址,本來mmap
是指向記憶體位址的指標
記憶體對映函式mmap
,負責把檔案內容對映到程序的虛擬記憶體空間,通過對這段記憶體的讀取和修改,來實現對檔案的讀取和修改,而不需要再呼叫read
、write
等操作。直接用指標操作檔案的內容。
圖中 左邊的是程序的虛擬空間,右邊的是檔案。
函式原型:
int munmap(void *start, size_t length)
功能:取消引數start
所指向的對映記憶體,引數
length
表示要取消的記憶體大小
返回值:解除成功返回0
,否則返回
-1,錯誤原因存於
errno
中。
#include #include#include#include#include#includeint main()
注意:當寫入時,mmap
不會影響檔案的長度!
虛擬記憶體區域是程序的虛擬位址空間中的乙個同質區間,即具有同樣特性的連續位址範圍。
乙個程序的記憶體映象由下面幾部分組分:程式**、資料、bss
和棧區域,以及記憶體對映的區域。通過
/proc/pid/maps
可以看到
linux核心使用結構
vm_area_struct
來描述虛擬記憶體區
其中幾個主要成員如下:
unsigned long vm_start
虛擬記憶體區域起始位址
unsigned long vm_end
虛擬記憶體區域結束位址
unsigned long vm_flags
該區域的標記:如vm_io
vm_reserved
對映乙個裝置是指把使用者空間的一段位址關聯到裝置記憶體上
當程式讀寫這段使用者空間的位址時,它實際上是在訪問裝置。
步驟1)找到使用者空間的位址(核心自動幫你做好)
2)找到裝置的實體地址(檢視晶元手冊)
3)關聯 (通過頁式管理)
mmap裝置方法所需要做的就是建立虛擬位址到實體地址的頁表
int (*mmap)(struct file * , struct vm_area-strcut *)
核心幫我找的
mmap如何完成頁表的建立?
方法有二:
1)使用
remap_pfn_range
一次建立所有頁表
2)使用
nopage vma
方法每次建立乙個頁表
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn,unsigned long size, pgprot_t prot)
vma虛擬記憶體區域指標
virt_addr
虛擬位址的起始值
pfn要對映的實體地址所在的物理頁幀號(
實體地址的序列號),可將物理地》pge_shift
得到,即右移
12位,相當於除以4k(
2^12)
prot
vma的保護屬性
例子:
static int memdev_mmap(struct file*filp, struct vm_area_struct *vma)
mmap裝置方法筆記
void mmap void addr,size tlen,intprot,intflags,intfd,off toffset 引數 addr 指定對映的起始位址 通常不指定 通常為null,由系統指定 length 對映到記憶體的檔案長度 prot 對映區的保護方式 prot exec 對映區可...
8 1 MMAP裝置方法
記憶體對映函式mmap,負責把檔案內容對映到程序的虛擬記憶體空間,通過對這段記憶體的讀取和修改,來實現對檔案的讀取和修改,而不需要再呼叫read,write等。addr 指定起始位址,通常設為null,由系統指定 length 對映到記憶體的檔案長度 port 對映區的保護方式可以為以下 prot ...
mmap函式的使用方法
unix網路程式設計第二卷程序間通訊對mmap函式進行了說明。該函式主要用途有三個 1 將乙個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代i o讀寫,以獲得較高的效能 2 將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間 3 為無關聯的程序提供共享記...