mmap裝置方法筆記

2021-05-28 14:51:46 字數 2381 閱讀 5212

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 為無關聯的程序提供共享記...