linux虛存管理機制

來源:互聯網
上載者:User

Linux的記憶體管理採用頁式管理,使用多級頁表,動態地址轉換機構與主存、輔存共同實現虛擬記憶體:每個使用者進程擁有4GB的虛擬位址空間,進程在運行過程中可以動態浮動和擴充,為使用者提供了透明的、靈活有效記憶體使用量方式,下面簡述Linux虛存管理以基本特點和主要實現技術:

一、 Linux虛存管理的基本特點 

1. 更大的地址空間。 
虛擬記憶體可以是系統實際擁有的實體記憶體的若干倍。因而它使得作業系統看起來擁有比實際大得多的記憶體。 
2. 合理的實體記憶體分配。 
Linux通過共用和交換策略,使各個啟動並執行進程能公平地共用記憶體。 3. 保護。 
Linux儲存管理子系統為每一記憶體頁設定了“上鎖位”,線上性地址及每級頁表頁項上設定了“讀/寫”位,這樣來確保某一個進程不受其他進程的幹擾。即使某一個進程失敗了,也不會影響到其他進程和作業系統本身。 
4. 共用虛擬記憶體 
Linux實現的虛擬記憶體允許兩個進程之間互相共用記憶體,例如:共用的庫。在這種情形之下,庫代碼僅存在於一個進程,而不需要為每一個應用都複製一份。

二、 Linux虛存管理的主要實現技術 1、 請求調頁(demanding paging)與記憶體擴充 

使用者進程建立時,並不是將它所需所有頁都分配給相應物理頁。開始時只裝入頁面中進程的第一個頁面,其他頁根據進程運行過程的請求從外存調入所需頁面,當進程訪問一個頁表項P位為0的頁中地址時,表示此頁不在主存中,將產生缺頁中斷,系統調用 handle_mm_fault()處理訪問異常,為之分配相應物理頁後,它再調用swap_in()函數,從外存中讀入該頁面。 
Linux是一種請求式分頁存貯管理,這才使之可以運行大於主存空間的進程。
2. 頁換出策略記憶體中頁面不足時,Linux採用最近最少使用(LRU)演算法:即每次換出時,總是選擇最老的頁換出,對易於從其他裝置上擷取的非髒(not dirty)頁面。Linux採用丟棄(discarding)技術,如果發生過寫操作,則將該頁寫入系統的Swapfile中,這樣就可以加快換入的速度。
3、 記憶體共用 

Linux將記憶體劃分為4K大小的頁面,為記憶體共用提供了基礎: 
 (1)不同進程間頁面共用時,可令共用該頁的進程的頁表項(pte)均指向該頁。 (2)對kernel代碼和資料區段的共用,通過進程建立時fork() 函數將kernel代碼和資料區段映射到使用者虛存的3GB~4GB的空間中去,所以每個進程都可以通過一定方式共用kernel的代碼和資料區段。

4、 記憶體保護 

採用了“Hole”技術、虛存段的保護、地址轉換機構、頁表存取控制位(R/W位)等技術實現了記憶體保護。 
1)“Hole”技術  實體記憶體前4K是一空頁(empty_zero_page),用來捕獲NULL指標的異常訪問。在進程每個虛存段後,都有一個“4K”的“Hole”,用來捕獲虛存段的越界訪問。(在C語言的記憶體布局中,Hole存在與棧與堆之間)
2) 虛存段保護方式  主存中虛存段的全部或部分可以設為保護方式,防止非法訪問。 、3) 頁表項存取控制位(R/W位)  頁表項以“R/W”位表示此頁的存取許可權“1”為可讀寫,“0”為不可讀寫,可用來防止越權訪問。 
4) 地址轉換機構 ,分頁存貯管理方法中,地址轉換機構進行的頁面映象實際上防止了各進程的主存塊間互不干擾,起到進程隔離的作用 

5、 動態地址變換 

利用i386的地址變換機構(邏輯地址轉換為物理地址--由MMU來實現)Linux實現了動態地址變換,進程執行時訪問到某一虛擬位址時才確定其對應的物理地址。這種方式為進程存貯塊的動態和動態擴充提供了基礎。
三. linux虛存管理的主要資料結構1、32-bit虛擬位址在Linux 中,4GB的虛存需通過32-bit 地址進行定址。(Linux 中虛擬位址與線性地址是同一個概念)虛擬位址被分割成3 個子位段,其中2 個子位段包含10 位, 1 個子位段包含12 位

 

3個子位段分別表示不同含義:子位段1 指向被稱作頁目錄(PGD)的一張表,子位段2 指向被稱作頁表(PTE)的一張表,子位段3 指向頁內地址。

2. linux多級頁表結構

標準的Linux的虛存頁表為三級頁表,依次為頁目錄(Page Directory--PGD)、中間頁目錄(Page Middle Directory--PMD)、頁表(Page Table)—PTE)。

在i386機器上Linux的頁表結構實際為兩級,PGD和PMD頁表是合二為一的。所有有關PMD的操作實際上是對PGD的操作。所以原代碼中形如*-pgd-*()和*-pmd-*()的函數實現的功能也是一樣的。

頁目錄(PGD) 是一個大小為4K 的表,每一個process只有一個頁目錄,以4 位元組為一個表項,分成1024 個表項(或稱進入點);該表項的值為所指頁表的始地址。32位虛擬位址的第1 個子位段共10 位,其值的範圍從0 到1023,對應於頁目錄的一個進入點。

頁目錄(PTE)的每一個進入點的值為此表項所指的一頁框(page frame),32位虛擬位址的第2 個子位段共10 位,其值的範圍從0 到1023。

頁框(page frame)並不是物理頁,它指是虛存的一個地址空間。

3、頁表項的格式

Linux中頁表每一個表項的格式,

其中,各位段的含義如下:

P :

存在位,表示該表項對地址的轉換是否有效。i386 處理器在P=0 時不解釋表項中的任何位,此時這些位的含義完全由軟體自行解釋。P 位提供了至關重要的屬性,以支援分頁機制。如果P=1,則表示虛擬位址所對應的頁框存在於實體記憶體中,訪問該虛擬位址的程式可以正常運行;P=0,則表示虛擬位址所對應的頁框不存在於實體記憶體中,訪問該虛擬位址的程式將會引發頁訪問異常,產生缺頁中斷。使得Operating System 可以把缺少的頁從磁碟上讀入記憶體,並將讀入頁存入到表項中,然後將該頁標誌為存在,再使引起異常的程式繼續執行。

R/W :

讀寫位,表示對該表項指向的頁可以進行讀、寫或執行操作。R/W=1 則該頁可寫,可讀,且可執行;R/W=0 則該頁可讀,可執行,但不可寫。當處理器處於特權級0~2時,R/W位被忽略。如該表項位於頁目錄中,則作用於該表項映射的所有各頁。

U/S :

使用者/系統位。U/S=1 則該頁可在任何處理器特權級下訪問;U/S=0 則該頁只能在處理器特權級0~2下被訪問。如該表項位於頁目錄中,則作用於該表項映射的所有各頁。

D :

已寫標誌位。在對該表項映射的頁進行寫訪問之前,處理器對該位置1。如該表項是頁目錄中表項,處理器不修改D位。

Address :

頁框物理地址的高20位。系統將實體記憶體分割成4K大小的記憶體頁框,Address實際上代表了頁框的幀號。

4、動態地址映射

Linus虛存採用動態地址映射方式,即進程的地址空間和儲存空間的對應關係是在程式的執行過程中實現的:進程每用到一個地址時, 都需虛存的地址轉換機構把虛擬位址轉化為記憶體的實際地址。其地址映射如所示:

動態地址映射使Linux可以實現進程在主存中的動態重定位,虛存段的動態擴充和移動;也為虛存的實現提供了基礎。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.