溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

分頁機制建立的方法步驟

發(fā)布時間:2021-10-11 11:57:50 來源:億速云 閱讀:136 作者:iii 欄目:編程語言

這篇文章主要講解了“分頁機制建立的方法步驟”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“分頁機制建立的方法步驟”吧!

分頁機制建立的方法步驟

1、邏輯地址,線性地址,虛擬地址,物理地址傻傻分不清?

(1)邏輯地址

在IA-32架構(gòu)下,分段是必須的,而分頁并不是必須的。不論分頁與否,訪問內(nèi)存都必須采用“段基址:段內(nèi)偏移地址”的策略。 因此訪問內(nèi)存需要16&32共48位的地址信息,這便是邏輯地址,高12位為段選擇子,后面32位為段內(nèi)偏移地址。

(2)線性地址

使用選擇子索引到段描述符取得32位的段基址后與邏輯地址內(nèi)的32位段內(nèi)偏移地址相加后得到一個32位的地址信息,這便是線性地址。

(3)虛擬地址

如果不啟用分頁機制,線性地址就是物理地址,而如果啟用分頁機制的話,線性地址又叫做虛擬地址。

(4)物理地址

物理地址,不用多說,內(nèi)存單元的真正地址

2、什么是分頁?

分頁本質(zhì)上是將各種大小不同的內(nèi)存段拆分成大小相同的內(nèi)存塊(通常4KB),以便進行內(nèi)存管理的一種機制。

3、為什么要分頁?

主要是便于內(nèi)存管理,解決純分段情況下應(yīng)用程序過多,或者內(nèi)存碎片過多而無法容納新進程。又或者重新加載某內(nèi)存段(之前交換出去的)時找不到合適的內(nèi)存區(qū)域的問題。 造成這情況的原因:只分段的情況下,線性地址就是物理地址,兩者都是連續(xù)的,不夠靈活,不可能每次都能找到合適的內(nèi)存區(qū)域。而分頁的話,線性地址需要進一步轉(zhuǎn)化為物理地址,線性地址是連續(xù)的,但是物理地址可以不連續(xù),這樣的話尋找合適的內(nèi)存區(qū)域時就很靈活,解決了上述問題。

4、分頁機制?(基于32位系統(tǒng))

(1)頁表

分頁機制的核心功能是實現(xiàn)虛擬地址到物理地址的轉(zhuǎn)化,如何轉(zhuǎn)化呢?靠的是頁表將虛擬地址和物理地址建立起映射關(guān)系,有了這映射關(guān)系,便可將虛擬地址轉(zhuǎn)化成實際的物理地址。 總的思想是:將虛擬地址的高20位視作索引號,在頁表中進行索引頁表項,得到物理基址,將其與虛擬地址的低12位偏移地址相加后便得到最后的物理地址。 這也是一級頁表下虛擬地址轉(zhuǎn)化為物理地址的方式,然而一級頁表并不適用,一般會使用多級頁表。

(2)頁目錄項,頁表項

頁目錄項和頁表項的結(jié)構(gòu)以及屬性位簡介如下: 分頁機制建立的方法步驟

(3)二級頁表及地址轉(zhuǎn)換

二級頁表下虛擬地址到物理地址轉(zhuǎn)化的原理與一級頁表下轉(zhuǎn)化的原理相同,只是多進行了一步轉(zhuǎn)化。具體流程先看圖: 分頁機制建立的方法步驟 第一步:使用段選擇子去GDT中索引段描述符,“取出”段基址,段部件將段基址與偏移地址相加得到線性地址,也即虛擬地址。 第二步:將虛擬地址的高10位作為索引號,索引頁目錄表中的頁目錄項,具體操作:將虛擬地址高10位乘4加上CR3中的頁目錄物理地址,得到所要的頁目錄項的地址,即a+0x44。 第三步:將虛擬地址的中10位作為索引號索引二級頁表中的頁表項,具體操作:“取出”頁目錄項中的20位頁表物理地址,即0x1000。再加上虛擬地址中10位乘4,得到物理頁地址,即0x1000+0x2344。 第四步:虛擬地址的后12位偏移地址和第三步得到的物理頁地址相加得到最后實際的物理地址。如圖中所示:0xfa000+0x567=0xfa567為最后target的物理地址。

以上就是二級頁表下地址轉(zhuǎn)化的過程,三級乃至多級頁表下地址轉(zhuǎn)化的方法都一樣,不過是多重復(fù)了第三步的操作。

注:分頁機制的作用是將虛擬地址轉(zhuǎn)化為物理地址,但在實際轉(zhuǎn)化的過程中相當于在關(guān)閉分頁機制條件下進行的。即地址轉(zhuǎn)化的過程中涉及的地址(CR3中頁目錄地址,頁目錄項地址,頁表項地址)都是實際的物理地址,不會被分頁機制繼續(xù)轉(zhuǎn)化,否則的話會無限遞歸下去。

(4)為什么一級頁表不適用?

1個4B大小的頁表項指向4K的頁面,映射整個4G空間的話需要4G / 4K = 1M 個頁表項,因此整個頁表大小為4M。 一個進程便需要4M大小的頁表,如果說有很多進程則會花費許多內(nèi)存來儲存頁表。再者這還只是32位的系統(tǒng),內(nèi)存空間只有2^32^B = 4GB,若是64位系統(tǒng),則需要 2^64^ / 2^12^ = 252個頁表項 ,那簡直不可想象。

(5)多級頁表為什么比一級頁表省空間?

首先頁表就是一個整體,一級頁表下4M(32位)的頁表就是一個整體,需要全部創(chuàng)建,所以每個進程都要有4M的頁表,這樣的話頁表所占用的空間的確很多。 而多級頁表只會為進程實際使用的那部分虛擬內(nèi)存建立頁表,只用一級頁表需要建立所有的頁表項,而多級頁表只建立了需要的頁表,如此當然更省空間。 那為什么多級頁表下就只需要建立需要的那部分頁表呢? 多級頁表相當于對一級頁表再次進行分頁,將一張大頁表拆成了多張小頁表,以后想用幾張便做幾張,這樣就很靈活而且省空間。 一些操作系統(tǒng)虛擬內(nèi)存管理系統(tǒng)也是這么實現(xiàn)的,只有某個虛擬地址需要一張新頁表來映射時,才會為它分配物理頁,這就做到了需要才建立的原則,因而比一級頁表更省空間。

5、如何建立分頁機制?(大致思路)

1、建立初始頁表,建立頁表就是建立映射關(guān)系,建立映射關(guān)系就是添加頁表項。操作系統(tǒng)內(nèi)核的虛擬地址在0xc0000000以上,而最開始我們工作的地址是在物理內(nèi)存的低端1M,所以這里的映射關(guān)系為將物理內(nèi)存的低端1M映射到虛擬地址空間的0xc0000000以上。 2、GDT,內(nèi)核棧等等都應(yīng)放在內(nèi)核中,需要修改其地址值,還有一些描述符中的段基址也需要修改,因為原來的地址是實際的物理地址,啟用分頁后應(yīng)采用虛擬地址。 3、把頁目錄地址賦給CR3寄存器。 4、將CR0寄存器的PE位置1,開啟分頁機制。 5、重新加載GDT。

至此便啟用了分頁機制,隨后系統(tǒng)運行中出現(xiàn)的地址都是虛擬地址,需要經(jīng)過上述圖中所示的轉(zhuǎn)化來獲得實際的物理地址。

5、分頁的缺點?如何解決?

分頁雖然很靈活,但是需要做多次計算,多次訪問內(nèi)存。每一個虛擬地址都要重復(fù)上述操作的話,處理器的負擔過重,時間也花費過多。 如何解決呢? 利用局部性原理為地址轉(zhuǎn)換建立了一個高速緩存,TLB,俗稱快表。 有了TLB,處理器在尋址之前會先利用虛擬地址的高20位在TLB中查找相應(yīng)條目,如果命中,則返回虛擬地址所映射的物理頁地址,否則便去查詢頁表,找到相應(yīng)物理頁地址后再更新TLB。

感謝各位的閱讀,以上就是“分頁機制建立的方法步驟”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對分頁機制建立的方法步驟這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI