Linux編程白皮書 第二章 內存管理

發表于:2007-07-04來源:作者:點擊數: 標簽:
第2章 內 存 管 理 內存管理子系統是操作系統最重要的部分之一。從早期計算開始,系統的內存大小就難以 滿足人們的需要。為了解決這個問題,可利用虛擬內存。虛擬內存通過當需要時在競爭的進 程之間共享內存,使系統顯得有比實際上更多的內存空間。 第2章 內

第2章 內 存 管 理
    

       內存管理子系統是操作系統最重要的部分之一。從早期計算開始,系統的內存大小就難以
滿足人們的需要。為了解決這個問題,可利用虛擬內存。虛擬內存通過當需要時在競爭的進
程之間共享內存,使系統顯得有比實際上更多的內存空間。

第2章 內 存 管 理
    

       內存管理子系統是操作系統最重要的部分之一。從早期計算開始,系統的內存大小就難以
滿足人們的需要。為了解決這個問題,可利用虛擬內存。虛擬內存通過當需要時在競爭的進
程之間共享內存,使系統顯得有比實際上更多的內存空間。
    虛擬內存不僅僅使機器上的內存變多,內存管理子系統還提供以下功能:
     大地址空間 操作系統使系統顯得它有比實際上大得多的內存。虛擬內存可以比系統中
     的物理內存大許多倍。
     保護 系統中每個進程有自己的虛擬地址空間。這些虛擬地址空間相互之間完全分離,
     所以運行一個應用的進程不能影響其他的進程。同樣,硬件的虛擬內存機制允許內存區
     域被寫保護。這樣保護了代碼和數據不被惡意應用重寫。
     內存映射 內存映射用來把映像和數據文件映像到一個進程的地址空間。在內存映射中,
     文件的內容被直接鏈接到進程的虛擬地址空間。
     公平物理內存分配   內存管理子系統給予系統中運行的每個進程公平的一份系統物理內
     存。
     共享虛擬內存 盡管虛擬內存允許進程擁有分隔的(虛擬)地址空間,有時你會需要進程共
     享內存。例如系統中可能會有幾個進程運行命令解釋 shell bash。最好是在物理內存中只
     有一份bash拷貝,所有運行bash的進程共享它;而不是有幾份 bash拷貝,每個進程虛擬
     空間一個。動態庫是另一個常見的幾個進程共享執行代碼的例子。
    共享內存也可以被用作進程間通信 (IPC)機制,兩個或更多進程通過共有的內存交換信息。
Linux支持Unix(tm) System V的共享內存IPC。


2.1 虛擬內存抽象模型
    

       在考察Linux支持虛擬內存所使用的方法之前,考察一下抽象模型會有所幫助。
       當處理器運行一個程序時,它從內存中讀取一條指令并解碼。在解碼該指令過程中它可
能需要取出或存放內存某個位置的內容。處理器然后執行該指令并移動到程序中下一條指令。
這樣處理器總是訪問內存來取指令或取存數據。
    在虛擬內存系統中以上所有的地址都是虛擬地址而不是物理地址。處理器基于由操作系
統維護的一組表中的信息,將虛擬地址轉換成物理地址。
    為了使這種變換容易一些,虛擬內存和物理內存都被分為合適大小的塊叫做“頁 (page)”。
這些頁都有同樣的大小。它們可以不具有同樣大小,但那樣的話系統將很難管理。 Alpha AXP
系統上Linux使用8KB字節大小的頁,Intel x86系統上使用4KB字節大小的頁。這些頁中每一個
都有一個唯一的號碼:頁幀號(Page Frame Number, PFN)。在這種分頁模型中,一個虛擬地址
由兩部分組成:一個偏移和一個虛擬頁幀號。如果頁大小是 4KB字節,虛擬地址的11∶0位包
含偏移,12位及高位是虛擬頁幀號。每當處理器面臨一個虛擬地址時,它必須析取出偏移和
虛擬頁幀號。處理器必須將虛擬頁幀號轉換成物理的頁幀號,然后在該物理頁中正確的偏移
位置上進行訪問。為了完成這些處理器要使用頁表。
    圖1-2-1展示了兩個進程的虛擬地址空間,進程 X和進程Y,每個都有自己的頁表。
此主題相關圖片如下:
javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">screen.width-500)this.style.width=screen.width-500;}}" border="0" />


    這些頁表將每個進程的虛擬頁映射到內存中的物理頁。圖 1-2-1顯示進程X的虛擬頁幀號0
映射到內存中物理頁幀號 1,進程Y的虛擬頁幀號1映射到物理頁幀號4。理論上的頁表中每一
項包含下列信息:
     有效標志,用來指示該頁表項是否有效。
     本項所描述的物理頁幀號。
     訪問控制信息。它描述該頁可以被怎樣使用。它是否可以被寫?是否包含可執行代碼?
    頁表用虛擬頁幀號作為偏移來訪問。虛擬頁幀號 5將是表中第6個元素(0是第1個)。
    為了將一個虛擬地址轉換成物理地址,處理器首先必須得到虛擬地址頁幀號和在該虛擬
頁中的偏移。通過選取頁大小為 2的冪,這可以很容易地屏蔽和移位得到。再看一下圖 1-2-1,
設頁大小是0x2000字節(即十進制8192),Y進程虛擬地址空間中一個地址為 0x2194,則處理器
將把該地址轉換為虛擬頁幀號1的偏移0x194。
    處理器使用虛擬頁幀號作為進程頁表的索引來檢索它的頁表項。如果該偏移處頁表項有
效,處理器將從該項取出物理頁幀號。如果該頁表項無效,說明處理器訪問了虛擬內存中不
存在的區域。在這種情況下,處理器不能解析該地址,并且必須把控制傳給操作系統來解決
問題。
    處理器如何通知操作系統一個正確的進程試圖訪問一個沒有有效轉換的虛擬地址,這是
依處理器不同而不同的。無論如何處理器能夠處理它,這被稱作“頁故障 (page fault)”。操作
系統被告知故障的虛擬地址和故障原因。
    如果訪問的是有效的頁表項,處理器取出物理頁幀號,并將它乘以頁的大小以得到物理
內存中該頁的基地址。最后,處理器將偏移加到所需的指令或數據的地址。
    再以上面的例子為例,進程 Y的虛擬頁幀號 1映射到物理頁幀號 4,起始于 0x8000(4×
0x2000)。加上0x194字節的偏移,最后得到物理地址 0x8194。


    通過用這種方式映射虛擬地址和物理地址,虛擬內存能夠以任何次序被映射到系統物理
頁。例如,在圖1-2-1中進程X的虛擬頁幀號0被映射到物理頁幀號1,而虛擬頁幀號7被映射到
物理頁幀號0,盡管在虛擬內存中它比虛擬頁幀號 0要高。這說明了虛擬內存的一個有趣的副
作用:虛擬內存頁不必以任何特定次序出現在物理內存中。

下一章:2.1.1 請求調頁 近期發布

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

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