一步步编写操作系统 41 快表tlb 简介
分頁機制雖然很靈活,但您也看到了,為了實現虛擬地址到物理地址的映射,過程還是有些麻煩的。先要從CR3寄存器中獲取頁目錄表物理地址,然后用虛擬地址的高10位乘以4的積做為在頁目錄表中的偏移量去尋址目錄項pde,從pde中讀出頁表物理地址,然后再用虛擬地址的中間10位乘以4的積做為在該頁表中的偏移量去尋址頁表項pte,從該pte中讀出頁框物理地址,用虛擬地址的低12位做為該物理頁框的偏移量,呼…終于完成虛擬地址到物理地址的映射。
每一個虛擬地址到物理地址的轉換都要重復以上過程,甭說真正去做了,光描述這個過程我都覺得繁瑣,何況這只是用二級頁表做地址映射的過程,要是用三級頁表…我都替處理器喊累。不止如此,處理器的速度和內存的速度完全是兩個數量級,頁表畢竟在內存中,轉換過程中頻繁的內存訪問,使得地址轉換速度慢上加慢,而處理器也不得不停下來等待內存的響應。
虛擬地址到物理地址的轉換,最終是想得到虛擬地址所對應的物理地址,如果給出一個虛擬地址后能直接得到相應的頁框物理地址,免去中間的查表過程,直接用虛擬地址的低12位在該物理頁框中尋址,豈不是大大提高了地址轉換速度。根據程序的局部性原理,可以將近來常用的地址和指令加載到速度更快的設備中,因此我們都想到了緩存。處理器準備了一個高速緩存,可以匹配高速的處理器速率和低速的內存訪問速度,它專門用來存放虛擬地址頁框與物理地址頁框的映射關系,這個調整緩存就是TLB,即Translation Lookaside Buffer,俗稱快表,其結構如圖
TLB中的條目是虛擬地址的高20位到物理地址高20位的映射結果,實際上就是從虛擬頁框到物理頁框的映射。除此之外TLB中還有一些屬性位,比如頁表項的RW屬性。
有了TLB,處理器在尋址之前會用虛擬地址的高20位做為索引來查找TLB中的相關條目,如果命中(匹配到相關條目)則返回虛擬地址所映射的物理頁框地址,否則會查詢內存中的頁表,獲得頁框物理地址后再更新TLB。
高速緩存由于成本等原因,容量一般都很小,TLB也是,因此TLB中的數據只是當前任務的部分頁表,而且只有P位為1的頁表項才有資格在TLB中,如果TLB被裝滿了,需要將很少使用的條目換出。
緩存相當于數據源的快照,為了保證緩存與數據源同步變化,這就涉及到緩存刷新的問題。TLB也是緩存,當內存中的原頁表被修改時,TLB中的相應映射關系按理說也要更新。一般的緩存可以定期刷新,甚至推遲幾分鐘都可以,但TLB和一般的緩存可不一樣,您想,TLB是頁表的緩存,處理器尋址時最先訪問的是TLB,TLB里面存儲的是程序運行所依賴的指令和數據的內存地址,任意時刻都必須保證地址的有效性,否則程序必然出錯,所以TLB必須實時更新。可是如果實時讀取內存中的頁表去更新TLB的話,這又回到了從內存查詢映射關系的老路,TLB反而成了雞肋。為此,TLB并不自動更新,處理器也不負責TLB的有效性,它把TLB的維護工作交給操作系統開發人員,由開發人員手動控制。這的確是非常合理的,畢竟維護頁表的代碼是開發人員自己寫的,他們肯定知道何時修改了頁表,或是修改了哪些條目。
盡管TLB對開發人員不可見,但依然有兩種方法可以間接更新TLB,一個是針對TLB中所有條目的方法——重新加載CR3,比如將CR3寄存器的數據讀出來后再寫入CR3,這會使整個TLB失效。另一個方法是針對TLB中某個條目的更新。處理器提供了指令invlpg(invalidate page),它用于在TLB中刷新某個虛擬地址對應的條目,處理器是用虛擬地址來檢索TLB的,因此很自然地,指令invlpg的操作數也是虛擬地址,其指令格式為invlpg m。注意,其中m表示操作數為虛擬內存地址,并不是立即數,比如要更新虛擬地址0x1234對應的條目,指令為invlpg [0x1234],并不是invlpg 0x1234。將來咱們在內存管理系統中會涉及到TLB的更新操作,這一點尤為注意。
好啦,有關TLB的介紹就到這兒,下節再見
總結
以上是生活随笔為你收集整理的一步步编写操作系统 41 快表tlb 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔幻组合?摩托罗拉Razr 3曝光:骁龙
- 下一篇: java容器类1:Collection,