2021-03-05 分類: 網(wǎng)站建設
以存儲單元為單位來管理顯然不現(xiàn)實,因此Linux把虛存
為了使系統(tǒng)可以正確的訪問虛存頁在對應頁框中的映像,在把一個頁映射到某個頁框上的同時,就必須把頁碼和存放該頁映像的頁框碼填入一個叫做 頁表的表項中。這個頁表就是之前提到的映射記錄表。一個頁表的示意圖如下所示:
頁模式下,虛擬地址、物理地址轉(zhuǎn)換關(guān)系的示意圖如下所示:
也就是說:處理器遇到的地址都是虛擬地址。虛擬地址和物理地址都分成頁碼(頁框碼)和偏移值兩部分。在由虛擬地址轉(zhuǎn)化成物理地址的過程中,偏移值不變。而頁碼和頁框碼之間的映射就在一個映射記錄表——頁表中。
請頁與交換
虛存頁面到物理頁框的映射叫做頁面的 加載。
當處理器試圖訪問一個虛存頁面時,首先到頁表中去查詢該頁是否已映射到物理頁框中,并記錄在頁表中。如果在,則MMU會把頁碼轉(zhuǎn)換成頁框碼,并加上虛擬地址提供的頁內(nèi)偏移量形成物理地址后去訪問物理內(nèi)存;如果不在,則意味著該虛存頁面還沒有被載入內(nèi)存,這時MMU就會通知操作系統(tǒng):發(fā)生了一個頁面訪問錯誤(頁面錯誤),接下來系統(tǒng)會啟動所謂的“請頁”機制,即調(diào)用相應的系統(tǒng)操作函數(shù),判斷該虛擬地址是否為有效地址。
如果是 有效的地址,就從虛擬內(nèi)存中將該地址指向的頁面讀入到內(nèi)存中的一個空閑頁框中,并在頁表中添加上相對應的表項,最后處理器將從發(fā)生頁面錯誤的地方重新開始運行;如果是 無效的地址,則表明進程在試圖訪問一個不存在的虛擬地址,此時操作系統(tǒng)將終止此次訪問。
當然,也存在這樣的情況:在請頁成功之后,內(nèi)存中已沒有空閑物理頁框了。這是,系統(tǒng)必須啟動所謂地 交換機制,即調(diào)用相應的內(nèi)核操作函數(shù),在物理頁框中尋找一個當前不再使用或者近期可能不會用到的頁面所占據(jù)的頁框。找到后,就把其中的頁移出,以裝載新的頁面。對移出頁面根據(jù)兩種情況來處理:如果該頁未被修改過,則刪除它;如果該頁曾經(jīng)被修改過,則系統(tǒng)必須將該頁寫回輔存。
系統(tǒng)請頁的處理過程如下所示:
為了公平地選擇將要從系統(tǒng)中拋棄的頁面,Linux系統(tǒng)使用 最近最少使用(LRU)頁面的衰老算法。這種策略根據(jù)系統(tǒng)中每個頁面被訪問的頻率,為物理頁框中的頁面設置了一個叫做 年齡的屬性。頁面被訪問的次數(shù)越多,則頁面的年齡最小;相反,則越大。而年齡較大的頁面就是待換出頁面的好候選者。
快表
在系統(tǒng)每次訪問虛存頁時,都要在內(nèi)存的所有頁表中尋找該頁的頁框,這是一個很費時間的工作。但是,人們發(fā)現(xiàn),系統(tǒng)一旦訪問了某一個頁,那么系統(tǒng)就會在一段時間內(nèi)穩(wěn)定地工作在這個頁上。所以,為了提高訪問頁表的速度,系統(tǒng)還配備了一組正好能容納一個頁表的 硬件寄存器,這樣當系統(tǒng)再訪問虛存時,就首先到這組硬件寄存器中去訪問,系統(tǒng)速度就快多了。這組存放當前頁表的寄存器叫做 快表。
總之,使用虛擬存儲技術(shù)時,處理器必須配備一些硬件來承擔內(nèi)存管理的一部分任務。承擔內(nèi)存管理任務的硬件部分叫做存儲管理單元MMU。存儲管理單元MMU的工作過程如下圖所示:
頁的共享
在多程序系統(tǒng)中,常常有多個程序需要共享同一段代碼或數(shù)據(jù)的情況。在分頁管理的存儲器中,這個事情很好辦:讓多個程序共享同一個頁面即可。
具體的方法是:使這些相關(guān)程序的
頁的保護
由上可知,頁表實際上是由
注意:其中的PCD位表示著是否允許高速緩存(cache)。
如果程序?qū)σ粋€頁試圖進行一個該頁控制字段所不允許的操作,則會引起操作系統(tǒng)的一次中斷——非法訪問中斷,并拒絕這種操作,從而保護該頁的內(nèi)容不被破壞。
多級頁表
需要注意的是,頁表是操作系統(tǒng)創(chuàng)建的用于內(nèi)存管理的表格。因此,一個程序在運行時,其頁表也要存放到內(nèi)存
當然,如果程序的
為了應用上的靈活,Linux使用一系列的宏來掩蓋各種平臺的細節(jié)。用戶可以在配置文件 config中根據(jù)自己的需要對頁表進行配置,以決定是使用三級頁表還是使用二級頁表。
在系統(tǒng)編譯時,會根據(jù)配置文件 config中的配置,把目錄 include/asm符號連接到具體CPU專用的文件目錄中。例如,對于i386CPU,該目錄符號會連接到include/asm-i386,并在文件pgable-2level-defs.h中定義了二級頁表的基本結(jié)構(gòu),如下圖:
其中還定義了:
- #define?PGDIR_SHIFT??22 //PGD在線性地址中的起始地址為bit22?
- #define?PTRS_PER_PGD??1024? //PGD共有1024個表項?
- ??????????????????????
- #define?PTRS_PER_PTE??1024? //PTE共有1024個表項?
- #endif?
在文件include/asm-i386/pgtable.h中定義了頁目錄和頁表項的數(shù)據(jù)結(jié)構(gòu),如下:
- typedof?struct?{?unsigned?long?pte_low;?}??pte_t?;?????????????????????//頁表中的物理地址,頁框碼?
- typedof?struct?{?unsigned?long?pgd;?}??pgd_t?;?????????????????????????//指向一個頁表?
- typedof?struct?{?unsigned?long?pgprot;?}??pgprot_t?;???????????????????//頁表中的各個狀態(tài)信息和訪問權(quán)限?
從定義可知,它們都是只有一個 長整型類型(32位)的結(jié)構(gòu)體。
注意:如上文的“頁的保護”部分,頁框碼代表物理地址,只需要高20位就夠了(因為頁框的長度為4KB,因此頁內(nèi)偏移12位)。而后12位可以存放各個狀態(tài)信息和訪問權(quán)限。但是Linux并沒有這樣做,反而重新定義了一個結(jié)構(gòu)體來存放,通過“或”運算來將兩者結(jié)合。
文章標題:聊一聊Linux虛擬內(nèi)存技術(shù)
URL網(wǎng)址:http://www.rwnh.cn/news/104401.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、動態(tài)網(wǎng)站、定制開發(fā)、微信公眾號、網(wǎng)站設計、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容