Linux編程白皮書 第二章 內存管理 2.1.1 請求調頁 --2.1.5 訪問控制

發表于:2007-07-04來源:作者:點擊數: 標簽:
2.1.1 請求調頁 因為物理內存比虛擬內存小得多,操作系統必須小心以高效地利用物理內存。一種節約 物理內存的方法是只裝載被執行的程序當前正在使用的虛擬頁。例如:一個 數據庫 應用程序 可能被運行來查詢一個數據庫。這種情況下,并非數據庫的全部都需要被
2.1.1 請求調頁
    因為物理內存比虛擬內存小得多,操作系統必須小心以高效地利用物理內存。一種節約
物理內存的方法是只裝載被執行的程序當前正在使用的虛擬頁。例如:一個數據庫應用程序
可能被運行來查詢一個數據庫。這種情況下,并非數據庫的全部都需要被裝入內存,而只是
裝入那些被檢查的數據記錄。如果數據庫查詢是一個搜索查詢,那么把處理添加新記錄的代
碼從數據庫程序中裝載進來是毫無意義的。這種只在被訪問時把虛擬頁裝入內存的技巧叫請
求調頁。

2.1.1 請求調頁
    因為物理內存比虛擬內存小得多,操作系統必須小心以高效地利用物理內存。一種節約
物理內存的方法是只裝載被執行的程序當前正在使用的虛擬頁。例如:一個數據庫應用程序
可能被運行來查詢一個數據庫。這種情況下,并非數據庫的全部都需要被裝入內存,而只是
裝入那些被檢查的數據記錄。如果數據庫查詢是一個搜索查詢,那么把處理添加新記錄的代
碼從數據庫程序中裝載進來是毫無意義的。這種只在被訪問時把虛擬頁裝入內存的技巧叫請
求調頁。
    當進程試圖訪問一個當前不在內存中的虛擬地址時,處理器將不能為被引用的虛擬頁找
到頁表項。例如:圖 1-2-1中,進程X的頁表中沒有虛擬頁幀號 2的頁表項,所以當X試圖從虛
擬頁幀號2中讀一個地址時,處理器將不能把該地址轉換成物理地址。這時處理器通知操作系
統發生了頁故障。
    如果故障的虛擬地址無效,這意味著,該進程試圖訪問一個不該訪問的地址?;蛟S應用
程序出了些錯誤,比如寫內存中的隨機地址。這種情況下操作系統將終止它,保護系統中其
他進程不受此惡意進程破壞。
    如果故障的虛擬地址有效,但它所引用的頁當前不在內存中,操作系統就必須從磁盤上
的映像中把適當的頁取到內存中,相對來說,磁盤訪問需要很長時間,所以進程必須等待一
會兒直到該頁被取出。如果還有其他可以運行的進程,操作系統將選擇其中一個來運行。被
取出的頁會被寫到一個空閑的物理頁幀,該虛擬頁幀號的頁表項也被加入到進程頁表中。然
后進程從出現內存故障的機器指令處重新開始。這次進行虛擬內存訪問時,處理器能夠進行
虛擬地址到物理地址的轉換,進程將繼續執行。
    Linux使用請求調頁把可執行映像裝入進程虛擬內存中。每當一個命令被執行時,包含該
命令的文件被打開,它的內容被映射到進程虛擬空間。這是通過修改描述進程內存映射的數
據結構來完成的,被稱作“內存映射”。然后,只有映像的開始部分被實際裝入物理內存,映
像其余部分留在磁盤上。隨著進程的執行,它會產生頁故障, Linux使用進程內存映射以決定
映像的哪一部分被裝入內存去執行。
2.1.2 交換
    如果一個進程想將一個虛擬頁裝入物理內存,而又沒有可使用的空閑物理頁,操作系統
就必須淘汰物理內存中的其他頁來為此頁騰出空間。
    如果從物理內存中被淘汰的頁來自于一個映像或數據文件,并且還沒有被寫過,則該頁
不必被保存,它可以被丟掉。如果有進程再需要該頁時就可以把它從映像或數據文件中取回
內存。
    然而,如果該頁被修改過,操作系統必須保留該頁的內容以便晚些時候再被訪問。這種
頁稱為“臟(dirty)”頁,當它被從內存中刪除時,將被保存在一個稱為交換文件的特殊文件中。
相對于處理器和物理內存的速度,訪問交換文件要很長時間,操作系統必須在將頁寫到磁盤
以及再次使用時取回內存的問題上花費心機。
    如果用來決定哪一頁被淘汰或交換的算法 (交換算法)不夠高效的話,就可能出現稱為“抖
動”的情況。在這種情況下,頁面總是被寫到磁盤又讀回來,操作系統忙于此而不能進行真
正的工作。例如,如果圖1-2-1中物理頁幀號1經常被訪問,它就不是一個交換到硬盤上的好的
候選頁。一個進程當前正使用的頁的集合叫做“工作集 (working set)”。一個有效的交換算法
將確保所有進程的工作集都在物理內存中。
    Linux使用“最近最少使用 (Least Recently Used, LRU)”頁面調度技巧來公平地選擇哪個
頁可以從系統中刪除。這種設計中系統中每個頁都有一個“年齡”,年齡隨頁面被訪問而改變。
頁面被訪問越多它越年輕;被訪問越少越年老也就越陳舊。年老的頁是用于交換的最佳候選
頁。

2.1.3 共享虛擬內存
    虛擬內存使得幾個進程共享內存變得容易。所有的內存訪問都是通過頁表進行,并且每
個進程都有自己的獨立的頁表。為了使兩個進程共享—物理頁內存,該物理頁幀號必須在它
們兩個的頁表中都出現。
    圖1-2-1顯示了共享物理頁幀號4的兩個進程。對進程X來說是虛擬頁幀號4,而對進程Y來
說是虛擬頁幀號6。這說明了共享頁有趣的一點:共享物理頁不必存在于共享它的進程的虛擬
內存的相同位置。

2.1.4 物理尋址模式和虛擬尋址模式
    操作系統本身運行在虛擬內存中沒有什么意義。操作系統必須維持自己的頁表是件非常
痛苦的事情。大多數多用途處理器在支持虛擬尋址模式的同時支持物理尋址模式。物理尋址
模式不需要頁表,在這種模式下處理器不會進行任何地址轉換。 Linux內核就是要運行在物理
尋址模式下。
    Alpha AXP處理器沒有特殊的物理尋址模式。相反,它把地址空間分成幾個區,指定其中
兩個作為物理映射地址區。這種核心地址空間被稱為 K S E G 地址空間,它包括所有
oxfffffc0000000000以上的地址。為了執行鏈接在 KSEG中的代碼(定義為內核代碼)或存取其中
的數據,代碼必須執行于核心模式下。Alpha上的Linux內核被鏈接成從地址oxfffffc0000310000
開始執行。

2.1.5 訪問控制
    頁表項中也包含訪問控制信息。因為處理器要使用頁表項來把進程虛擬地址映射到物理地
址,它可以方便地使用訪問控制信息來檢查并保證進程沒有以其不應該采用的方式訪問內存。
    有許多原因導致限制訪問內存區域。有些內存,比如那些包含可執行代碼的,自然地就
是只讀內存;操作系統不應該允許進程寫數據到它的可執行代碼中。相反,包含數據的則可
以被寫,但是試圖把它當作指令來執行就會失敗。大部分處理器至少有兩種執行模式:用戶
態(用戶模式)和核心態(核心模式)。我們不希望核心代碼被用戶執行或核心數據結構被訪問,
除非處理器運行在核心態下。

   訪問控制信息保留在PTE(頁表項)中,并且是處理器相關的。圖1-2-2顯示了Alpha AXP 的
PTE。其各字段意義如下:


javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">screen.width-500)this.style.width=screen.width-500;}" border="0" />此主題相關圖片如下:
screen.width-500)this.style.width=screen.width-500;}" border="0" />

" V 有效性。如果置位則PTE有效。
" FOE  執行時故障,當試圖執行本頁中的指令時,處理器報告頁故障并將控制傳給操作
系統。
" FOW 寫時故障,當試圖寫本頁時發出如上頁故障。
" FOR 讀時故障,當試圖讀本頁時發出如上頁故障。
" ASM 地址空間匹配,當操作系統想要僅清除轉換緩沖區中一些項時用到。
" KRE 運行于核心態的代碼可以讀此頁。
" URE 運行于用戶態的代碼可以讀此頁。
" GH 粒度暗示,當用一個而不是多個轉換緩沖區項映射一整塊時用到。
" KWE 運行于核心態的代碼可以寫此頁。
" UWE 運行于用戶態的代碼可以寫此頁。
" PFN 頁幀號。對于V位置位的PTE,本字段包括物理頁幀號;對于無效 PTE,如果本字
段非0,則包含本頁在交換文件中的位置的信息。
下面兩個位在Linux中被定義并使用:
" _PAGE_DIRTY 如果置位,此頁需要被寫到交換文件中。
" _PAGE_ACCESSED Linux用來標識一個頁已經被訪問過。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97