Linux記憶體對映 mmap函式

2021-08-20 20:10:30 字數 3266 閱讀 7260

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。

標頭檔案

#include
函式原型
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

int munmap(void* start,size_t length);

用法:
1、用open系統呼叫開啟檔案, 並返回描述符fd.

2、用mmap建立記憶體對映, 並返回對映首位址指標start.

3、對對映(檔案)進行各種操作, 顯示(printf), 修改(sprintf).

4、用munmap(void *start, size_t lenght)關閉記憶體對映.

5、用close系統呼叫關閉檔案fd.

函式主要用途
1、將乙個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代i/o讀寫,以獲得較高的效能;

2、將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間;

3、為無關聯的程序提供共享記憶體空間,一般也是將乙個普通檔案對映到記憶體中。

4、對映記憶體位址,對記憶體進行直接操作

引數flags:影響對映區域的各種特性。在呼叫mmap()時必須要指定map_shared 或map_private。

引數fd:要對映到記憶體中的檔案描述符。如果使用匿名記憶體對映時,即flags中設定了map_anonymous,fd設為-1。有些系統不支援匿名記憶體對映,則可以使用fopen開啟/dev/zero檔案,然後對該檔案進行對映,可以同樣達到匿名記憶體對映的效果。

引數offset:檔案對映的偏移量,通常設定為0,代表從檔案最前方開始對應,offset必須是分頁大小的整數倍。

返回值:

錯誤**:

ebadf 引數fd 不是有效的檔案描述詞

eacces 訪問許可權有誤。如果是map_private 情況下檔案必須可讀,使用map_shared則要有prot_write以及該檔案要能寫入。

einval 引數start、length 或offset有乙個不合法。

eagain 檔案被鎖住,或是有太多記憶體被鎖住。

enomem 記憶體不足。

length:要取消對映的記憶體區域的大小。

返回值:

對對映記憶體的內容的更改並不會立即更新到檔案中,而是有一段時間的延遲,你可以呼叫msync()來顯式同步一下, 這樣你記憶體的更新就能立即儲存到檔案裡

int msync(const void *start, size_t length, int flags);

fd=open(name, flag, mode); 

if(fd<0)

...ptr=mmap(null, len , prot_read|prot_write, map_shared , fd , 0);

基本過程

對映的實現

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define device_name "mymap"

static

unsigned

char

array[10]=;

static

unsigned

char *buffer;

static

int my_open(struct inode *inode, struct file *file)

static

int my_map(struct file *filp, struct vm_area_struct *vma)

static

struct file_operations dev_fops = ;

static

struct miscdevice misc = ;

static

int __init dev_init(void)

static

void __exit dev_exit(void)

module_init(dev_init);

module_exit(dev_exit);

module_license("gpl");

module_author("lkn@scut");

#include 

#include

#include

#include

#include

#include

#include

#include

#define page_size 4096

int main(int argc , char *argv)

//記憶體對映

p_map = (unsigned

char *)mmap(0, page_size, prot_read | prot_write, map_shared,fd, 0);

if(p_map == map_failed)

//列印對映後的記憶體中的前10個位元組內容

for(i=0;i<10;i++)

printf("%d\n",p_map[i]);

here:

munmap(p_map, page_size);

return

0;

}

先載入驅動後執行應用程式,使用者空間列印如下:

Linux記憶體對映 mmap函式

linux提供了記憶體對映函式mmap,它把檔案內容對映到一段記憶體上 準確說是虛擬記憶體上 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改,先來看一下mmap的函式宣告 原型 void mmap void addr,size t length,int prot,int flags,int f...

Linux記憶體對映 mmap

linux提供了記憶體對映函式mmap,它把檔案內容對映到一段記憶體上 準確說是虛擬記憶體上 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改,先來看一下mmap的函式宣告 原型 void mmap void addr,size t length,int prot,int flags,int f...

mmap記憶體對映

記憶體對映是個很有用,也很有意思的思想。我們都知道作業系統分為使用者態和核心態,使用者態是不能直接和物理裝置打交道的,如果想把硬碟的一塊區域讀到使用者態,則需要兩次拷貝 硬碟 核心 使用者 但是記憶體對映的設計只需要發生一次的拷貝,大大的提高了讀取資料的效率。那麼記憶體對映的原理和核心是如何實現的呢...