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...