版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Mlock 分析報(bào)告第一部分 Linux 存儲(chǔ)管理機(jī)制一 80386 體系結(jié)構(gòu)的內(nèi)存管理功能80386 有兩種工作模式:實(shí)地址模式和虛擬地址模式(又稱保護(hù)模式) 。實(shí)地址模式是 為了與 8086 兼容而設(shè)置的。這時(shí),只能尋址 1MB 的地址空間,不能啟用分頁(yè)機(jī)制,不區(qū) 分特權(quán),分段功能也受到了極大的限制。 而在保護(hù)模式下,分段機(jī)制得到加強(qiáng)。虛地址空間 可為 16K 個(gè)段,每個(gè)段的大小可變,最大達(dá)到4GB 。段具有獨(dú)立的屬性,包括段長(zhǎng)、起始地址、段類型和保護(hù)位等。 而且 80386 提供片內(nèi)頁(yè)管理機(jī)制, 通過(guò)兩級(jí)頁(yè)表來(lái)實(shí)現(xiàn)線性地址 和物理地址之間的映射,為 LINUX 的虛擬內(nèi)存管理提供了直接的
2、支持。80386 的虛擬地址模式同時(shí)使用了分段機(jī)制和分頁(yè)機(jī)制兩級(jí)地址轉(zhuǎn)換機(jī)制來(lái)進(jìn)行地址 轉(zhuǎn)換。第一級(jí)使用分段機(jī)制, 把包含段地址和段內(nèi)偏移量的虛擬地址, 轉(zhuǎn)換為一個(gè)線性地址。 第二級(jí)使用分頁(yè)機(jī)制,把線性地址轉(zhuǎn)換為物理地址。如圖所示。存儲(chǔ)管理子系統(tǒng)實(shí)現(xiàn)以下這些功能:更大的地址空間: 操作系統(tǒng)似的系看起來(lái)?yè)碛幸粋€(gè)比它實(shí)際擁有的地址大的多的地址空間,虛存能夠?qū)?現(xiàn)比物理存儲(chǔ)空間許多倍的地址空間保護(hù) 每一個(gè)進(jìn)程在系統(tǒng)中都有它自己的地址空間,虛地址空間使得各個(gè)進(jìn)程完全分離開(kāi)來(lái), 因此一個(gè)進(jìn)程運(yùn)行一個(gè)應(yīng)用程序完全不會(huì)影響到另一個(gè)進(jìn)程 另外,硬件級(jí)的虛存機(jī)制為內(nèi) 存提供了寫(xiě)保護(hù),這就保證數(shù)據(jù)不會(huì)被非法的應(yīng)用
3、程序重寫(xiě)存儲(chǔ)映像存儲(chǔ)映像用來(lái)把圖象或數(shù)據(jù)文件映像到一個(gè)進(jìn)程的地址空間 在存儲(chǔ)映像中, 文件的內(nèi) 容直接和進(jìn)程的虛擬地址空間相連 平衡物理存儲(chǔ)空間的分配存儲(chǔ)管理子系統(tǒng)允許每一個(gè)運(yùn)行的進(jìn)程公平地競(jìng)爭(zhēng)系統(tǒng)的物理存儲(chǔ)空間共享虛存空間二 LINUX 的分頁(yè)管理機(jī)制在 LINUX 中,每一個(gè)用戶進(jìn)程都可以訪問(wèn) 4GB 的線性虛擬內(nèi)存空間。 其中從 0 到 3GB 的虛擬內(nèi)存地址是用戶空間,用戶進(jìn)程可以直接對(duì)其進(jìn)行訪問(wèn)。從 3GB 到 4GB 的虛擬內(nèi)存 地址為系統(tǒng)空間, 存放僅供核心態(tài)訪問(wèn)的代碼和數(shù)據(jù)。 當(dāng)用戶進(jìn)程試圖對(duì)其訪問(wèn)時(shí), 就會(huì)觸 發(fā)處理器的特權(quán)級(jí)轉(zhuǎn)換(從處理器的特權(quán)級(jí) 3 切換到特權(quán)級(jí) 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)程頁(yè)目錄第 768 項(xiàng)所管轄的范 圍),被影射到物理空間 0 到 4M 段。因此, 進(jìn)程處于核心態(tài)時(shí), 只要通過(guò)訪問(wèn)虛擬空間 3GB 到 3GB+4M 段,即訪問(wèn)了物理空間 0 到 4M 段。上述兩種空間對(duì)用戶進(jìn)程來(lái)說(shuō)都是透明的, 用戶進(jìn)程所訪問(wèn)的內(nèi)存地址都是連續(xù)的 4GB 線性虛擬地址。因此,我們首先關(guān)心的是 LINUX 是如何劃分虛擬空間的。LINUX 采用“按需調(diào)頁(yè)” ( Deman
5、d Paging)技術(shù)管理虛擬內(nèi)存。標(biāo)準(zhǔn) LINUX 的虛存頁(yè)表應(yīng) 為三級(jí)頁(yè)表, 依次為頁(yè)目錄 (PGD ,Page Directory) 、中間頁(yè)目錄 (PMD ,Page Middle Directory) 和頁(yè)表( PTE,Page Table)。每一個(gè) page 都有一個(gè)標(biāo)識(shí)符 PFN (Page Frame Number), 因此 ,虛地址也就由兩部分 組成 : 一個(gè)頁(yè)內(nèi)偏移地址和一個(gè) PFN ,每當(dāng)處理器遇到一個(gè)虛地址 , 它就將虛地址的 PFN 轉(zhuǎn)化成一個(gè)物理頁(yè)面的起始地址 , 然后 , 在根據(jù) page_offset 的值 , 找到實(shí)際的物理地址 , 這個(gè)過(guò)程中間要通過(guò)一個(gè)頁(yè)表
6、來(lái)實(shí)現(xiàn) , 其轉(zhuǎn)換過(guò)程如下 :圖 3. 虛地址經(jīng)過(guò)頁(yè)表轉(zhuǎn)換成實(shí)地址的過(guò)程在一個(gè)頁(yè)表中 , 每一行包含了下列數(shù)據(jù) :有效位 : 用來(lái)描述頁(yè)表的這個(gè)入口是否可用這個(gè)入口所對(duì)應(yīng)的物理頁(yè)表數(shù)存儲(chǔ)控制信息 :其中包括是否可寫(xiě) ,是否可執(zhí)行頁(yè)表的訪問(wèn)是通過(guò)把虛地址的 PFN 作為頁(yè)表的偏移量來(lái)訪問(wèn)的 . 例如 PFN=5 , 則訪問(wèn) 的頁(yè)表的入口為第六個(gè)表項(xiàng) ( 0 為第一個(gè)表項(xiàng) ).處理器處理一個(gè)頁(yè)表的地址時(shí) , 首先必須算出頁(yè)表的 PFN 和 頁(yè)內(nèi)偏移量 . 要實(shí)現(xiàn)表 的大小為 2 的冪級(jí)大小,這個(gè)可以通過(guò)掩碼 (masking) 和移位( shifting )來(lái)實(shí)現(xiàn)處理器 利用虛地址的 PFN 作為
7、目錄來(lái)檢索要處理處的頁(yè)表的入口如果這個(gè)入口是可用的,處 理器從頁(yè)表中取出這個(gè)頁(yè)表項(xiàng)所對(duì)應(yīng)的物理地址的 PFN 如果這個(gè)入口不可用,則說(shuō)明進(jìn) 程試圖存取一個(gè)不在內(nèi)存中的頁(yè)面 在這種情況下, 處理器不能處理, 應(yīng)該叫給操作系統(tǒng)來(lái) 實(shí)現(xiàn),以便操作系統(tǒng)能夠處理它進(jìn)程通過(guò)發(fā)出一個(gè) page fault 來(lái)通知操作系統(tǒng),然后 操作系統(tǒng)就能夠解釋發(fā)出頁(yè)面失配及其原因,如果進(jìn)程從頁(yè)表中訪問(wèn)一個(gè)可用的入口,則進(jìn)程從頁(yè)表中取得物理地址的 PFN ,然后 把這個(gè)數(shù)乘上頁(yè)表的大小, 以便的到頁(yè)表在物理內(nèi)存中的起始地址, 最后在加上偏移量就得 到了要取數(shù)據(jù)或指令的正確內(nèi)存地址Linux 的虛存管理 共享虛存虛存使得幾個(gè)
8、進(jìn)程更容易共享存儲(chǔ)區(qū)所有存儲(chǔ)操作都是通過(guò)頁(yè)表來(lái)實(shí)現(xiàn)的,每一個(gè) 進(jìn)程都有它私人的頁(yè)表 如果兩個(gè)進(jìn)程想要共享一頁(yè)物理內(nèi)存,它的頁(yè)幀號(hào) () 必須 在兩個(gè)進(jìn)程的一個(gè)頁(yè)表入口中能夠找得到每一個(gè)進(jìn)程的虛存都是有一個(gè) mm_struct 結(jié)構(gòu)來(lái)描述的,其中包括正在執(zhí)行的映像 的信息和一個(gè)指向許多 vm_area_struct 結(jié)構(gòu)的指針, 每一個(gè) vm_area_struct 描述一段虛存 的起始地址和結(jié)束地址, 進(jìn)程對(duì)那一段的存取權(quán)限和對(duì)這段存儲(chǔ)區(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)生后,一組對(duì)于虛存的正確的操作也就 跟他聯(lián)系起來(lái)。按需調(diào)頁(yè)中用到的虛存段的操作 當(dāng)一個(gè)影響被影射進(jìn)進(jìn)程的虛地址后,它就可以執(zhí)行了。只要影象的起始地址被印象 進(jìn)物理內(nèi)存, 它就要存取一個(gè)尚不在內(nèi)存中的虛存段。 當(dāng)一個(gè)進(jìn)程訪問(wèn)一個(gè)尚沒(méi)有合法的頁(yè) 表入口的虛地址,它就回向操作系統(tǒng)報(bào)告一個(gè)頁(yè)面失配的錯(cuò)誤。頁(yè)面失配錯(cuò)誤描述發(fā)生頁(yè)面失配的虛地址和引起頁(yè)面失配的存儲(chǔ)類型。Linux 必許找到表示發(fā)生頁(yè)面失配的存儲(chǔ)區(qū)的虛存段,由于沿著 vm_area_struct
10、結(jié)構(gòu) 搜索對(duì)于處理頁(yè)面失配的效率有非常重要的關(guān)系,這些虛存段被連接成 AVL 樹(shù)結(jié)構(gòu),如果 表示頁(yè)面失配的虛存段,則這個(gè)進(jìn)程訪問(wèn)了一個(gè)非法的虛地址。 Linux 將用信號(hào)通知進(jìn)程, 讓進(jìn)程發(fā)出一個(gè) SIGSEGV 信號(hào),如果進(jìn)程不能處理這樣的信息,則進(jìn)程將要終止。 System 共享內(nèi)存頁(yè)面System 共享內(nèi)存是一種內(nèi)處理通訊機(jī)制( inter-process communication mechanism ), 允許兩個(gè)或多個(gè)共享同一段虛存的進(jìn)程互相通訊。進(jìn)程如何用這種方式共享內(nèi)存在 IPC-chapter 一章中有詳細(xì)的說(shuō)明, 現(xiàn)在可以很清楚地說(shuō) 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)程的什么地方開(kāi)始使用共享的虛存。對(duì)于 System V 中的共享虛存, 指向它的所有 vm_area_struct 結(jié)構(gòu)都是通過(guò) vm_next_shared 和 vm_prev_shared 連接起來(lái)的。每一個(gè) shmid_ds 數(shù)據(jù)結(jié)構(gòu)也包含一個(gè)頁(yè)表入口的鏈表,其中每一個(gè) shmid_ds 數(shù)據(jù)結(jié)構(gòu)包含了一個(gè)共享的虛頁(yè)所映像到的物理頁(yè)面入口。盡管虛存管理允許進(jìn)
12、程有不同的地址空間(虛) ,但有時(shí)也需要進(jìn)程共享同一段存儲(chǔ)空 間例如有可能有幾個(gè)進(jìn)程運(yùn)行于系統(tǒng)中且同時(shí)使用 bash 命令的 shell .此時(shí)并不是各進(jìn) 程在自己的地址空間中分別擁有一個(gè) bash 的拷貝,更好的方法是在物理空間上有一個(gè) bash 的拷貝,所有運(yùn)行 bash 的進(jìn)程讀共享它,動(dòng)態(tài)鏈接庫(kù)是另一個(gè)多進(jìn)程共享執(zhí)行代碼的 例子存儲(chǔ)共享機(jī)制也可以用來(lái)實(shí)現(xiàn)進(jìn)程內(nèi)部通訊, 兩個(gè)或多個(gè)進(jìn)程通過(guò)共享的存儲(chǔ)空間來(lái) 交換信息,在 INTEL 微機(jī)上, LINUX 的頁(yè)表結(jié)構(gòu)實(shí)際為兩級(jí)。 80386 體系結(jié)構(gòu)之頁(yè)管理機(jī)制中的 頁(yè)目錄就是 PGD ,頁(yè)表就是 PTE。而 PMD 和 PGD 實(shí)際上是合
13、二為一的。在虛存段的加鎖 操作中 , 主要涉及到的是對(duì)于頁(yè)表的操作 :在 /include/linux/page.h 中通過(guò)一些宏定義來(lái)實(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 樹(shù),三個(gè)參數(shù)分別表示 avl 樹(shù)的高度、當(dāng)前節(jié)點(diǎn)在 avl 樹(shù) 中的左兒子節(jié)點(diǎn)和右兒子節(jié)點(diǎn)vm_next_share 、 vm_pprev_share: vm_ops:指向一個(gè) vm_area_struct 操作集的指針, 在此操作中, 包含了對(duì) vm_area_atruct 的操作vm_offset :由于虛存段的組織需要映射到頁(yè)的存儲(chǔ)機(jī)構(gòu)中,其中的vm_offset 表示虛存段的起始地址對(duì)于此虛存段起始地址所在也的偏移量vm_file :指向虛存段所在文件的指針, 同時(shí)對(duì)應(yīng)
16、的 file 中也有一個(gè)計(jì)數(shù)器 f_count 用來(lái) 表示屬于這個(gè)文件的虛存段的數(shù)目vm_pte:所在頁(yè)表的入口在 Linux 中采用段頁(yè)式來(lái)進(jìn)行存儲(chǔ)區(qū)的管理 其中進(jìn)程的虛存管理的數(shù)據(jù)結(jié)構(gòu)圖示如下:圖 2. 進(jìn)程的虛存管理數(shù)據(jù)結(jié)構(gòu)第二部分 虛存加鎖虛存加鎖的作用 虛存加鎖在進(jìn)程的頁(yè)面換入和換出的工作中發(fā)揮了重要作用, 在頁(yè)面的換出時(shí), 如果表 示頁(yè)面的虛存段被加鎖, 則虛存段所表示的頁(yè)面不能被換出, 這種機(jī)制在使一些較常用的進(jìn) 程固定于內(nèi)存, 似的調(diào)用這些進(jìn)程的書(shū)牘大大加快, 同時(shí)也減少了許多頁(yè)面調(diào)入和換出的工 作,從而似的的利用率更高。進(jìn)程進(jìn)行頁(yè) 面的換出時(shí),首先要找 到表示該頁(yè)面的 vm_
17、area_struct 結(jié) 構(gòu),如 果 vm_area_struct 結(jié)構(gòu)中有加鎖的標(biāo)志,則該頁(yè)面不能被換出。操作系統(tǒng)在檢查其他的頁(yè)面, 其采用的算法是 (Least Recently Used) 算法。器具體的實(shí)現(xiàn)在頁(yè)面的管理機(jī)制一章中有 詳細(xì)的說(shuō)明。原代碼分析( mlock.c 中的函數(shù)分析)1) static inline int mlock_fixup_all(struct vm_area_struct *vma,int newsflags) 該函數(shù)用于對(duì)整個(gè)虛存段進(jìn)行加鎖,其中 vma 指向所要加鎖的虛存段, newsflags 表示對(duì)虛存段進(jìn)行操作后所加的標(biāo)志。其中當(dāng) newsfl
18、ags=VM_LOCKED 時(shí),表示對(duì)虛 存段加鎖;當(dāng) newsflags 中的第十二位數(shù)位時(shí),則表示對(duì)內(nèi)存解鎖。VM_LOCKED 的定義見(jiàn) /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ù)用于對(duì)虛存段的一部分加鎖,加鎖的部
19、分為從虛存段的起始地址開(kāi)始,到end 地址結(jié)束,參數(shù)的含義跟上一函數(shù)的相同,其中 end 表示要加鎖的虛存段的結(jié)束地址。 圖示如下:) mlock_fixup_end(struct vm_area_struct * vma,startunsigned long start, int newflags) 該函數(shù)用于對(duì)虛存段的一部分加鎖,其加鎖的部分為從虛存段中的一個(gè)地址 開(kāi)始,到虛存段的結(jié)束地址這一段進(jìn)行加鎖。其中 start 表示要加鎖的起始地址 圖示如下:) mlock_fixup_middle(struct vm_area_struct * vma,unsigned long start,unsigned long end, int newflags)該函數(shù)用于對(duì)虛存段中從 start 開(kāi)始到 end 結(jié)束的一段進(jìn)行加鎖,其中 start 表示加鎖 的開(kāi)始地址, end 表示加鎖的結(jié)束地址。圖示如下:) mlock_fixup(struct vm_area_struct * vma, unsigned long start,unsigned long end, unsigned
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技行業(yè)專題報(bào)告:DeepSeek:技術(shù)顛覆or創(chuàng)新共贏
- 奮斗新時(shí)代決心鑄就輝煌
- 2025年個(gè)人借款咨詢與風(fēng)險(xiǎn)管理服務(wù)協(xié)議4篇
- 2025年全球及中國(guó)絕對(duì)大分子多角度光散射檢測(cè)器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球柔性表面加熱器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球噴丸服務(wù)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年臨床醫(yī)師定期考核試題中醫(yī)知識(shí)復(fù)習(xí)題庫(kù)及答案(70題)
- 2024年青少年禁毒知識(shí)競(jìng)賽小學(xué)組題庫(kù)及答案(共70題)
- 生態(tài)經(jīng)濟(jì)與醫(yī)療健康產(chǎn)業(yè)在崇明的協(xié)同發(fā)展
- 科技在傳染病防治教育中的應(yīng)用與展望
- 2025水利云播五大員考試題庫(kù)(含答案)
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀
- 中藥飲片驗(yàn)收培訓(xùn)
- 手術(shù)室??谱o(hù)士工作總結(jié)匯報(bào)
- 2025屆高三聽(tīng)力技巧指導(dǎo)-預(yù)讀、預(yù)測(cè)
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 蘇州市2025屆高三期初陽(yáng)光調(diào)研(零模)政治試卷(含答案)
- 創(chuàng)傷處理理論知識(shí)考核試題及答案
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- 《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)》測(cè)試題+答案
- 殘疾軍人新退休政策
評(píng)論
0/150
提交評(píng)論