




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux虛擬內(nèi)存管理基礎(chǔ)v2第一頁,共23頁。主要內(nèi)容虛擬內(nèi)存管理的基本原理和基本過程。CPU對(duì)虛擬內(nèi)存管理的支持。(ULKCh.2)Linux如何管理頁表。(ULKCh.2)Linux如何管理物理內(nèi)存(ULKCh.8)Linux如何管理虛擬空間的內(nèi)核地址空間部分(ULKCh.8)Linux如何管理虛擬空間的進(jìn)程地址空間部分(ULKCh.9)Linux如何在物理內(nèi)存和外出之間同步數(shù)據(jù)(ULKCh.15)Linux如何主動(dòng)回收物理內(nèi)存(ULKCh.17)注:無法全部講騷瑞2第二頁,共23頁。從宏觀角度….Linux的虛擬內(nèi)存管理機(jī)制為應(yīng)用程序和驅(qū)動(dòng)程序提供了兩種服務(wù):使每個(gè)進(jìn)程都擁有自己獨(dú)立的內(nèi)存地址空間;對(duì)于32位Linux而言,每個(gè)任務(wù)可尋址的內(nèi)存地址空間都為0x00000000~0xFFFFFFFF(232,4GB)當(dāng)物理內(nèi)存不夠4GB時(shí),虛擬內(nèi)存管理模塊會(huì)用外存空間模擬內(nèi)存空間,并且該模擬過程對(duì)應(yīng)用程序是透明的。3第三頁,共23頁。用戶地址空間與內(nèi)核地址空間Linux將每個(gè)進(jìn)程的4GB的獨(dú)立地址空間又劃分為用戶地址空間(0x00000000~0xBFFFFFFF)和內(nèi)核地址空間(0xC0000000~0xFFFFFFFF)兩部分。操作系統(tǒng)內(nèi)核代碼和數(shù)據(jù)存放在內(nèi)核地址空間;每個(gè)進(jìn)程自己私有的代碼和數(shù)據(jù)存放在用戶地址空間雖然Linux的內(nèi)核代碼和數(shù)據(jù)被映射到了每個(gè)進(jìn)程的地址空間中(所有進(jìn)程看到的內(nèi)容是相同的),但在實(shí)際的物理內(nèi)存中,只有內(nèi)核代碼和數(shù)據(jù)的一份拷貝。4第四頁,共23頁。用戶地址空間與內(nèi)核地址空間5第五頁,共23頁。用戶態(tài)與核心態(tài)一般現(xiàn)代CPU都有幾種不同的指令執(zhí)行級(jí)別在高執(zhí)行級(jí)別下,代碼可以執(zhí)行特權(quán)指令,訪問任意的物理地址,這種CPU執(zhí)行級(jí)別就對(duì)應(yīng)著內(nèi)核態(tài)用戶態(tài)指相應(yīng)的低級(jí)別執(zhí)行狀態(tài),代碼的掌控范圍會(huì)受到限制,只能執(zhí)行CPU指令集的一個(gè)子集舉例:intelx86CPU有四種不同的執(zhí)行級(jí)別0-3,Linux只使用了其中的0級(jí)和3級(jí)分別來表示內(nèi)核態(tài)和用戶態(tài)0xc0000000以上的內(nèi)核地址空間只能在內(nèi)核態(tài)下訪問,0x00000000-0xbfffffff的用戶地址空間在兩種狀態(tài)下都可以訪問應(yīng)用程序可以通過Linux系統(tǒng)調(diào)用由用戶態(tài)進(jìn)入內(nèi)核態(tài)第六頁,共23頁。邏輯地址與物理地址
邏輯地址:程序在運(yùn)行過程中用來訪問存儲(chǔ)器的地址。程序員在編程時(shí),只需知道邏輯地址,不需考慮該地址與實(shí)際物理硬件上的存儲(chǔ)單元如何對(duì)應(yīng)。編譯器在編譯源程序時(shí),也只需考慮邏輯地址。物理地址:表示物理存儲(chǔ)器中一個(gè)存儲(chǔ)單元的實(shí)際位置,地址總線上產(chǎn)生的就是物理地址。(總線地址)在實(shí)地址模式下,邏輯地址等于物理地址。在虛擬地址模式下,邏輯地址不等于物理地址,必須經(jīng)過查表才能轉(zhuǎn)換為物理地址,因此也叫虛擬地址。線性地址:2維邏輯地址變?yōu)?維地址后,叫線性地址物理地址查表轉(zhuǎn)換邏輯地址7第七頁,共23頁。虛擬頁物理頁031null213null虛擬頁物理頁021null213null虛擬頁物理頁0null1null213null物理頁taken進(jìn)程id0Nnull1Yos2Y23Y1進(jìn)程1的頁表進(jìn)程id虛擬頁硬盤文件名偏移量進(jìn)程2的頁表進(jìn)程3的頁表內(nèi)頁表外頁表CR3寄存器CPU負(fù)責(zé)查表(虛擬地址->物理地址),查表失敗時(shí)觸發(fā)缺頁異常(14號(hào));OS負(fù)責(zé)填充各個(gè)表的內(nèi)容,并提供缺頁中斷的中斷服務(wù)器程序。第八頁,共23頁。X86處理器對(duì)VM的支持MMU單元:(1)自動(dòng)查表,將當(dāng)期指令中的邏輯地址轉(zhuǎn)化為物理地址;(2)觸發(fā)缺頁異常。32bitCPU支持2級(jí)頁表:頁目錄表,頁表。10+10+1264bitCPU支持4級(jí)頁表:9+9+9+9+12專用寄存器CR3中存放了當(dāng)前有效的頁目錄表的物理地址。專用寄存器CR2用于存放觸發(fā)缺頁異常的線性地址。轉(zhuǎn)換旁視緩沖區(qū)TLB:將常用的邏輯/物理轉(zhuǎn)換關(guān)系緩存到CPU。當(dāng)頁表被修改,或有效頁表切換時(shí)需調(diào)用專用指令刷新TLB。flush_tlb_all,flush_tlb_mm,flush_tlb_range, flush_tlb_page9第九頁,共23頁。32bitIntelx86的頁表在32位CPU上,地址空間為2^32,一個(gè)內(nèi)存頁大小為2^12,則共有2^20個(gè)頁,頁編號(hào)范圍0~2^20-1,因此頁表中的一行至少要用3個(gè)字節(jié)(存儲(chǔ)頁編號(hào)是必須的),但實(shí)際上頁表中一行占4個(gè)字節(jié)。80386CPU中一個(gè)頁表項(xiàng)的定義如下:Present標(biāo)志、Accessed標(biāo)志、Dirty標(biāo)志、Read/Write標(biāo)志、User/Supervisor標(biāo)志、……如果present標(biāo)志為0,分頁單元就把這個(gè)線性地址存放在處理器的CR2寄存器中,并產(chǎn)生一個(gè)14號(hào)缺頁異常10第十頁,共23頁。頁表項(xiàng)或頁目錄項(xiàng)中的標(biāo)志Present標(biāo)志:所指內(nèi)容是否存在Accessded標(biāo)志:所指內(nèi)容被訪問之后自動(dòng)置1Dirty標(biāo)志:所指內(nèi)容被修改后自動(dòng)置1Read/Write標(biāo)志:所指內(nèi)容的讀寫權(quán)限User/Supervisor標(biāo)志:所指內(nèi)容的訪問特權(quán)要求PCD/PWT:是否運(yùn)行被緩存至CachePageSize:頁大?。?K,4M,2MGlobal標(biāo)志:防止頁從TLB中刷新出去11第十一頁,共23頁。兩級(jí)頁表為了節(jié)省內(nèi)存,32位CPU采用了兩級(jí)頁表第一級(jí)為頁目錄,每個(gè)表項(xiàng)存儲(chǔ)了第二級(jí)頁表的物理地址。第二級(jí)頁表的每個(gè)表項(xiàng)存儲(chǔ)了一個(gè)虛擬頁所對(duì)應(yīng)物理頁的物理地址。32位的虛擬地址被分成3個(gè)域目錄(directory) 最高的10位頁表(Table) 中間的10位頁內(nèi)偏移量(offset) 最低的12位程序中每產(chǎn)生一個(gè)32位的虛擬地址,CPU的MMU首先用最高的10位查頁目錄獲得第二級(jí)頁表的物理地址,再用中間10位查第二級(jí)頁表獲得物理頁的起始地址,最后用該起始地址加上偏移量offset(最低的12位)就得到了最終的物理地址。兩次查表過程有可能會(huì)觸發(fā)2次缺頁中斷。12第十二頁,共23頁。Intel80x86處理器的分頁線性地址CR3頁目錄頁表頁第十三頁,共23頁。分頁舉例假設(shè)進(jìn)程需要讀取0x20021406中的字節(jié)。分頁單元將該地址劃分為3個(gè)部分:0x20021406=00100000000000100001010000000110b頁目錄索引
(0x80=128)頁表索引(0x21)頁內(nèi)偏移(0x406)CR3+p1的頁目錄p1的頁表+Present=0缺頁異常XxxxxxXxxxxXxxxxxxx第十四頁,共23頁。關(guān)于虛擬內(nèi)存的思考一如何將同一塊物理內(nèi)存同時(shí)映射到多個(gè)進(jìn)程的地址空間中?(共享內(nèi)存是一種高效的進(jìn)程間通信機(jī)制)如何將同一塊物理內(nèi)存同時(shí)映射到同一個(gè)進(jìn)程地址空間的多個(gè)位置上?。多個(gè)進(jìn)程同時(shí)裝載同一個(gè)動(dòng)態(tài)鏈接庫時(shí),該動(dòng)態(tài)庫在每個(gè)進(jìn)程地址空間中的裝載位置相同嗎?如何做到將Linux內(nèi)核代碼和數(shù)據(jù)映射到每個(gè)進(jìn)程的地址空間,并且隨著進(jìn)程切換只是改變用戶地址空間的內(nèi)容而內(nèi)核地址空間內(nèi)容保持不變?已知工作在用戶態(tài)的應(yīng)用程序不能訪問內(nèi)核空間的內(nèi)存,那么如果一個(gè)應(yīng)用程序申請(qǐng)了一塊內(nèi)存,如果將指向該內(nèi)存的指針p傳遞給了一個(gè)內(nèi)核態(tài)程序(例如某中斷服務(wù)程序),那么內(nèi)核態(tài)程序能通過指針p訪問該內(nèi)存嗎?15第十五頁,共23頁。關(guān)于虛擬內(nèi)存的思考二如果一個(gè)物理頁中存儲(chǔ)了某個(gè)進(jìn)程的代碼段,當(dāng)該物理頁因?yàn)閮?nèi)存緊張需要被重新分配給另外的進(jìn)程時(shí),需不需要將該物理頁中的內(nèi)容回寫到磁盤交互文件中?如何將一個(gè)硬盤文件映射到一個(gè)進(jìn)程地址空間的指定位置上?(內(nèi)存映射函數(shù)mmap)對(duì)應(yīng)ARM等不區(qū)分I/O地址空間和內(nèi)存地址空間的CPU,如果已經(jīng)知道了某外設(shè)寄存器的物理地址(通過該寄存器地址譯碼電路獲得),如何在LinuxC程序中訪問該寄存器?void*ioremap(unsignedlongphys_addr,unsignedlongsize)用于在頁表中增加一個(gè)物理地址到虛擬地址映射。如何設(shè)置內(nèi)存區(qū)域?yàn)椤爸蛔x”存儲(chǔ)區(qū)?如何以當(dāng)前進(jìn)程為模板快速克隆出另外一個(gè)新的進(jìn)程?(fork函數(shù)與CopyOnWrite技術(shù))如何實(shí)現(xiàn)物理內(nèi)存的“延遲分配”?16第十六頁,共23頁。IPC機(jī)制:共享內(nèi)存intshmget(key_t
key,size_t
size,int
flag);功能:得到一個(gè)共享內(nèi)存標(biāo)識(shí)符或創(chuàng)建一個(gè)共享內(nèi)存對(duì)象并返回共享內(nèi)存標(biāo)識(shí)符key:共享內(nèi)存對(duì)象的全局標(biāo)識(shí),大于0的32位整數(shù)。通常要求此值來源于ftok返回的IPC鍵值。如果該內(nèi)存被映射到同一進(jìn)程地址空間,則令key取值為IPC_PRIVATE。size:共享內(nèi)存區(qū)的字節(jié)數(shù)flag:讀寫的權(quán)限返回值:成功返回共享存儲(chǔ)的id,失敗返回-117第十七頁,共23頁。IPC機(jī)制:共享內(nèi)存void*shmat(int
shmid,constvoid*addr,int
flag);功能:連接共享內(nèi)存標(biāo)識(shí)符為shmid的共享內(nèi)存,連接成功后把共享內(nèi)存區(qū)對(duì)象映射到調(diào)用進(jìn)程的地址空間,隨后可像本地空間一樣訪問shmid:共享存儲(chǔ)的idaddr:一般為0,表示連接到由內(nèi)核選擇的第一個(gè)可用地址上,否則,如果flag沒有指定SHM_RND,則連接到addr所指定的地址上,如果flag為SHM_RND,則地址取整flag:SHM_RDONLY:為只讀模式,其他為讀寫模式返回值:如果成功,返回共享存儲(chǔ)段地址,出錯(cuò)返回-1intshmdt(void*addr);addr:共享存儲(chǔ)段的地址,以前調(diào)用shmat時(shí)的返回值返回值18第十八頁,共23頁。IPC機(jī)制:共享內(nèi)存intshmdt(void*addr);功能:與shmat函數(shù)相反,是用來斷開與共享內(nèi)存附加點(diǎn)的地址,禁止本進(jìn)程訪問此片共享內(nèi)存addr:共享存儲(chǔ)段的地址,以前調(diào)用shmat時(shí)的返回值返回值:成功:0;出錯(cuò):-119第十九頁,共23頁。mmap內(nèi)存映射利用mmap函數(shù)可以將一個(gè)磁盤文件或者其它設(shè)備對(duì)象映射到虛擬內(nèi)存空間。文件被映射到多個(gè)頁上,所有頁的大小之和大于等于文件大小。20第二十頁,共23頁。mmap內(nèi)存映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset)start:要映射到的虛擬內(nèi)存區(qū)域的起始地址,通常都是用NULL,NULL表示由內(nèi)核來指定該內(nèi)存地址length:要映射的內(nèi)存區(qū)域的大小prot:期望的內(nèi)存保護(hù)標(biāo)志,是以下的某個(gè)值,可以通過or運(yùn)算符組合到一起1.PROT_EXEC可執(zhí)行;2.PROT_READ可讀;3.PROT_WRITE可執(zhí)flags:指定映射對(duì)象的類型,映射選項(xiàng)和映射頁是否可以共享。MAP_SHARED
/MAP_PRIVATE/MAP_LOCKED/MAP_ANONYMOUSfd:文件描述符(由open函數(shù)返回)offset:表示被映射對(duì)象(即文件)從那里開始對(duì)映,通常都是用0。該值應(yīng)該為大小應(yīng)為PAGE_SIZE的整數(shù)倍返回值:成功則返
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 叉車臺(tái)班合同范本
- 音樂課程合同范本
- 清運(yùn)泥土合同范本
- 口腔護(hù)士合同范本簡易
- 醫(yī)院工傷協(xié)作合同范本
- 臺(tái)球俱樂部合同范本
- 兄弟合作合同范本
- 合同9人合作合同范本
- 買本田新車合同范本
- 產(chǎn)地供應(yīng)合同范本
- 裝修隱蔽工程驗(yàn)收記錄表范例
- 道路施工導(dǎo)改及施工方案
- 《實(shí)數(shù)》單元作業(yè)設(shè)計(jì)
- 攝影基礎(chǔ)知識(shí)教學(xué)課件-攝影師入門基礎(chǔ)知識(shí)
- 煙花爆竹基礎(chǔ)知識(shí)
- 路橋過渡段主要技術(shù)標(biāo)準(zhǔn)與結(jié)構(gòu)
- 互聯(lián)網(wǎng)公司勞動(dòng)合同
- 吉美版四年級(jí)綜合實(shí)踐活動(dòng)下冊全冊表格簡約式教案教學(xué)設(shè)計(jì)
- 通信工程監(jiān)理實(shí)施細(xì)則
- 電力變壓器監(jiān)造規(guī)范(完整版)資料
- 精品課程:運(yùn)動(dòng)訓(xùn)練學(xué)(北京體育大學(xué))
評(píng)論
0/150
提交評(píng)論