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