版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——Linux的mmap文件內(nèi)存映射機(jī)制Linux的mmap文件內(nèi)存映射機(jī)制
在陳述文件映射的概念時,不可避免的要牽涉到虛存(SVR4的VM)。實(shí)際上,文件映射是虛存的中心概念,文件映射一方面給用戶提供了一組措施,類似用戶將文件映射到自己地址空間的某個部分,使用簡單的內(nèi)存訪問指令讀寫文件;另一方面,它也可以用于內(nèi)核的基本組織模式,在這種模式中,內(nèi)核將整個地址空間視為諸如文件之類的一組不同對象的映射。Linux中的傳統(tǒng)文件訪問方式是,首先用open系統(tǒng)調(diào)用開啟文件,然后使用read,write以及l(fā)seek等調(diào)用進(jìn)行順序或者隨即的I/O.這種方式是十分低效的,每一次I/O操作都需要一次系統(tǒng)調(diào)用。另外,假使若干個進(jìn)程訪問同一個文件,每個進(jìn)程都要在自己的地址空間維護(hù)一個副本,浪費(fèi)了內(nèi)存空間。而假使能夠通過一定的機(jī)制將頁面映射到進(jìn)程的地址空間中,也就是說首先通過簡單的產(chǎn)生某些內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)完成映射的創(chuàng)立。當(dāng)進(jìn)程訪問頁面時產(chǎn)生一個缺頁中斷,內(nèi)核將頁面讀入內(nèi)存并且更新頁表指向該頁面。而且這種方式十分便利于同一副本的共享。
VM是面向?qū)ο蟮姆椒ㄔO(shè)計的,這里的對象是指內(nèi)存對象:內(nèi)存對象是一個軟件抽象的概念,它描述內(nèi)存區(qū)與后備存儲之間的映射。系統(tǒng)可以使用多種類型的后備存儲,譬如交換空間,本地或者遠(yuǎn)程文件以及幀緩存等等。VM系統(tǒng)對它們統(tǒng)一處理,采用同一操作集操作,譬如讀取頁面或者回寫頁面等。每種不同的后備存儲都可以用不同的方法實(shí)現(xiàn)這些操作。這樣,系統(tǒng)定義了一套統(tǒng)一的接口,每種后備存儲給出自己的實(shí)現(xiàn)方法。進(jìn)程的地址空間就被視為一組映射到不同數(shù)據(jù)對象上的的映射組成。所有的有效地址就是那些映射到數(shù)據(jù)對象上的地址。這些對象為映射它的頁面提供了持久性的后備存儲。映射使得用戶可以直接尋址這些對象。
值得提出的是,VM體系結(jié)構(gòu)獨(dú)立于Unix系統(tǒng),所有的Unix系統(tǒng)語義,如正文,數(shù)據(jù)及堆棧區(qū)都可以建構(gòu)在基本VM系統(tǒng)之上。同時,VM體系結(jié)構(gòu)也是獨(dú)立于存儲管理的,存儲管理是由操作系統(tǒng)實(shí)施的,如:畢竟采取什么樣的對換和請求調(diào)頁算法,畢竟是采取分段還是分頁機(jī)制進(jìn)行存儲管理,畢竟是如何將虛擬地址轉(zhuǎn)換成為物理地址等等(Linux中是一種叫ThreeLevelPageTable的機(jī)制),這些都與內(nèi)存對象的概念無關(guān)。
下面介紹Linux中VM的實(shí)現(xiàn)。
一個進(jìn)程應(yīng)當(dāng)包括一個mm_struct(memorymanagestruct),該結(jié)構(gòu)是進(jìn)程虛擬地址空間的抽象描述,里面包括了進(jìn)程虛擬空間的一些管理信息:start_code,end_code,start_data,end_data,start_brk,end_brk等等信息。另外,也有一個指向進(jìn)程虛存區(qū)表(vm_area_struct:virtualmemoryarea)的指針,該鏈?zhǔn)且勒仗摂M地址的增長順序排列的。在Linux進(jìn)程的地址空間被分作大量區(qū)(vma),每個區(qū)(vma)都對應(yīng)虛擬地址空間上一段連續(xù)的區(qū)域,vma是可以被共享和保護(hù)的獨(dú)立實(shí)體,這里的vma就是前面提到的內(nèi)存對象。下面是vm_area_struct的結(jié)構(gòu),其中,前半部分是公共的,與類型無關(guān)的一些數(shù)據(jù)成員,如:指向mm_struct的指針,地址范圍等等,后半部分則是與類型相關(guān)的成員,其中最重要的是一個指向vm_operation_struct向量表的指針vm_ops,vm_ops向量表是一組虛函數(shù),定義了與vma類型無關(guān)的接口。每一個特定的子類,即每種vma類型都必需在向量表中實(shí)現(xiàn)這些操作。這里包括了:open,close,unmap,protect,sync,nopage,wppage,swapout這些操作。
structvm_area_struct{
/*公共的,與vma類型無關(guān)的*/structmm_struct*vm_mm;unsignedlongvm_start;unsignedlongvm_end;
structvm_area_struct*vm_next;pgprot_tvm_page_prot;unsignedlongvm_flags;shortvm_avl_height;
structvm_area_struct*vm_avl_left;structvm_area_struct*vm_avl_right;structvm_area_struct*vm_next_share;structvm_area_struct**vm_pprev_share;/*與類型相關(guān)的*/
structvm_operations_struct*vm_ops;unsignedlongvm_pgoff;structfile*vm_file;unsignedlongvm_raend;void*vm_private_data;};
vm_ops:open,close,no_page,swapin,swapout??
介紹完VM的基本概念后,我們可以陳述mmap和munmap系統(tǒng)調(diào)用了。mmap調(diào)用實(shí)際上就是一個內(nèi)存對象vma的創(chuàng)立過程,mmap的調(diào)用格式是:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);其中start是映射地址,length是映射長度,假使flags的MAP_FIXED不被置位,則該參數(shù)尋常被忽略,而查找進(jìn)程地址空間中第一個長度符合的空閑區(qū)域;Fd是映射文件的文件句柄,offset是映射文件中的偏移地址;prot是映射保護(hù)權(quán)限,可以是PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NONE,flags則是指映射類型,可以是MAP_FIXED,MAP_PRIVATE,MAP_SHARED,該參數(shù)必需被指定為MAP_PRIVATE和MAP_SHARED其中之一,MAP_PRIVATE是創(chuàng)立一個寫時拷貝映射(copy-on-write),也就是說假使有多個進(jìn)程同時映射到一個文件上,映射建立時只是共享同樣的存儲頁面,但是某進(jìn)程企圖修改頁面內(nèi)容,則復(fù)制一個副本給該進(jìn)程私用,它的任何修改對其它進(jìn)程都不可見。而MAP_SHARED則無論修改與否都使用同一副本,任何進(jìn)程對頁面的修改對其它進(jìn)程都是可見的。
mmap系統(tǒng)調(diào)用的實(shí)現(xiàn)過程是:1.先通過文件系統(tǒng)定位要映射的文件;
2.權(quán)限檢查,映射的權(quán)限不會超過文件開啟的方式,也就是說假使文件是以只讀方式開啟,那么則不允許建立一個可寫映射;
3.創(chuàng)立一個vma對象,并對之進(jìn)行初始化;
4.調(diào)用映射文件的mmap函數(shù),其主要工作是給vm_ops向量表賦值;5.把該vma鏈入該進(jìn)程的vma鏈表中,假使可以和前后的vma合并則合并;6.假使是要求VM_LOCKED(映射區(qū)不被換出)方式映射,則發(fā)出缺頁請求,
把映射頁面讀入內(nèi)存中。
munmap(void*start,size_tlength):該調(diào)用可以看作是mmap的一個逆過程。它將進(jìn)程中從start開始length長度的一段區(qū)域的映射關(guān)閉,假使該區(qū)域不是恰好對應(yīng)一個vma,則有可能會分割幾個或幾個vma.
msync(void*start,size_tlength,intflags):把映射區(qū)域的修改回寫到后備存儲中。由于munmap時并不保證頁面回寫,假使不調(diào)用msync,那么有可能在munmap后丟失對映射區(qū)的修改。其中flags可以是MS_SYNC,MS_ASYNC,MS_INVALIDATE,MS_SYNC要求回寫完成后才返回,MS_ASYNC發(fā)出回寫請求后馬上返回,MS_INVALIDATE使用回寫的內(nèi)容更新該文件的其它映射。該系統(tǒng)調(diào)用是通過調(diào)用映射文件的sync函數(shù)來完成工作的。
brk(void*end_data_segement):將進(jìn)程的數(shù)據(jù)段擴(kuò)展到end_data_segement指定的地址,該系統(tǒng)調(diào)用和mmap的實(shí)現(xiàn)方式十分相像,同樣是產(chǎn)生一個vma,然后指定其屬性。不過在此之前需要做一些合法性檢查,譬如該地址是否大于mm->end_code,end_data_segement和mm->brk之間是否還存在其它vma等等。通過brk產(chǎn)生的vma映射的文件為空,這和匿名映射產(chǎn)生的vma相像,關(guān)于匿名映射不做進(jìn)一步介紹。庫函數(shù)malloc就是通過brk實(shí)現(xiàn)的。
Linux提供了內(nèi)存映射函數(shù)mmap,它把文件內(nèi)容映射到一段內(nèi)存上(確鑿說是虛擬內(nèi)存上),通過對這段內(nèi)存的讀取和修改,實(shí)現(xiàn)對文件的讀取和修改,先來看一下mmap的函數(shù)聲明:
頭文件:
原型:void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffsize);
返回值:成功則返回映射區(qū)起始地址,失敗則返回MAP_FAILED(-1)。參數(shù):addr:指定映射的起始地址,尋常設(shè)為NULL,由系統(tǒng)指定。length:將文件的多大長度映射到內(nèi)存。
prot:映射區(qū)的保護(hù)方式,可以是:PROT_EXEC:映射區(qū)可被執(zhí)行。
PROT_READ:映射區(qū)可被讀取。PROT_WRITE:映射區(qū)可被寫入。
PROT_NONE:映射區(qū)不能存取。
flags:映射區(qū)的特性,可以是:
MAP_SHARED:對映射區(qū)域的寫入數(shù)據(jù)會復(fù)制回文件,且允許其他映射該文件的進(jìn)程共享。
MAP_PRIVATE:對映射區(qū)域的寫入操作會產(chǎn)生一個映射的復(fù)制(copy-on-write),對此區(qū)域所做的修改不會寫回原文件。此外還有其他幾個flags不很常用,具體查看linuxC函數(shù)說明。fd:由open返回的文件描述符,代表要映射的文件。
offset:以文件開始處的偏移量,必需是分頁大小的整數(shù)倍,尋常為0,表示從文件頭開始映射。
下面說一下內(nèi)存映射的步驟:
1、用open系統(tǒng)調(diào)用開啟文件,并返回描述符fd.
2、用mmap建立內(nèi)存映射,并返回映射首地址指針start.對映射(文件)進(jìn)行各種操作,顯示(printf),修改(sprintf)。3、用munmap(void*start,size_tlenght)關(guān)閉內(nèi)存映射。4、用close系統(tǒng)調(diào)用關(guān)閉文件fd.
本卷須知:在修改映射的文件時,只能在原長度上修改,不能增加文件長度,由于內(nèi)存是已經(jīng)分派好的
Linux-mmap函數(shù)介紹mmap函數(shù)是unix/linux下的系統(tǒng)調(diào)用,來看《UnixNetwordprogramming》卷二12.2節(jié)對mmap的介紹:
ThemmapfunctionmapseitherafileoraPosixsharedmemoryobjectintotheaddressspaceofaprocess.Weusethisfunctionforthreepurposes:1.witharegularfiletoprovidememory-mappedI/O2.withspecialfilestoprovideanonymousmemorymappings3.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版港口工程保險合同3篇
- 二零二五版涵洞工程環(huán)保監(jiān)測合同3篇
- 二零二五版反擔(dān)保合同模板:供應(yīng)鏈金融3篇
- 二零二五年計時工勞動合同管理與心理關(guān)懷協(xié)議3篇
- 二零二五年度軟件開發(fā)項(xiàng)目合同及其廉潔規(guī)定2篇
- 二零二五版教育SaaS平臺軟件服務(wù)合同3篇
- 二零二五版粉煤灰運(yùn)輸安全規(guī)范與應(yīng)急預(yù)案編制合同3篇
- 二零二五年度特種飼料原料采購合同模板2篇
- 二零二五年防火墻安全防護(hù)系統(tǒng)集成與維護(hù)合同3篇
- 二零二五年度大數(shù)據(jù)中心建設(shè)與運(yùn)營勞務(wù)分包合同3篇
- 2024版塑料購銷合同范本買賣
- 【高一上】【期末話收獲 家校話未來】期末家長會
- 二年級下冊加減混合豎式練習(xí)360題附答案
- 應(yīng)收賬款的管理培訓(xùn)課件
- 2021年道路交通安全法期末考試試題含答案
- 股東變更情況報告表
- 自帶藥物治療告知書
- 房產(chǎn)中介門店6S管理規(guī)范
- 吞咽解剖和生理研究
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 異地就醫(yī)備案個人承諾書
評論
0/150
提交評論