一文詳解Linux虛擬內(nèi)存技術(shù)_第1頁
一文詳解Linux虛擬內(nèi)存技術(shù)_第2頁
一文詳解Linux虛擬內(nèi)存技術(shù)_第3頁
一文詳解Linux虛擬內(nèi)存技術(shù)_第4頁
一文詳解Linux虛擬內(nèi)存技術(shù)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第第頁一文詳解Linux虛擬內(nèi)存技術(shù)

接上文:(Linux)虛擬內(nèi)存基礎(chǔ)。

以存儲(chǔ)單元為單位來管理顯然不現(xiàn)實(shí),因此Linux把虛存空間分成若干個(gè)大小相等的存儲(chǔ)分區(qū),Linux把這樣的分區(qū)叫做頁。為了換入、換出的方便,物理內(nèi)存也就按頁的大小分成若干個(gè)塊。由于物理內(nèi)存中的塊空間是用來容納虛存頁的容器,所以物理內(nèi)存中的塊叫做頁框。頁與頁框是Linux實(shí)現(xiàn)虛擬內(nèi)存技術(shù)的基礎(chǔ)。

虛擬內(nèi)存的頁、物理內(nèi)存的頁框及頁表

在Linux中,頁與頁框的大小一般為4KB。當(dāng)然,根據(jù)系統(tǒng)和應(yīng)用的不同,頁與頁框的大小也可有所變化。

物理內(nèi)存和虛擬內(nèi)存被分成了頁框與頁之后,其存儲(chǔ)單元原來的地址都被自然地分成了兩段,并且這兩段各自代表著不同的意義:高位段分別叫做頁框碼和頁碼,它們是識(shí)別頁框和頁的編碼;低位段分別叫做頁框偏移量和頁內(nèi)偏移量,它們是存儲(chǔ)單元在頁框和頁內(nèi)的地址編碼。下圖就是兩段虛擬內(nèi)存和物理內(nèi)存分頁之后的情況:

為了使系統(tǒng)可以正確的訪問虛存頁在對應(yīng)頁框中的映像,在把一個(gè)頁映射到某個(gè)頁框上的同時(shí),就必須把頁碼和存放該頁映像的頁框碼填入一個(gè)叫做頁表的表項(xiàng)中。這個(gè)頁表就是之前提到的映射記錄表。一個(gè)頁表的示意圖如下所示:

頁模式下,虛擬地址、物理地址轉(zhuǎn)換關(guān)系的示意圖如下所示:

也就是說:(處理器)遇到的地址都是虛擬地址。虛擬地址和物理地址都分成頁碼(頁框碼)和偏移值兩部分。在由虛擬地址轉(zhuǎn)化成物理地址的過程中,偏移值不變。而頁碼和頁框碼之間的映射就在一個(gè)映射記錄表——頁表中。

請頁與交換

虛存頁面到物理頁框的映射叫做頁面的加載。

當(dāng)處理器試圖訪問一個(gè)虛存頁面時(shí),首先到頁表中去查詢該頁是否已映射到物理頁框中,并記錄在頁表中。如果在,則MMU會(huì)把頁碼轉(zhuǎn)換成頁框碼,并加上虛擬地址提供的頁內(nèi)偏移量形成物理地址后去訪問物理內(nèi)存;如果不在,則意味著該虛存頁面還沒有被載入內(nèi)存,這時(shí)MMU就會(huì)通知(操作系統(tǒng)):發(fā)生了一個(gè)頁面訪問錯(cuò)誤(頁面錯(cuò)誤),接下來系統(tǒng)會(huì)啟動(dòng)所謂的“請頁”機(jī)制,即調(diào)用相應(yīng)的系統(tǒng)操作函數(shù),判斷該虛擬地址是否為有效地址。

如果是有效的地址,就從虛擬內(nèi)存中將該地址指向的頁面讀入到內(nèi)存中的一個(gè)空閑頁框中,并在頁表中添加上相對應(yīng)的表項(xiàng),最后處理器將從發(fā)生頁面錯(cuò)誤的地方重新開始運(yùn)行;如果是無效的地址,則表明進(jìn)程在試圖訪問一個(gè)不存在的虛擬地址,此時(shí)操作系統(tǒng)將終止此次訪問。

當(dāng)然,也存在這樣的情況:在請頁成功之后,內(nèi)存中已沒有空閑物理頁框了。這是,系統(tǒng)必須啟動(dòng)所謂地(交換機(jī))制,即調(diào)用相應(yīng)的內(nèi)核操作函數(shù),在物理頁框中尋找一個(gè)當(dāng)前不再使用或者近期可能不會(huì)用到的頁面所占據(jù)的頁框。找到后,就把其中的頁移出,以裝載新的頁面。對移出頁面根據(jù)兩種情況來處理:如果該頁未被修改過,則刪除它;如果該頁曾經(jīng)被修改過,則系統(tǒng)必須將該頁寫回輔存。

系統(tǒng)請頁的處理過程如下所示:

為了公平地選擇將要從系統(tǒng)中拋棄的頁面,Linux系統(tǒng)使用

最近最少使用(LRU)頁面的衰老(算法)。這種策略根據(jù)系統(tǒng)中每個(gè)頁面被訪問的頻率,為物理頁框中的頁面設(shè)置了一個(gè)叫做年齡的屬性。頁面被訪問的次數(shù)越多,則頁面的年齡最小;相反,則越大。而年齡較大的頁面就是待換出頁面的最佳候選者。

快表

在系統(tǒng)每次訪問虛存頁時(shí),都要在內(nèi)存的所有頁表中尋找該頁的頁框,這是一個(gè)很費(fèi)時(shí)間的工作。但是,人們發(fā)現(xiàn),系統(tǒng)一旦訪問了某一個(gè)頁,那么系統(tǒng)就會(huì)在一段時(shí)間內(nèi)穩(wěn)定地工作在這個(gè)頁上。所以,為了提高訪問頁表的速度,系統(tǒng)還配備了一組正好能容納一個(gè)頁表的(硬件)(寄存器),這樣當(dāng)系統(tǒng)再訪問虛存時(shí),就首先到這組硬件寄存器中去訪問,系統(tǒng)速度就快多了。這組存放當(dāng)前頁表的寄存器叫做快表。

總之,使用虛擬存儲(chǔ)技術(shù)時(shí),處理器必須配備一些硬件來承擔(dān)內(nèi)存管理的一部分任務(wù)。承擔(dān)內(nèi)存管理任務(wù)的硬件部分叫做存儲(chǔ)管理單元MMU。存儲(chǔ)管理單元MMU的工作過程如下圖所示:

頁的共享

在多程序系統(tǒng)中,常常有多個(gè)程序需要共享同一段代碼或數(shù)據(jù)的情況。在分頁管理的存儲(chǔ)器中,這個(gè)事情很好辦:讓多個(gè)程序共享同一個(gè)頁面即可。

具體的方法是:使這些相關(guān)程序的虛擬空間的頁面在頁表中指向內(nèi)存中的同一個(gè)頁框。這樣,當(dāng)程序運(yùn)行并訪問這些相關(guān)頁面時(shí),就都是對同一個(gè)頁框中的頁面進(jìn)行訪問,而該頁框中的頁就被這些程序所共享。下圖是3個(gè)程序共享一個(gè)頁面的例子:

頁的保護(hù)

由上可知,頁表實(shí)際上是由虛擬空間轉(zhuǎn)到物理空間的入口。因此,為了保護(hù)頁面內(nèi)容不被沒有該頁面訪問權(quán)限的程序所破壞,就應(yīng)在頁表的表項(xiàng)中設(shè)置一些訪問控制字段,用于指明對應(yīng)頁面中的內(nèi)容允許何種操作,從而禁止非法訪問。

下圖是頁表項(xiàng)中存放控制信息的一種可能的形式:

注意:其中的PCD位表示著是否允許高速緩存(cache)。

如果程序?qū)σ粋€(gè)頁試圖進(jìn)行一個(gè)該頁控制字段所不允許的操作,則會(huì)引起操作系統(tǒng)的一次中斷——非法訪問中斷,并拒絕這種操作,從而保護(hù)該頁的內(nèi)容不被破壞。

多級頁表

需要注意的是,頁表是操作系統(tǒng)創(chuàng)建的用于內(nèi)存管理的表格。因此,一個(gè)程序在運(yùn)行時(shí),其頁表也要存放到內(nèi)存空間。如果一個(gè)程序只需要一個(gè)頁表,則不會(huì)有什么問題。但如果,程序的虛擬空間很大的話,就會(huì)出現(xiàn)一個(gè)比較大的問題。

比如:一個(gè)程序的虛擬空間為(4G)B,頁表以4KB為一頁,那么這個(gè)程序空間就是1M頁。為了存儲(chǔ)這1M頁的頁指針,那么這個(gè)頁表的長度就相當(dāng)大了,對內(nèi)存的負(fù)擔(dān)也很大了。所以,最好對頁表也進(jìn)行分頁存儲(chǔ),在程序運(yùn)行時(shí)只把需要的頁復(fù)制到內(nèi)存,而暫時(shí)不需要的頁就讓它留在輔存中。為了管理這些頁表頁,還要建立一個(gè)記錄頁表頁首地址的頁目錄表,于是單級頁表就變成了二級頁表。二級頁表的地址轉(zhuǎn)換如下圖所示:

當(dāng)然,如果程序的虛擬空間更大,那么也可以用三級頁表來管理。為了具有通用性,Linux系統(tǒng)使用了三級頁表結(jié)構(gòu):頁目錄(PageDirectory,PGD)、中間頁目錄(PageMiddleDirectory,PMD)、頁表(PageTable,PTE)。

Linux的頁表結(jié)構(gòu)

為了通用,Linux系統(tǒng)使用了三級頁表結(jié)構(gòu):頁目錄、中間頁目錄和頁表。PGD為頂級頁表,是一個(gè)p(gdt)數(shù)據(jù)類型的數(shù)組,每個(gè)數(shù)組元素指向一個(gè)中間頁目錄;PMD為二級頁表,是一個(gè)pmdt數(shù)據(jù)結(jié)構(gòu)的數(shù)組,每個(gè)數(shù)組元素指向一個(gè)頁表;PTE則是頁表,是一個(gè)pte_t數(shù)據(jù)類型的數(shù)組,每個(gè)元素中含有物理地址。

為了應(yīng)用上的靈活,Linux使用一系列的宏來掩蓋各種平臺(tái)的細(xì)節(jié)。用戶可以在配置文件config中根據(jù)自己的需要對頁表進(jìn)行配置,以決定是使用三級頁表還是使用二級頁表。

在系統(tǒng)編譯時(shí),會(huì)根據(jù)配置文件config中的配置,把目錄include/asm符號(hào)連接到具體(CPU)專用的文件目錄中。例如,對于i386CPU,該目錄符號(hào)會(huì)連接到include/asm-i386,并在文件pgable-2level-defs.h中定義了二級頁表的基本結(jié)構(gòu),如下圖:

其中還定義了:

#definePGDIR_SHIFT22//PGD在線性地址中的起始地址為bit22#definePT(RS)_PER_PGD1024//PGD共有1024個(gè)表項(xiàng)#definePTRS_PER_PTE1024//PTE共有1024個(gè)表項(xiàng)#endif在文件include/asm-i386/pgtable.h中定義了頁目錄和頁表項(xiàng)的數(shù)據(jù)結(jié)構(gòu),如下:

typedofstruct{unsignedlongpte_low;}pte_t;//頁表中的物理地址,頁框碼typedofstruct{unsignedlongpgd;}pgd_t;//指向一個(gè)頁表typedofstruct{unsignedlongpgprot;}pgprot_t;//頁表中的各個(gè)狀態(tài)信息和訪問權(quán)限從定義可知,它們都是只有一個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論