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