void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_toffset)
引數: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_tlength)
功能:取消引數start所指向的對映記憶體,引數length表示要取消的記憶體大小
返回值:解除成功返回0,否則返回-1,錯誤原因存於errno中。
#include #include#include#include#include#includeint main()
注意:當寫入時,mmap不會影響檔案的長度!
虛擬記憶體區域是程序的虛擬位址空間中的乙個同質區間,即具有同樣特性的連續位址範圍。
乙個程序的記憶體映象由下面幾部分組分:程式**、資料、bss和棧區域,以及記憶體對映的區域。通過/proc/pid/maps可以看到
linux核心使用結構vm_area_struct來描述虛擬記憶體區
其中幾個主要成員如下:
unsignedlongvm_start
虛擬記憶體區域起始位址
unsignedlongvm_end
虛擬記憶體區域結束位址
unsignedlongvm_flags
該區域的標記:如vm_io
vm_reserved
對映乙個裝置是指把使用者空間的一段位址關聯到裝置記憶體上
當程式讀寫這段使用者空間的位址時,它實際上是在訪問裝置。
步驟1)找到使用者空間的位址(核心自動幫你做好)
2)找到裝置的實體地址(檢視晶元手冊)
3)關聯(通過頁式管理)
mmap裝置方法所需要做的就是建立虛擬位址到實體地址的頁表
int(*mmap)(structfile*,structvm_area-strcut*)
核心幫我找的
mmap如何完成頁表的建立?
方法有二:
1)使用remap_pfn_range一次建立所有頁表
2)使用nopagevma方法每次建立乙個頁表
intremap_pfn_range(structvm_area_struct*vma,unsignedlongaddr,unsignedlongpfn,unsignedlongsize,pgprot_tprot)
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 t len,int prot,int flags,int fd,off t offset 引數 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 為無關聯的程序提供共享記...