版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Mlock 分析報(bào)告第一部分 Linux 存儲管理機(jī)制一 80386 體系結(jié)構(gòu)的內(nèi)存管理功能80386 有兩種工作模式:實(shí)地址模式和虛擬地址模式(又稱保護(hù)模式) 。實(shí)地址模式是 為了與 8086 兼容而設(shè)置的。這時(shí),只能尋址 1MB 的地址空間,不能啟用分頁機(jī)制,不區(qū) 分特權(quán),分段功能也受到了極大的限制。 而在保護(hù)模式下,分段機(jī)制得到加強(qiáng)。虛地址空間 可為 16K 個(gè)段,每個(gè)段的大小可變,最大達(dá)到4GB 。段具有獨(dú)立的屬性,包括段長、起始地址、段類型和保護(hù)位等。 而且 80386 提供片內(nèi)頁管理機(jī)制, 通過兩級頁表來實(shí)現(xiàn)線性地址 和物理地址之間的映射,為 LINUX 的虛擬內(nèi)存管理提供了直接的
2、支持。80386 的虛擬地址模式同時(shí)使用了分段機(jī)制和分頁機(jī)制兩級地址轉(zhuǎn)換機(jī)制來進(jìn)行地址 轉(zhuǎn)換。第一級使用分段機(jī)制, 把包含段地址和段內(nèi)偏移量的虛擬地址, 轉(zhuǎn)換為一個(gè)線性地址。 第二級使用分頁機(jī)制,把線性地址轉(zhuǎn)換為物理地址。如圖所示。存儲管理子系統(tǒng)實(shí)現(xiàn)以下這些功能:更大的地址空間: 操作系統(tǒng)似的系看起來擁有一個(gè)比它實(shí)際擁有的地址大的多的地址空間,虛存能夠?qū)?現(xiàn)比物理存儲空間許多倍的地址空間保護(hù) 每一個(gè)進(jìn)程在系統(tǒng)中都有它自己的地址空間,虛地址空間使得各個(gè)進(jìn)程完全分離開來, 因此一個(gè)進(jìn)程運(yùn)行一個(gè)應(yīng)用程序完全不會影響到另一個(gè)進(jìn)程 另外,硬件級的虛存機(jī)制為內(nèi) 存提供了寫保護(hù),這就保證數(shù)據(jù)不會被非法的應(yīng)用
3、程序重寫存儲映像存儲映像用來把圖象或數(shù)據(jù)文件映像到一個(gè)進(jìn)程的地址空間 在存儲映像中, 文件的內(nèi) 容直接和進(jìn)程的虛擬地址空間相連 平衡物理存儲空間的分配存儲管理子系統(tǒng)允許每一個(gè)運(yùn)行的進(jìn)程公平地競爭系統(tǒng)的物理存儲空間共享虛存空間二 LINUX 的分頁管理機(jī)制在 LINUX 中,每一個(gè)用戶進(jìn)程都可以訪問 4GB 的線性虛擬內(nèi)存空間。 其中從 0 到 3GB 的虛擬內(nèi)存地址是用戶空間,用戶進(jìn)程可以直接對其進(jìn)行訪問。從 3GB 到 4GB 的虛擬內(nèi)存 地址為系統(tǒng)空間, 存放僅供核心態(tài)訪問的代碼和數(shù)據(jù)。 當(dāng)用戶進(jìn)程試圖對其訪問時(shí), 就會觸 發(fā)處理器的特權(quán)級轉(zhuǎn)換(從處理器的特權(quán)級 3 切換到特權(quán)級 0),即
4、從操作系統(tǒng)的用戶態(tài)切 換到核心態(tài)。所有進(jìn)程從 3GB 到 4GB 的虛擬空間映像都是一樣的, LINUX 以此方式讓核心態(tài)進(jìn)程 共享代碼段和數(shù)據(jù)段。核心態(tài)虛擬空間從 3GB 到 3GB+4M 的一段(也就是進(jìn)程頁目錄第 768 項(xiàng)所管轄的范 圍),被影射到物理空間 0 到 4M 段。因此, 進(jìn)程處于核心態(tài)時(shí), 只要通過訪問虛擬空間 3GB 到 3GB+4M 段,即訪問了物理空間 0 到 4M 段。上述兩種空間對用戶進(jìn)程來說都是透明的, 用戶進(jìn)程所訪問的內(nèi)存地址都是連續(xù)的 4GB 線性虛擬地址。因此,我們首先關(guān)心的是 LINUX 是如何劃分虛擬空間的。LINUX 采用“按需調(diào)頁” ( Deman
5、d Paging)技術(shù)管理虛擬內(nèi)存。標(biāo)準(zhǔn) LINUX 的虛存頁表應(yīng) 為三級頁表, 依次為頁目錄 (PGD ,Page Directory) 、中間頁目錄 (PMD ,Page Middle Directory) 和頁表( PTE,Page Table)。每一個(gè) page 都有一個(gè)標(biāo)識符 PFN (Page Frame Number), 因此 ,虛地址也就由兩部分 組成 : 一個(gè)頁內(nèi)偏移地址和一個(gè) PFN ,每當(dāng)處理器遇到一個(gè)虛地址 , 它就將虛地址的 PFN 轉(zhuǎn)化成一個(gè)物理頁面的起始地址 , 然后 , 在根據(jù) page_offset 的值 , 找到實(shí)際的物理地址 , 這個(gè)過程中間要通過一個(gè)頁表
6、來實(shí)現(xiàn) , 其轉(zhuǎn)換過程如下 :圖 3. 虛地址經(jīng)過頁表轉(zhuǎn)換成實(shí)地址的過程在一個(gè)頁表中 , 每一行包含了下列數(shù)據(jù) :有效位 : 用來描述頁表的這個(gè)入口是否可用這個(gè)入口所對應(yīng)的物理頁表數(shù)存儲控制信息 :其中包括是否可寫 ,是否可執(zhí)行頁表的訪問是通過把虛地址的 PFN 作為頁表的偏移量來訪問的 . 例如 PFN=5 , 則訪問 的頁表的入口為第六個(gè)表項(xiàng) ( 0 為第一個(gè)表項(xiàng) ).處理器處理一個(gè)頁表的地址時(shí) , 首先必須算出頁表的 PFN 和 頁內(nèi)偏移量 . 要實(shí)現(xiàn)表 的大小為 2 的冪級大小,這個(gè)可以通過掩碼 (masking) 和移位( shifting )來實(shí)現(xiàn)處理器 利用虛地址的 PFN 作為
7、目錄來檢索要處理處的頁表的入口如果這個(gè)入口是可用的,處 理器從頁表中取出這個(gè)頁表項(xiàng)所對應(yīng)的物理地址的 PFN 如果這個(gè)入口不可用,則說明進(jìn) 程試圖存取一個(gè)不在內(nèi)存中的頁面 在這種情況下, 處理器不能處理, 應(yīng)該叫給操作系統(tǒng)來 實(shí)現(xiàn),以便操作系統(tǒng)能夠處理它進(jìn)程通過發(fā)出一個(gè) page fault 來通知操作系統(tǒng),然后 操作系統(tǒng)就能夠解釋發(fā)出頁面失配及其原因,如果進(jìn)程從頁表中訪問一個(gè)可用的入口,則進(jìn)程從頁表中取得物理地址的 PFN ,然后 把這個(gè)數(shù)乘上頁表的大小, 以便的到頁表在物理內(nèi)存中的起始地址, 最后在加上偏移量就得 到了要取數(shù)據(jù)或指令的正確內(nèi)存地址Linux 的虛存管理 共享虛存虛存使得幾個(gè)
8、進(jìn)程更容易共享存儲區(qū)所有存儲操作都是通過頁表來實(shí)現(xiàn)的,每一個(gè) 進(jìn)程都有它私人的頁表 如果兩個(gè)進(jìn)程想要共享一頁物理內(nèi)存,它的頁幀號 () 必須 在兩個(gè)進(jìn)程的一個(gè)頁表入口中能夠找得到每一個(gè)進(jìn)程的虛存都是有一個(gè) mm_struct 結(jié)構(gòu)來描述的,其中包括正在執(zhí)行的映像 的信息和一個(gè)指向許多 vm_area_struct 結(jié)構(gòu)的指針, 每一個(gè) vm_area_struct 描述一段虛存 的起始地址和結(jié)束地址, 進(jìn)程對那一段的存取權(quán)限和對這段存儲區(qū)的一組操作。 當(dāng)一個(gè)映像 被映射到一個(gè)進(jìn)程的虛地址中, 一組 vm_area_struct 結(jié)構(gòu)就產(chǎn)生了, 每一個(gè) vm_area_struct 結(jié)構(gòu)都代表一
9、段可執(zhí)行的映像, 可執(zhí)行代碼、 初始化數(shù)據(jù)(變量)、未初始化數(shù)據(jù)等等。 Linux 支持許多標(biāo)準(zhǔn)的虛存操作,當(dāng) vm_area_struct 被產(chǎn)生后,一組對于虛存的正確的操作也就 跟他聯(lián)系起來。按需調(diào)頁中用到的虛存段的操作 當(dāng)一個(gè)影響被影射進(jìn)進(jìn)程的虛地址后,它就可以執(zhí)行了。只要影象的起始地址被印象 進(jìn)物理內(nèi)存, 它就要存取一個(gè)尚不在內(nèi)存中的虛存段。 當(dāng)一個(gè)進(jìn)程訪問一個(gè)尚沒有合法的頁 表入口的虛地址,它就回向操作系統(tǒng)報(bào)告一個(gè)頁面失配的錯(cuò)誤。頁面失配錯(cuò)誤描述發(fā)生頁面失配的虛地址和引起頁面失配的存儲類型。Linux 必許找到表示發(fā)生頁面失配的存儲區(qū)的虛存段,由于沿著 vm_area_struct
10、結(jié)構(gòu) 搜索對于處理頁面失配的效率有非常重要的關(guān)系,這些虛存段被連接成 AVL 樹結(jié)構(gòu),如果 表示頁面失配的虛存段,則這個(gè)進(jìn)程訪問了一個(gè)非法的虛地址。 Linux 將用信號通知進(jìn)程, 讓進(jìn)程發(fā)出一個(gè) SIGSEGV 信號,如果進(jìn)程不能處理這樣的信息,則進(jìn)程將要終止。 System 共享內(nèi)存頁面System 共享內(nèi)存是一種內(nèi)處理通訊機(jī)制( inter-process communication mechanism ), 允許兩個(gè)或多個(gè)共享同一段虛存的進(jìn)程互相通訊。進(jìn)程如何用這種方式共享內(nèi)存在 IPC-chapter 一章中有詳細(xì)的說明, 現(xiàn)在可以很清楚地說 System 的每一塊被共享的內(nèi)存都 是
11、由一個(gè) shmid_ds 的數(shù)據(jù)結(jié)構(gòu)描述, 這個(gè)數(shù)據(jù)結(jié)構(gòu)中包含一個(gè)指針指向一個(gè) vm_area_struct 數(shù)據(jù)結(jié)構(gòu)形成的隊(duì)列,每一個(gè)共享這一段虛存的進(jìn)程在這一個(gè)鏈表中都有一個(gè)節(jié)點(diǎn), vm_area_struct 數(shù)據(jù)結(jié)構(gòu)描述了在進(jìn)程的什么地方開始使用共享的虛存。對于 System V 中的共享虛存, 指向它的所有 vm_area_struct 結(jié)構(gòu)都是通過 vm_next_shared 和 vm_prev_shared 連接起來的。每一個(gè) shmid_ds 數(shù)據(jù)結(jié)構(gòu)也包含一個(gè)頁表入口的鏈表,其中每一個(gè) shmid_ds 數(shù)據(jù)結(jié)構(gòu)包含了一個(gè)共享的虛頁所映像到的物理頁面入口。盡管虛存管理允許進(jìn)
12、程有不同的地址空間(虛) ,但有時(shí)也需要進(jìn)程共享同一段存儲空 間例如有可能有幾個(gè)進(jìn)程運(yùn)行于系統(tǒng)中且同時(shí)使用 bash 命令的 shell .此時(shí)并不是各進(jìn) 程在自己的地址空間中分別擁有一個(gè) bash 的拷貝,更好的方法是在物理空間上有一個(gè) bash 的拷貝,所有運(yùn)行 bash 的進(jìn)程讀共享它,動態(tài)鏈接庫是另一個(gè)多進(jìn)程共享執(zhí)行代碼的 例子存儲共享機(jī)制也可以用來實(shí)現(xiàn)進(jìn)程內(nèi)部通訊, 兩個(gè)或多個(gè)進(jìn)程通過共享的存儲空間來 交換信息,在 INTEL 微機(jī)上, LINUX 的頁表結(jié)構(gòu)實(shí)際為兩級。 80386 體系結(jié)構(gòu)之頁管理機(jī)制中的 頁目錄就是 PGD ,頁表就是 PTE。而 PMD 和 PGD 實(shí)際上是合
13、二為一的。在虛存段的加鎖 操作中 , 主要涉及到的是對于頁表的操作 :在 /include/linux/page.h 中通過一些宏定義來實(shí)現(xiàn) ,#define PAGE_SHIFT12#define PAGE_SIZE (1UL i_mmap, for shm areas,* the list of attaches, otherwise unused.*/struct vm_area_struct *vm_next_share;struct vm_area_struct *vm_pprev_share;struct vm_operations_struct * vm_ops;unsigned
14、 long vm_offset;struct file * vm_file;unsigned long vm_pte;/* shared mem */;vm_mm 指向這個(gè)虛存段所屬的 mm_struct 結(jié)構(gòu)的指針 vm_start,vm_end :虛存段的起始、結(jié)束地址vm_next :同屬于一個(gè) mm_struct 的 vm_area_struct 形成一個(gè)鏈表, vm_next 指向下一 個(gè)此鏈表中的 vm_area_struct 節(jié)點(diǎn)vm_page_prot:vm_flags :虛存段的標(biāo)志位,表示虛存段是否加鎖vm_avl_height 、 vm_area_left 、 vm_ar
15、ea_right :為了便于查找,同一個(gè) mm_struct 中的 vm_area_struct 組織成一個(gè) avl 樹,三個(gè)參數(shù)分別表示 avl 樹的高度、當(dāng)前節(jié)點(diǎn)在 avl 樹 中的左兒子節(jié)點(diǎn)和右兒子節(jié)點(diǎn)vm_next_share 、 vm_pprev_share: vm_ops:指向一個(gè) vm_area_struct 操作集的指針, 在此操作中, 包含了對 vm_area_atruct 的操作vm_offset :由于虛存段的組織需要映射到頁的存儲機(jī)構(gòu)中,其中的vm_offset 表示虛存段的起始地址對于此虛存段起始地址所在也的偏移量vm_file :指向虛存段所在文件的指針, 同時(shí)對應(yīng)
16、的 file 中也有一個(gè)計(jì)數(shù)器 f_count 用來 表示屬于這個(gè)文件的虛存段的數(shù)目vm_pte:所在頁表的入口在 Linux 中采用段頁式來進(jìn)行存儲區(qū)的管理 其中進(jìn)程的虛存管理的數(shù)據(jù)結(jié)構(gòu)圖示如下:圖 2. 進(jìn)程的虛存管理數(shù)據(jù)結(jié)構(gòu)第二部分 虛存加鎖虛存加鎖的作用 虛存加鎖在進(jìn)程的頁面換入和換出的工作中發(fā)揮了重要作用, 在頁面的換出時(shí), 如果表 示頁面的虛存段被加鎖, 則虛存段所表示的頁面不能被換出, 這種機(jī)制在使一些較常用的進(jìn) 程固定于內(nèi)存, 似的調(diào)用這些進(jìn)程的書牘大大加快, 同時(shí)也減少了許多頁面調(diào)入和換出的工 作,從而似的的利用率更高。進(jìn)程進(jìn)行頁 面的換出時(shí),首先要找 到表示該頁面的 vm_
17、area_struct 結(jié) 構(gòu),如 果 vm_area_struct 結(jié)構(gòu)中有加鎖的標(biāo)志,則該頁面不能被換出。操作系統(tǒng)在檢查其他的頁面, 其采用的算法是 (Least Recently Used) 算法。器具體的實(shí)現(xiàn)在頁面的管理機(jī)制一章中有 詳細(xì)的說明。原代碼分析( mlock.c 中的函數(shù)分析)1) static inline int mlock_fixup_all(struct vm_area_struct *vma,int newsflags) 該函數(shù)用于對整個(gè)虛存段進(jìn)行加鎖,其中 vma 指向所要加鎖的虛存段, newsflags 表示對虛存段進(jìn)行操作后所加的標(biāo)志。其中當(dāng) newsfl
18、ags=VM_LOCKED 時(shí),表示對虛 存段加鎖;當(dāng) newsflags 中的第十二位數(shù)位時(shí),則表示對內(nèi)存解鎖。VM_LOCKED 的定義見 /linux/include/linux/mm.h其定義為: #define VM_LOCKED0x2000即將標(biāo)志為的第十二位賦值為(從左到右)則表示虛存段為加鎖狀態(tài),如此位 為,則表示虛存段為解鎖狀態(tài)。函數(shù)圖示如下:) static inline int mlock_fixup_start(struct vm_area_struct * vma,unsigned long end, int newflags)該函數(shù)用于對虛存段的一部分加鎖,加鎖的部
19、分為從虛存段的起始地址開始,到end 地址結(jié)束,參數(shù)的含義跟上一函數(shù)的相同,其中 end 表示要加鎖的虛存段的結(jié)束地址。 圖示如下:) mlock_fixup_end(struct vm_area_struct * vma,startunsigned long start, int newflags) 該函數(shù)用于對虛存段的一部分加鎖,其加鎖的部分為從虛存段中的一個(gè)地址 開始,到虛存段的結(jié)束地址這一段進(jìn)行加鎖。其中 start 表示要加鎖的起始地址 圖示如下:) mlock_fixup_middle(struct vm_area_struct * vma,unsigned long start,unsigned long end, int newflags)該函數(shù)用于對虛存段中從 start 開始到 end 結(jié)束的一段進(jìn)行加鎖,其中 start 表示加鎖 的開始地址, end 表示加鎖的結(jié)束地址。圖示如下:) mlock_fixup(struct vm_area_struct * vma, unsigned long start,unsigned long end, unsigned
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國七合一騎馬機(jī)市場調(diào)查研究報(bào)告
- 2025至2030年中國燃煤臺車加熱爐數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國有機(jī)罩標(biāo)志燈數(shù)據(jù)監(jiān)測研究報(bào)告
- 二零二五個(gè)人住房公積金貸款合同范本4篇
- 二零二五版物流倉儲投資合同協(xié)議書范本3篇
- 二零二五年度住宅建筑工程質(zhì)量保修合同3篇
- 二零二五版攝影棚租賃居間業(yè)務(wù)合同書3篇
- 委托廣告合同書模板
- 2025-2030全球立柱鉆孔機(jī)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球裝飾金屬板激光切割機(jī)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025水利云播五大員考試題庫(含答案)
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(2024版)解讀
- 藥企質(zhì)量主管競聘
- 信息對抗與認(rèn)知戰(zhàn)研究-洞察分析
- 中藥飲片驗(yàn)收培訓(xùn)
- 手術(shù)室專科護(hù)士工作總結(jié)匯報(bào)
- 2025屆高三聽力技巧指導(dǎo)-預(yù)讀、預(yù)測
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 蘇州市2025屆高三期初陽光調(diào)研(零模)政治試卷(含答案)
- 創(chuàng)傷處理理論知識考核試題及答案
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
評論
0/150
提交評論