首先,檔案對映是虛存的中心概念, 檔案對映一方面給使用者提供了一組措施, 好似使用者將檔案對映到自己位址空間的某個部分, 使用簡單的記憶體訪問指令讀寫檔案;另一方面, 它也可以用於核心的基本組織模式, 在這種模式種, 核心將整個位址空間視為諸如檔案之類的一組不同物件的對映. 中的傳統檔案訪問方式是, 首先用open系統呼叫開啟檔案, 然後使用read, write以及lseek等呼叫進行順序或者隨即的i/o. 這種方式是非常低效的, 每一次i/o操作都需要一次系統呼叫. 另外, 如果若干個程序訪問同乙個檔案, 每個程序都要在自己的位址空間維護乙個副本, 浪費了記憶體空間. 而如果能夠通過一定的機制將頁面對映到程序的位址空間中, 也就是說首先通過簡單的產生某些記憶體管理資料結構完成對映的建立. 當程序訪問頁面時產生乙個缺頁中斷, 核心將頁面讀入記憶體並且更新頁表指向該頁面. 而且這種方式非常方便於同一副本的共享.
接下來,我們來看下在linux核心中mmap的函式原型:void *mmap(void *addr,size_t length ,int prot, int flags, int fd, off_t offset);
其中,addr是對映區起始位址,通常設為null,由系統指定。
length:將檔案的多大長度對映到記憶體
prot:對映區的保護方式,可以是:
prot_exec:對映區可被執行 prot_read:對映區可被讀取
prot_write:對映區可被寫入 prot_none:對映區不能訪問
flag:對映區的特性,可以是:
map_shard:對對映區的寫入資料會複製回檔案,且允許其他對映該檔案的程序共享
map_private:對對映區域的寫入資料會產生乙個對映的複製(copy-on-write),對此區域所做的修改不會寫回到原檔案
其他標識這裡就不再寫出來了,可以通過man mmap檢視
fd:由open返回的檔案描述符,代筆要對映的檔案
offset:以檔案開始處的偏移量,必須是分頁大小的整數倍,通常為0,表示從檔案頭開始對映
下面主要是分析有關mmap系統呼叫的實現過程:
1.先通過檔案系統定位要對映的檔案;
2.許可權檢查, 對映的許可權不會超過檔案開啟的方式, 也就是說如果檔案是以唯讀方式開啟, 那麼則不允許建立乙個可寫對映;
3.建立乙個vma物件, 並對之進行初始化;
4.呼叫對映檔案的mmap函式, 其主要工作是給vm_ops向量表賦值;
5.把該vma鏈入該程序的vma鍊錶中, 如果可以和前後的vma合併則合併;
6.如果是要求vm_locked(對映區不被換出)方式對映, 則發出缺頁請求, 把對映頁面讀入記憶體中.
附加:mmap的應用源**示例(把檔案對映到記憶體)
gcc -o map mmap.c
./map file_name
Mmap的實現原理和應用
1,普通的read write和mmap後的對映區域的讀寫到底有什麼區別。2,為什麼有時候會選擇mmap而放棄普通的read write。圍繞著這兩個問題分析一下,其實在考慮這些問題的同時不免和其他的很多系統機制產生互動。雖然是講解mmap,但是很多知識還是為了闡明問題做必要的鋪墊。這些知識也正是l...
Mmap的實現原理和應用
1,普通的read write和mmap後的對映區域的讀寫到底有什麼區別。2,為什麼有時候會選擇mmap而放棄普通的read write。圍繞著這兩個問題分析一下,其實在考慮這些問題的同時不免和其他的很多系統機制產生互動。雖然是講解mmap,但是很多知識還是為了闡明問題做必要的鋪墊。這些知識也正是l...
Mmap 實現原理和應用(流程)
在除錯完達文西的視屏輸入後記錄一下除錯心得。重點還是再次放在系統呼叫mmap後的記憶體分配上。做了乙個mmap系統呼叫的筆記以及記錄以備後用。大致介紹了linux中對於mmap的應用以及後續產生缺頁異常處理的乙個流程。由於之前的除錯中一直對於vma的區域選取產生疑問,不知道vma到底是何許人也,這次...