mmap系統呼叫

2021-07-05 01:35:25 字數 2567 閱讀 2507

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )

記憶體對映函式mmap, 負責把檔案內容對映到程序的虛擬記憶體空間, 通過對這段記憶體的讀取和修改,來實現對檔案的讀取和修改,而不需要再呼叫read,write等操作。

addr:指定對映的起始位址, 通常設為null, 由系統指定。

length:對映到記憶體的檔案長度。

prot:對映區的保護方式, 可以是:

prot_exec: 對映區可被執行

prot_read: 對映區可被讀取

prot_write: 對映區可被寫入

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

map_shared:寫入對映區的資料會複製回檔案, 且允許其他對映該檔案的程序共享。

map_private:對對映區的寫入操作會產生乙個對映區的複製(copy-on-write), 對此區域所做的修改不會寫回原檔案。

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

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

int munmap(void *start,size_t length)

功能:取消引數start所指向的對映記憶體,引數length表示欲取消的記憶體大小。

返回值:解除成功返回0,否則返回-1,錯誤原因存於errno中。

mmap系統呼叫

虛擬記憶體區域是程序的虛擬位址空間中的乙個同質區間,即具有同樣特性的連續位址範圍。乙個程序的記憶體映象由下面幾部分組成:程式**、資料、bss和棧區域,以及記憶體對映的區域。

乙個程序的記憶體區域可以通過檢視/proc/pid/maps

08048000-0804f000 r-xp 00000000 08:01 573748 /sbin/rpc.statd #text

0804f000-08050000 rw-p 00007000 08:01 573748 /sbin/rpc.statd #data

08050000-08055000 rwxp 00000000 00:00 0 #bss

040000000-40015000 r-xp 00000000 08:01 933965 /lib/ld2.3.2.so #text

40015000-40016000 rw-p 00014000 08:01 933965 /lib/ld-2.3.2.so #data

每一行的域為:

start_end perm offset major:minor inode

start: 該區域起始虛擬位址

end: 該區域結束虛擬位址

perm: 讀、寫和執行許可權;表示對這個區域,允

許程序做什麼。這個域的最後乙個字元要麼是p

表示私有的,要麼是s表示共享的。

offset: 被對映部分在檔案中的起始位址

major、minor:主次裝置號

inode:索引結點

linux核心使用結構vm_area_struct()來描述虛擬記憶體區域,其中幾個主要成員如下:

unsigned long vm_start虛擬記憶體區域起始位址

unsigned long vm_end虛擬記憶體區域結束位址

unsigned long vm_flags該區域的標記。如:vm_io和vm_reserved。

vm_io將該vma標記為記憶體對映的io區域,

vm_io會阻止系統將該區域包含在程序的存放轉存(core dump )中,vm_reserved標誌記憶體區域不能被換出。

對映乙個裝置是指把使用者空間的一段位址關聯到裝置記憶體上。當程式讀寫這段使用者空間的位址時,它實際上是在訪問裝置。

mmap裝置操作

mmap裝置方法需要完成什麼功能?

mmap方法是file_oprations結構的成員,在mmap系統呼叫發出時被呼叫。在此之前,核心已經完成了很多任務作。mmap裝置方法所需要做的就是建立虛擬位址到實體地址的頁表。

int (*mmap) (struct file *, struct vm_area_struct *)

mmap如何完成頁表的建立?

方法有二:

1、使用remap_pfn_range一次建立所有頁表;

2、使用nopage vma方法每次建立乙個頁表。

mmap裝置操作

構造頁表的工作可由remap_pfn_range函式完成,原型如下:

int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,unsigned long pfn, unsigned long size, pgprot_t prot)

remap_page_range

vma:虛擬記憶體區域指標

virt_addr:虛擬位址的起始值

pfn:要對映的實體地址所在的物理頁幀號,可將實體地址》page_shift得到。

size:要對映的區域的大小。

prot:vma的保護屬性。

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

mmap系統呼叫

mmap 系統呼叫 功能 void mmap void addr size t len int prot int flags int fd off t offset 記憶體對映函式 mmap,負責把檔案內容對映到 程序的虛擬記憶體空間 通過對這段記憶體的讀取 和修改,來實現對檔案的讀取和修改 而不需...

read系統呼叫,mmap系統呼叫

read系統呼叫,mmap系統呼叫 2012 07 23 09 54 28 分類 linux 標籤 linux 檔案系統 虛擬記憶體 儲存系統 字型大小 訂閱 一般情況下,操作檔案既可以使用標準i o,也可直接使用系統呼叫。兩者有何區別呢?在輸入輸出中,直接使用底層的系統呼叫效率是非常低的,為什麼?...

Linux系統 mmap系統呼叫

函式原型 void mmap void addr size t len int prot int flags int fd off t offset 記憶體對映函式mmap,負責把檔案內容對映到程序的虛擬記憶體空間,通過對這段記憶體的讀取和修改,來實現對檔案的讀取和修改,而不需要再呼叫read,wr...