Linux記憶體對映 mmap函式

2021-06-18 01:45:34 字數 3014 閱讀 1878

linux提供了記憶體對映函式mmap, 它把檔案內容對映到一段記憶體上(準確說是虛擬記憶體上), 通過對這段記憶體的讀取和修改, 實現對檔案的讀取和修改, 先來看一下mmap的函式宣告:

原型:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);

返回值: 成功則返回對映區起始位址, 失敗則返回map_failed(-1).

引數:

flags: 對映區的特性, 可以是:

fd: 由open返回的檔案描述符, 代表要對映的檔案.

offset: 以檔案開始處的偏移量, 必須是分頁大小的整數倍, 通常為0, 表示從檔案頭開始對映.

下面說一下記憶體對映的步驟:

注意事項:

在修改對映的檔案時, 只能在原長度上修改, 不能增加檔案長度, 因為記憶體是已經分配好的.

記憶體對映,簡而言之就是將使用者空間的一段記憶體區域對映到核心空間,對映成功後,使用者對這段記憶體區域的修改可以直接反映到核心空間,相反,核心空間對這段區域的修改也直接反映使用者空間。那麼對於核心空間<---->使用者空間兩者之間需要大量資料傳輸等操作的話效率是非常高的。

[cpp]view plain

copy

print?

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

/*void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);

//該函式把乙個檔案或乙個posix共享記憶體區物件對映到呼叫程序的程序。

1.start:一般可以為null;

2.length:對映的位元組大小;

3.prot:對對映儲存的許可權訪問(prot_none:不可訪問;prot_read:可讀;

prot_write:可寫;prot_exec:可執行);

4.flags:map_fixed、map_shared(對記憶體的操作同樣影響檔案)、map_private

5.檔案描述附

6.要偏移的位置(seek_set、seek_cur、seek_end)

int munmap(void *start, size_t length);

//該函式用於取消對映

*/#define filename1 "./lhw1"

#define filename2 "./lhw2"

#define open_flag o_rdwr|o_creat

#define open_mode 00777

#define file_size 4096*4

static

intmy_mmap(

intdst, 

intsrc)  

;  //獲取開啟檔案的詳細資訊(主要要取得讀檔案的大小)

ret = fstat(src, &buf);  

if(-1 == ret)  

//對映原始檔的儲存區

add_src = mmap(null, buf.st_size, prot_read, map_shared, src, seek_set);  

if(null == add_src)  

//lseek dst(製造檔案空洞,使其有一定大小,沒有大小會出錯)

ret = lseek(dst, buf.st_size, seek_set);  

if(-1 == ret)  

//write dst

ret = write(dst, "w"

, 1);  

if(-1 == ret)  

//對映目標檔案的儲存區

add_dst = mmap(null, buf.st_size, prot_write, map_shared, dst, seek_set);  

if(null == add_dst)  

//memcpy 將原始檔記憶體add_src的內容拷貝到目標檔案add_dst,通過記憶體共享

memcpy(add_dst, add_src, buf.st_size);  

//取消對映

ret = munmap(add_src, buf.st_size);  

if(-1 == ret)  

ret = munmap(add_dst, buf.st_size);  

if(-1 == ret)  

_out:  

return

ret;  

}  int

main(

void

)    

//write fd1

ret = write(fd1, "howaylee"

, sizeof

("howaylee"

));  

if(-1 == ret)  

//open fd2

fd2 = open(filename2, open_flag, open_mode);  

if(-1 == (ret = fd2))  

//mmap

my_mmap(fd2, fd1);  

_out:     

return

ret;  

}  

Linux記憶體對映 mmap函式

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。標頭檔案 include函式原型void mmap void start,size t length,int prot,...

Linux記憶體對映 mmap

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

mmap記憶體對映

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