版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Mlock 分析報告第一部分 Linux 存儲管理機制一 80386 體系結構的內存管理功能80386 有兩種工作模式:實地址模式和虛擬地址模式(又稱保護模式) 。實地址模式是 為了與 8086 兼容而設置的。這時,只能尋址 1MB 的地址空間,不能啟用分頁機制,不區(qū) 分特權,分段功能也受到了極大的限制。 而在保護模式下,分段機制得到加強。虛地址空間 可為 16K 個段,每個段的大小可變,最大達到4GB 。段具有獨立的屬性,包括段長、起始地址、段類型和保護位等。 而且 80386 提供片內頁管理機制, 通過兩級頁表來實現(xiàn)線性地址 和物理地址之間的映射,為 LINUX 的虛擬內存管理提供了直接的
2、支持。80386 的虛擬地址模式同時使用了分段機制和分頁機制兩級地址轉換機制來進行地址 轉換。第一級使用分段機制, 把包含段地址和段內偏移量的虛擬地址, 轉換為一個線性地址。 第二級使用分頁機制,把線性地址轉換為物理地址。如圖所示。存儲管理子系統(tǒng)實現(xiàn)以下這些功能:更大的地址空間: 操作系統(tǒng)似的系看起來擁有一個比它實際擁有的地址大的多的地址空間,虛存能夠實 現(xiàn)比物理存儲空間許多倍的地址空間保護 每一個進程在系統(tǒng)中都有它自己的地址空間,虛地址空間使得各個進程完全分離開來, 因此一個進程運行一個應用程序完全不會影響到另一個進程 另外,硬件級的虛存機制為內 存提供了寫保護,這就保證數(shù)據(jù)不會被非法的應用
3、程序重寫存儲映像存儲映像用來把圖象或數(shù)據(jù)文件映像到一個進程的地址空間 在存儲映像中, 文件的內 容直接和進程的虛擬地址空間相連 平衡物理存儲空間的分配存儲管理子系統(tǒng)允許每一個運行的進程公平地競爭系統(tǒng)的物理存儲空間共享虛存空間二 LINUX 的分頁管理機制在 LINUX 中,每一個用戶進程都可以訪問 4GB 的線性虛擬內存空間。 其中從 0 到 3GB 的虛擬內存地址是用戶空間,用戶進程可以直接對其進行訪問。從 3GB 到 4GB 的虛擬內存 地址為系統(tǒng)空間, 存放僅供核心態(tài)訪問的代碼和數(shù)據(jù)。 當用戶進程試圖對其訪問時, 就會觸 發(fā)處理器的特權級轉換(從處理器的特權級 3 切換到特權級 0),即
4、從操作系統(tǒng)的用戶態(tài)切 換到核心態(tài)。所有進程從 3GB 到 4GB 的虛擬空間映像都是一樣的, LINUX 以此方式讓核心態(tài)進程 共享代碼段和數(shù)據(jù)段。核心態(tài)虛擬空間從 3GB 到 3GB+4M 的一段(也就是進程頁目錄第 768 項所管轄的范 圍),被影射到物理空間 0 到 4M 段。因此, 進程處于核心態(tài)時, 只要通過訪問虛擬空間 3GB 到 3GB+4M 段,即訪問了物理空間 0 到 4M 段。上述兩種空間對用戶進程來說都是透明的, 用戶進程所訪問的內存地址都是連續(xù)的 4GB 線性虛擬地址。因此,我們首先關心的是 LINUX 是如何劃分虛擬空間的。LINUX 采用“按需調頁” ( Deman
5、d Paging)技術管理虛擬內存。標準 LINUX 的虛存頁表應 為三級頁表, 依次為頁目錄 (PGD ,Page Directory) 、中間頁目錄 (PMD ,Page Middle Directory) 和頁表( PTE,Page Table)。每一個 page 都有一個標識符 PFN (Page Frame Number), 因此 ,虛地址也就由兩部分 組成 : 一個頁內偏移地址和一個 PFN ,每當處理器遇到一個虛地址 , 它就將虛地址的 PFN 轉化成一個物理頁面的起始地址 , 然后 , 在根據(jù) page_offset 的值 , 找到實際的物理地址 , 這個過程中間要通過一個頁表
6、來實現(xiàn) , 其轉換過程如下 :圖 3. 虛地址經過頁表轉換成實地址的過程在一個頁表中 , 每一行包含了下列數(shù)據(jù) :有效位 : 用來描述頁表的這個入口是否可用這個入口所對應的物理頁表數(shù)存儲控制信息 :其中包括是否可寫 ,是否可執(zhí)行頁表的訪問是通過把虛地址的 PFN 作為頁表的偏移量來訪問的 . 例如 PFN=5 , 則訪問 的頁表的入口為第六個表項 ( 0 為第一個表項 ).處理器處理一個頁表的地址時 , 首先必須算出頁表的 PFN 和 頁內偏移量 . 要實現(xiàn)表 的大小為 2 的冪級大小,這個可以通過掩碼 (masking) 和移位( shifting )來實現(xiàn)處理器 利用虛地址的 PFN 作為
7、目錄來檢索要處理處的頁表的入口如果這個入口是可用的,處 理器從頁表中取出這個頁表項所對應的物理地址的 PFN 如果這個入口不可用,則說明進 程試圖存取一個不在內存中的頁面 在這種情況下, 處理器不能處理, 應該叫給操作系統(tǒng)來 實現(xiàn),以便操作系統(tǒng)能夠處理它進程通過發(fā)出一個 page fault 來通知操作系統(tǒng),然后 操作系統(tǒng)就能夠解釋發(fā)出頁面失配及其原因,如果進程從頁表中訪問一個可用的入口,則進程從頁表中取得物理地址的 PFN ,然后 把這個數(shù)乘上頁表的大小, 以便的到頁表在物理內存中的起始地址, 最后在加上偏移量就得 到了要取數(shù)據(jù)或指令的正確內存地址Linux 的虛存管理 共享虛存虛存使得幾個
8、進程更容易共享存儲區(qū)所有存儲操作都是通過頁表來實現(xiàn)的,每一個 進程都有它私人的頁表 如果兩個進程想要共享一頁物理內存,它的頁幀號 () 必須 在兩個進程的一個頁表入口中能夠找得到每一個進程的虛存都是有一個 mm_struct 結構來描述的,其中包括正在執(zhí)行的映像 的信息和一個指向許多 vm_area_struct 結構的指針, 每一個 vm_area_struct 描述一段虛存 的起始地址和結束地址, 進程對那一段的存取權限和對這段存儲區(qū)的一組操作。 當一個映像 被映射到一個進程的虛地址中, 一組 vm_area_struct 結構就產生了, 每一個 vm_area_struct 結構都代表一
9、段可執(zhí)行的映像, 可執(zhí)行代碼、 初始化數(shù)據(jù)(變量)、未初始化數(shù)據(jù)等等。 Linux 支持許多標準的虛存操作,當 vm_area_struct 被產生后,一組對于虛存的正確的操作也就 跟他聯(lián)系起來。按需調頁中用到的虛存段的操作 當一個影響被影射進進程的虛地址后,它就可以執(zhí)行了。只要影象的起始地址被印象 進物理內存, 它就要存取一個尚不在內存中的虛存段。 當一個進程訪問一個尚沒有合法的頁 表入口的虛地址,它就回向操作系統(tǒng)報告一個頁面失配的錯誤。頁面失配錯誤描述發(fā)生頁面失配的虛地址和引起頁面失配的存儲類型。Linux 必許找到表示發(fā)生頁面失配的存儲區(qū)的虛存段,由于沿著 vm_area_struct
10、結構 搜索對于處理頁面失配的效率有非常重要的關系,這些虛存段被連接成 AVL 樹結構,如果 表示頁面失配的虛存段,則這個進程訪問了一個非法的虛地址。 Linux 將用信號通知進程, 讓進程發(fā)出一個 SIGSEGV 信號,如果進程不能處理這樣的信息,則進程將要終止。 System 共享內存頁面System 共享內存是一種內處理通訊機制( inter-process communication mechanism ), 允許兩個或多個共享同一段虛存的進程互相通訊。進程如何用這種方式共享內存在 IPC-chapter 一章中有詳細的說明, 現(xiàn)在可以很清楚地說 System 的每一塊被共享的內存都 是
11、由一個 shmid_ds 的數(shù)據(jù)結構描述, 這個數(shù)據(jù)結構中包含一個指針指向一個 vm_area_struct 數(shù)據(jù)結構形成的隊列,每一個共享這一段虛存的進程在這一個鏈表中都有一個節(jié)點, vm_area_struct 數(shù)據(jù)結構描述了在進程的什么地方開始使用共享的虛存。對于 System V 中的共享虛存, 指向它的所有 vm_area_struct 結構都是通過 vm_next_shared 和 vm_prev_shared 連接起來的。每一個 shmid_ds 數(shù)據(jù)結構也包含一個頁表入口的鏈表,其中每一個 shmid_ds 數(shù)據(jù)結構包含了一個共享的虛頁所映像到的物理頁面入口。盡管虛存管理允許進
12、程有不同的地址空間(虛) ,但有時也需要進程共享同一段存儲空 間例如有可能有幾個進程運行于系統(tǒng)中且同時使用 bash 命令的 shell .此時并不是各進 程在自己的地址空間中分別擁有一個 bash 的拷貝,更好的方法是在物理空間上有一個 bash 的拷貝,所有運行 bash 的進程讀共享它,動態(tài)鏈接庫是另一個多進程共享執(zhí)行代碼的 例子存儲共享機制也可以用來實現(xiàn)進程內部通訊, 兩個或多個進程通過共享的存儲空間來 交換信息,在 INTEL 微機上, LINUX 的頁表結構實際為兩級。 80386 體系結構之頁管理機制中的 頁目錄就是 PGD ,頁表就是 PTE。而 PMD 和 PGD 實際上是合
13、二為一的。在虛存段的加鎖 操作中 , 主要涉及到的是對于頁表的操作 :在 /include/linux/page.h 中通過一些宏定義來實現(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 指向這個虛存段所屬的 mm_struct 結構的指針 vm_start,vm_end :虛存段的起始、結束地址vm_next :同屬于一個 mm_struct 的 vm_area_struct 形成一個鏈表, vm_next 指向下一 個此鏈表中的 vm_area_struct 節(jié)點vm_page_prot:vm_flags :虛存段的標志位,表示虛存段是否加鎖vm_avl_height 、 vm_area_left 、 vm_ar
15、ea_right :為了便于查找,同一個 mm_struct 中的 vm_area_struct 組織成一個 avl 樹,三個參數(shù)分別表示 avl 樹的高度、當前節(jié)點在 avl 樹 中的左兒子節(jié)點和右兒子節(jié)點vm_next_share 、 vm_pprev_share: vm_ops:指向一個 vm_area_struct 操作集的指針, 在此操作中, 包含了對 vm_area_atruct 的操作vm_offset :由于虛存段的組織需要映射到頁的存儲機構中,其中的vm_offset 表示虛存段的起始地址對于此虛存段起始地址所在也的偏移量vm_file :指向虛存段所在文件的指針, 同時對應
16、的 file 中也有一個計數(shù)器 f_count 用來 表示屬于這個文件的虛存段的數(shù)目vm_pte:所在頁表的入口在 Linux 中采用段頁式來進行存儲區(qū)的管理 其中進程的虛存管理的數(shù)據(jù)結構圖示如下:圖 2. 進程的虛存管理數(shù)據(jù)結構第二部分 虛存加鎖虛存加鎖的作用 虛存加鎖在進程的頁面換入和換出的工作中發(fā)揮了重要作用, 在頁面的換出時, 如果表 示頁面的虛存段被加鎖, 則虛存段所表示的頁面不能被換出, 這種機制在使一些較常用的進 程固定于內存, 似的調用這些進程的書牘大大加快, 同時也減少了許多頁面調入和換出的工 作,從而似的的利用率更高。進程進行頁 面的換出時,首先要找 到表示該頁面的 vm_
17、area_struct 結 構,如 果 vm_area_struct 結構中有加鎖的標志,則該頁面不能被換出。操作系統(tǒng)在檢查其他的頁面, 其采用的算法是 (Least Recently Used) 算法。器具體的實現(xiàn)在頁面的管理機制一章中有 詳細的說明。原代碼分析( mlock.c 中的函數(shù)分析)1) static inline int mlock_fixup_all(struct vm_area_struct *vma,int newsflags) 該函數(shù)用于對整個虛存段進行加鎖,其中 vma 指向所要加鎖的虛存段, newsflags 表示對虛存段進行操作后所加的標志。其中當 newsfl
18、ags=VM_LOCKED 時,表示對虛 存段加鎖;當 newsflags 中的第十二位數(shù)位時,則表示對內存解鎖。VM_LOCKED 的定義見 /linux/include/linux/mm.h其定義為: #define VM_LOCKED0x2000即將標志為的第十二位賦值為(從左到右)則表示虛存段為加鎖狀態(tài),如此位 為,則表示虛存段為解鎖狀態(tài)。函數(shù)圖示如下:) static inline int mlock_fixup_start(struct vm_area_struct * vma,unsigned long end, int newflags)該函數(shù)用于對虛存段的一部分加鎖,加鎖的部
19、分為從虛存段的起始地址開始,到end 地址結束,參數(shù)的含義跟上一函數(shù)的相同,其中 end 表示要加鎖的虛存段的結束地址。 圖示如下:) mlock_fixup_end(struct vm_area_struct * vma,startunsigned long start, int newflags) 該函數(shù)用于對虛存段的一部分加鎖,其加鎖的部分為從虛存段中的一個地址 開始,到虛存段的結束地址這一段進行加鎖。其中 start 表示要加鎖的起始地址 圖示如下:) mlock_fixup_middle(struct vm_area_struct * vma,unsigned long start,unsigned long end, int newflags)該函數(shù)用于對虛存段中從 start 開始到 end 結束的一段進行加鎖,其中 start 表示加鎖 的開始地址, end 表示加鎖的結束地址。圖示如下:) 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作獲獎感言(21篇)
- 幸福的演講稿(15篇)
- 悲傷逆流成河觀后感7篇
- 建筑工程實習報告(15篇)
- 智研咨詢發(fā)布:2024年中國園林古建筑行業(yè)市場發(fā)展環(huán)境及前景研究報告
- 現(xiàn)代農業(yè)產業(yè)園功能建設方案
- 應急預案中的食品與藥品安全管理
- 金融信托行業(yè)顧問工作總結
- 2025版西瓜新品種研發(fā)與應用推廣合同3篇
- 二零二五年度鋼構建筑保溫分包施工協(xié)議2篇
- 信息對抗與認知戰(zhàn)研究-洞察分析
- 中藥飲片驗收培訓
- 手術室??谱o士工作總結匯報
- 2025屆高三聽力技巧指導-預讀、預測
- DB34T 1831-2013 油菜收獲與秸稈粉碎機械化聯(lián)合作業(yè)技術規(guī)范
- 蘇州市2025屆高三期初陽光調研(零模)政治試卷(含答案)
- 創(chuàng)傷處理理論知識考核試題及答案
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- 《義務教育數(shù)學課程標準(2022年版)》測試題+答案
- 殘疾軍人新退休政策
- 2024年安徽省初中學業(yè)水平考試中考數(shù)學試卷(真題+答案)
評論
0/150
提交評論