• 正文
    • 1. ?概述
    • 2. ?地址轉(zhuǎn)換
    • 3. ?TLB和Cache
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

一文看懂內(nèi)存管理及TLB的基本原理

9小時前
280
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

1. ?概述

程序通常運行在虛擬內(nèi)存空間,虛擬內(nèi)存的大小由處理器位數(shù)決定。對于32位處理器,其地址范圍是0~0xFFFF_FFFF,即4GB;對于64位處理器,其地址范圍是0~0xFFFF_FFFF_FFFF_FFFF,這個范圍就是程序能夠產(chǎn)生的地址范圍,其中的某個地址就稱為虛擬地址。

和虛擬內(nèi)存(virtual memory)相對應(yīng)的是物理內(nèi)存(physical memort),物理內(nèi)存是現(xiàn)實世界中直接使用的存儲器,其中的某個地址就是物理地址。物理內(nèi)存的大小不能超過處理器最大可以尋址的空間。例如,32位處理器的物理內(nèi)存(一般簡稱為內(nèi)存)可以是256MB,即PM的范圍是0~0xFFF_FFFF,也可以將物理內(nèi)存增加到4GB,此時虛擬內(nèi)存和物理內(nèi)存的地址空間大小是相同的。

使用了虛擬地址,則處理器輸出的地址就是虛擬地址,這個地址不會直接送到物理存儲器中,而要先進行地址轉(zhuǎn)換。負責地址轉(zhuǎn)換的部件稱為內(nèi)存管理單元(Memory Manage Unit, MMU),如下圖。

使用虛擬存儲器的系統(tǒng)

使用虛擬存儲器不僅便于程序在處理器中運行,還給程序編寫帶來好處。在直接使用物理存儲器的處理器中,如果要同時運行多個程序,需要為每個程序都分配一塊地址空間,每個程序都需要在這個地址空間內(nèi)運行,這樣極大地限制了程序的編寫,而且不能使處理器隨便地運行程序。

通過操作系統(tǒng)動態(tài)地將每個程序的虛擬地址轉(zhuǎn)化為物理地址,還可以實現(xiàn)程序的保護。即使兩個程序使用了同一個虛擬地址,它們也會對應(yīng)到不同的物理地址,因此可以保證每個程序的內(nèi)容不會被其他程序隨便改寫。通過這種方式,還可以實現(xiàn)程序間的共享,例如操作系統(tǒng)內(nèi)核提供了打印(printf)函數(shù),第一個程序在地址A使用了printf,第二個程序在地址B使用了printf,操作系統(tǒng)在地址轉(zhuǎn)換的時候,會將地址A和B轉(zhuǎn)換為同樣的物理地址,這個物理地址就是printf函數(shù)在物理存儲器中的實際地址,這樣就實現(xiàn)了程序的共享。雖然兩個程序都用了printf,但沒必要使printf占用物理內(nèi)存的兩個地方,因此,使用虛擬存儲器不僅可以降低物理存儲器的容量需求,還可以帶來另外的好處:保護(protect)和共享(share)。

一個處理器要支持現(xiàn)代的操作系統(tǒng),就必須支持虛擬存儲器,它是操作系統(tǒng)里非常重要的內(nèi)容。

2. ?地址轉(zhuǎn)換

目前最通用的虛擬內(nèi)存是基于分頁(page)的虛擬存儲器。虛擬地址空間以頁為單位劃分,典型的頁大小為4KB,相應(yīng)的物理地址也進行同樣大小的劃分。由于歷史原因,物理地址空間中不叫做頁,而稱為frame,它和頁的大小必須相等。當程序開始運行時,會將當前需要的部分內(nèi)容從硬盤中搬移到物理內(nèi)存中,每次搬移的單位就是一個頁的大小。由于只有在需要時才將一個頁的內(nèi)容放到物理內(nèi)存中,這種方式就稱為demand page,它使處理器可以運行比物理內(nèi)存更大的程序。

對于一個虛擬地址,VA[11:0]表示頁內(nèi)的位置,稱為page offset,VA剩余的部分用來表示哪個頁,也稱為VPN(Virtual Page Number)。相應(yīng)的,物理地址的PA[11:0]表示frame內(nèi)的位置,稱為frame offset,而PA剩余的部分表示哪個frame,稱為PFN(Physical Frame Number)。由于頁和frame的大小一樣,所以VA到PA的轉(zhuǎn)換實際上就是VPN到PFN的轉(zhuǎn)換,offset不需要變化。

2.1 ?單級頁表

在使用虛擬內(nèi)存的系統(tǒng)中,都是用一張表來存儲虛擬地址到物理地址(實際上是VPN到PFN)的對應(yīng)關(guān)系,這個表稱為頁表(Page Table,PT),也稱為轉(zhuǎn)換表(translation table)。這個表一般放在物理內(nèi)存中,使用虛擬地址來尋址,表格中被尋址到的內(nèi)容就是該虛擬地址對應(yīng)的物理地址。每個程序都有自己的頁表,為了指示程序的頁表在物理內(nèi)存中的位置,處理器中一般會有一個頁表寄存器(Page Table Register,PTR),用來存放當前運行程序的頁表在物理內(nèi)存中的起始地址。每次操作系統(tǒng)將一個程序調(diào)入物理內(nèi)存中執(zhí)行時,會將寄存器PTR設(shè)置好。當然,這種機制可以工作的前提是頁表位于物理內(nèi)存中一片連續(xù)的地址空間內(nèi)。

下圖表示如何使用PTR從物理內(nèi)存中定位到一個頁表,并使用虛擬地址來尋址頁表,從而找到對應(yīng)的物理地址。其實,使用PTR和虛擬地址來尋址,相當于用它們兩個共同組成一個地址,來尋址物理內(nèi)存。

圖中每個頁的大小是4K,使用PTR和虛擬地址共同來尋址,找到對應(yīng)的表項(entry),當表項對應(yīng)的valid為1時,表示這個虛擬地址所在的4KB空間已經(jīng)被OS映射到物理內(nèi)存中,可以直接從物理內(nèi)存中找到這個虛擬地址對應(yīng)的數(shù)據(jù)。這時訪問當前頁內(nèi)任意的地址,就是訪問物理內(nèi)存中被映射的那個4KB的空間了。如果被尋址的表項的valid是0,表示這個虛擬地址對應(yīng)的4KB空間還沒有被操作系統(tǒng)映射到物理內(nèi)存,此時就產(chǎn)生Page Fault類型的異常,需要操作系統(tǒng)從更下一級的存儲器(例如硬盤或閃存)將這個頁對應(yīng)的4KB內(nèi)容搬移到物理內(nèi)存。

通過頁表進行地址轉(zhuǎn)換

圖中使用了32位的虛擬地址,頁表在物理內(nèi)存中的起始地址用PTR來指示。虛擬地址的尋址空間是2^32字節(jié),即4GB;物理地址的尋址空間是2^30字節(jié),即1GB。在頁表中的一個表項(entry)能夠映射4KB的大小,為了能映射整個4GB的空間,需要表項的個數(shù)應(yīng)該是4GB/4KB=1M,也就是2^20,因此需要20位來尋址。也就是說32位的虛擬地址分成兩部分,低12bit用來尋址一個頁內(nèi)的內(nèi)容,高20bit用來尋址哪個頁,因此真正尋址頁表只需要VPN就夠了。從頁表中找到的內(nèi)容也不是整個物理地址,而只是PFN。

需要注意,頁表的結(jié)構(gòu)不同于cache,頁表中包括了所有VPN的映射關(guān)系,所以可以直接用VPN對頁表進行尋址,而不需要使用Tag。

可以采用很多方法來減少一個進程的頁表對于存儲空間的需求,最常用的是多級頁表(Hierarchical Page Table),可以減少頁表對于物理存儲空間的占用,而且非常容易使用硬件實現(xiàn)。與之對應(yīng),本節(jié)所講述的頁表稱為單級頁表(Single Page Table),也稱為線性頁表(Linear Page Table)。

2.2 ?多級頁表

將一個4MB的線性頁表劃分為若干個更小的頁表,稱它們?yōu)樽禹摫恚幚砥髟趫?zhí)行進程的時候,不需要一下子把整個線性頁表都放入物理內(nèi)存中,而是根據(jù)需求逐步地放入這些子頁表。而且,這些子頁表不需要占用連續(xù)的物理內(nèi)存空間。也就是說,相鄰的子頁表可以放在物理內(nèi)存中不連續(xù)的位置,這樣也提高了物理內(nèi)存的利用效率。但是,由于所有的子頁表是不連續(xù)地放在物理內(nèi)存中,所以依舊需要一個表,來記錄每個子頁表在物理內(nèi)存中存儲的位置,稱這個表格為第一級頁表(Level1 Page Table),而那些子頁表為第二級頁表(Level2 Page Table)。

兩級頁表

這樣,要得到一個虛擬地址對應(yīng)的數(shù)據(jù),先訪問第一級頁表,得到第二級頁表的基地址,再去第二級頁表得到對應(yīng)的物理地址,然后就可以在物理內(nèi)存中取出相應(yīng)的數(shù)據(jù)。

例如,對于一個32位虛擬地址、頁大小為4KB的系統(tǒng),如果采用線性頁表,則頁表中表項個數(shù)為2^20,將其等分為2^10等份,每個等份就是一個第二級頁表,共有1024個第二級頁表,對應(yīng)著第一級頁表的1024個表項。也就是說,第一級頁表需要10位地址來進行尋址。每個二級頁表中,表項個數(shù)為1024,也需要10位地址來尋址。

下圖中,一個頁表中的表項簡稱為PTE,當操作系統(tǒng)創(chuàng)建一個進程時,就在物理內(nèi)存中為這個進程找到一個連續(xù)的4KB空間,存在這個進程的第一級頁表,并且將第一級頁表在物理內(nèi)存中起始地址放到PTR寄存器中,在ARM是TTB寄存器,X86是CR3寄存器等。隨著這個進程的進行,操作系統(tǒng)會逐步在物理內(nèi)存中創(chuàng)建第二級頁表,每次創(chuàng)建一個第二級頁表,操作系統(tǒng)就要將它的起始地址放到第一級頁表對應(yīng)的表項中。

使用兩級頁表進行地址轉(zhuǎn)換

在很多硬件實現(xiàn)Page Table Walk的處理器中,都采用了多級頁表的結(jié)構(gòu)。Page Table Walk是指當發(fā)生TLB缺失時,需要從頁表中找到對應(yīng)的映射關(guān)系并將其寫回到TLB的過程。

使用這種多級頁表結(jié)構(gòu),每一級的頁表都需要存儲在物理內(nèi)存中,因此要得到一個虛擬地址對應(yīng)的數(shù)據(jù),需要多次訪問物理內(nèi)存。顯然,這個過程消耗的時間是很長。對于一個二級頁表,需要訪問兩次物理內(nèi)存,才能得到虛擬地址對應(yīng)的物理地址,然后還需要訪問一次物理內(nèi)存得到數(shù)據(jù),因此要得到虛擬地址對應(yīng)的數(shù)據(jù),共需要訪問三次物理內(nèi)存。

使用虛擬存儲器的優(yōu)點總結(jié):

讓每個程序都有獨立的地址空間。

引入虛擬地址到物理地址的映射,為物理內(nèi)存的管理帶來方便,可以更靈活地對其進行分配和釋放,在虛擬內(nèi)存上連續(xù)的地址空間可以映射到物理內(nèi)存上不連續(xù)的空間。

在處理器中如果存在多個進程,為這些進程分配的物理內(nèi)存之和可能大于實際可用的物理內(nèi)存,虛擬存儲器的管理使得這種情況下各個進程仍能夠正常運行,此時為各個進程分配的只是虛擬存儲器的頁,這些頁可能存在物理內(nèi)存中,也可能臨時存在于更下一級的硬盤中,在硬盤中這部分空間被稱為swap空間。當物理內(nèi)存不夠用時,將物理內(nèi)存中一些不常用的頁保存到硬盤上的swap空間。因此處理器等效可以使用的物理內(nèi)存的總量是物理內(nèi)存的大小 + 硬盤中swap空間的大小。

利用虛擬存儲器,可以管理每一個頁的訪問權(quán)限。從硬件角度,單純的物理內(nèi)存本身不具有各種權(quán)限的屬性,它的任何地址都可以被讀寫,而操作系統(tǒng)則要求在物理內(nèi)存中實現(xiàn)不同的訪問權(quán)限。例如一個進程的代碼段(text)一般不能被修改,而數(shù)據(jù)段(data)一般可讀可寫。這些權(quán)限的管理通過頁表來實現(xiàn),在頁表中設(shè)置每個頁的屬性,操作系統(tǒng)和MMU可以控制每個頁的訪問權(quán)限。

3. ?TLB和Cache

3.1 ?TLB的設(shè)計

3.1.1 ?概述

對兩級頁表來說,需要訪問兩次物理內(nèi)存才可以得到虛擬地址對應(yīng)的物理地址(一次訪問第一級頁表,另一次訪問第二級頁表),而物理內(nèi)存的運行速度相對于處理器是很慢的。此時可以借鑒Cache的設(shè)計理念,使用一個速度比較快的緩存,將頁表中最近使用的PTE緩存下來,因為它們在以后可能繼續(xù)使用,尤其對于取指令來說,考慮到程序本身的串行性,會順序地從一個頁內(nèi)取指令,將PTE緩存起來能夠加快一個頁內(nèi)4KB內(nèi)容的地址轉(zhuǎn)換速度。

由于歷史原因,緩存PTE的部件一般不叫Cache,而叫TLB (Translation Lookaside buffer),在TLB中存儲了頁表中最近使用過的PTE。本質(zhì)上,TLB就是頁表的Cache。但是TLB不同于一般的cache,它只有時間相關(guān)性(Temporal Locality),也就是現(xiàn)在訪問的頁,很有可能在以后繼續(xù)被訪問。至于空間相關(guān)性(Spatial Locality),TLB沒有明顯的規(guī)律,因為在一個頁內(nèi)有很多情況,都可能使程序跳轉(zhuǎn)到其他不相鄰的頁中取指令或數(shù)據(jù),也就是說,雖然當前在訪問一個頁,但未必會訪問它相鄰的頁。

TLB本質(zhì)上是Cache,有三種組織方法:直接相連(direct mapped)、組相連(set associative)和全相連(fully associative)?,F(xiàn)代的處理器,很多都采用兩級TLB,第一級TLB分為指令TLB(I-TLB)和數(shù)據(jù)TLB(D-TLB),一般采用全相連的方式;第二級TLB是指令和數(shù)據(jù)共享,一般采用組相連的方式,這種設(shè)計方法和多級Cache一樣。

TLB是頁表的Cache,所以TLB的內(nèi)容完全來自于頁表,下圖為一個全相連的TLB,從處理器送出的虛擬地址首先送到TLB中進行查找,如果TLB對應(yīng)的內(nèi)容是有效的(即valid位為1),則表示TLB命中,可以直接使用從TLB得到的物理地址來尋址物理內(nèi)存;如果TLB缺失(即valid位為0),那么需要訪問物理內(nèi)存中的頁表,此時有如下兩種情況:

(1) 在頁表中找到的PTE是有效的,即這個虛擬地址所屬的頁存在于物理內(nèi)存中,那么就可以直接從頁表中找到對應(yīng)的物理地址,使用它來尋址物理內(nèi)存從而得到需要的數(shù)據(jù),同時將頁表中的這個PTE寫回到TLB中,供以后使用。

(2) 在頁表中找到的PTE是無效的,即這個虛擬地址所屬的頁不在物理內(nèi)存中,造成這種現(xiàn)象的原因很多,例如這個頁在以前沒有被使用過,或者這個頁已經(jīng)被交換到了硬盤中等,此時就應(yīng)該產(chǎn)生Page Fault類型的異常,通知操作系統(tǒng)來處理這個情況,操作系統(tǒng)需要從硬盤中將相應(yīng)的頁搬移到物理內(nèi)存中,將它在物理內(nèi)存中的首地址放到頁表內(nèi)對應(yīng)的PTE中,并將這個PTE的內(nèi)容寫到TLB中。

TLB的內(nèi)容

圖中,因為TLB采用了全相連的方式,所以相比頁表,多了一個Tag的項,它保存了虛擬地址的VPN,用來對TLB進行匹配查找,TLB中其它的項完全來自于頁表,每當發(fā)生TLB缺失時,將PTE從頁表中搬移到TLB內(nèi)。

現(xiàn)代處理器都支持大小可變的頁,由操作系統(tǒng)來管理。根據(jù)不同應(yīng)用特點選用不同大小的頁,可以最大限度利用TLB中有限的空間,同時又不至于在頁內(nèi)產(chǎn)生更多的碎片。為了支持這種特性,在TLB中需要相應(yīng)的位進行管理,例如MIPS處理器的TLB中,有一個12位的Pagemask項,它用來指示當前被映射的頁的大小。

采用不同大小的頁,在尋址TLB時,進行的地址比較也是不同的,對于1MB大小的頁,只需要將VA[31:20]作為Tag,參與地址比較就可以了,虛擬地址剩余的20位將用來尋址頁的內(nèi)部。不僅如此,對TLB的尋址還受到其他內(nèi)容的影響,例如ASID和Global位。

3.1.2 ?TLB缺失

當一個虛擬地址查找TLB,發(fā)現(xiàn)需要的內(nèi)容不在其中時,就發(fā)生了TLB缺失(miss),由于TLB本身的容量很小,所以TLB缺失發(fā)生的頻率比較高,很多情況下都可以發(fā)生TLB缺失,主要有以下幾種:

(1) 虛擬地址對應(yīng)的頁不在物理內(nèi)存中,此時頁表中沒有對應(yīng)的PTE,而TLB是頁表的cache,自然TLB中也不可能有。

(2) 虛擬地址對應(yīng)的頁在物理內(nèi)存中,因此頁表中有對應(yīng)的PTE,但這個PTE還沒有放到TLB中,這種情況也經(jīng)常發(fā)生,畢竟TLB的內(nèi)容遠小于頁表。

(3) 虛擬地址對應(yīng)的頁在物理內(nèi)存中,因此頁表中有對應(yīng)的PTE,這個PTE也曾存在于TLB中,但后來被替換出去了,現(xiàn)在這個頁又重新使用了,此時這個PTE就存在于頁表中,但不在TLB內(nèi)。

其實,(2)和(3)兩種情況是在說同一件事情,即虛擬地址和物理地址的映射關(guān)系存在于頁表中,而不存在于TLB中,此時只需要從頁表中就可以找到這個映射關(guān)系,因此它們的處理時間比情況(1)要短。

解決TLB缺失的本質(zhì)就是要從頁表中找到對應(yīng)的映射關(guān)系,并將其寫回到TLB內(nèi),這個過程稱為Page Table Walk,可以使用硬件狀態(tài)機來完成,也可以使用軟件來做,它們各有優(yōu)缺點,各自工作流程如下:

(1) 軟件實現(xiàn)Page Table Walk。軟件實現(xiàn)可以保證最大的靈活性,但一般也需要硬件配合,來減少工作量。一旦發(fā)現(xiàn)TLB缺失,硬件把產(chǎn)生TLB缺失的虛擬地址保存到一個特殊寄存器中,同時產(chǎn)生一個TLB缺失類型的異常,在異常處理程序中,軟件使用保存在特殊寄存器當中的虛擬地址去尋址物理內(nèi)存中的頁表,找到對應(yīng)的PTE,并寫回到TLB中,很顯然,處理器需要支持直接操作TLB的指令,如寫TLB指令和讀TLB指令等。對于超標量處理器,對異常處理時,會將流水線中所有的指令抹掉,這樣會產(chǎn)生一些性能上缺失,但可以實現(xiàn)靈活的TLB替換算法,MIPS和Alpha處理器一般采用這種方法。

(2) 硬件實現(xiàn)Page Table Walk。硬件實現(xiàn)一般由MMU完成。TLB缺失時,MMU自動使用當前的虛擬地址去尋址物理內(nèi)存中的頁表,多級頁表的最大優(yōu)點就是容易使用硬件進行查找,只需要使用一個狀態(tài)機逐級進行查找就可以,如果從頁表中找到的PTE是有效的,那么將它寫回到TLB,這個過程全部由硬件自動完成。如果MMU發(fā)現(xiàn)查找到的PTE是無效的,那么就只能產(chǎn)生Page Fault類型的異常,由操作系統(tǒng)來處理整個情況。使用硬件處理TLB缺失更適合超標量處理器,它不需要打斷流水線,因此性能會好一點,但是需要操作系統(tǒng)保證頁表已經(jīng)在物理內(nèi)存中建立好了,并且操作系統(tǒng)需要將頁表的基地址預先寫到處理器內(nèi)部的寄存器中(例如PTR),這樣才能保證硬件可以正確地尋址頁表,ARM、PowerPC和x86處理器都采用這種方法。

3.1.3 ?TLB的寫入

當一個頁從硬盤搬移到物理內(nèi)存之后,操作系統(tǒng)需要知道這個頁中的內(nèi)容在物理內(nèi)存中是否被改變過。如果沒有被改變過,當這個頁需要被替換時可以直接進行覆蓋,因為總能從硬盤中找到這個頁的備份;如果這個頁的內(nèi)容在物理內(nèi)存中被修改過(例如store指令的地址落在了這個頁內(nèi)),那么在硬盤中存儲的頁就過時了,在物理內(nèi)存中的這個頁要被替換時,需要先將它從物理內(nèi)存中寫回到硬盤,因此需要在頁表中,對每個被修改的頁加以標記,稱為臟狀態(tài)位(dirty),當物理內(nèi)存中的一個頁要被替換時,首先檢查它在頁表中對應(yīng)PTE的臟狀態(tài)位,如果為1,需要先將這個頁寫回到硬盤,然后才能將其覆蓋。

使用TLB作為頁表的緩存之后,處理器送出的虛擬地址會首先訪問TLB,如果命中,那么可以直接從TLB中得到物理地址,不需要再訪問頁表。執(zhí)行l(wèi)oad/store指令都會使 TLB中對應(yīng)的“使用位use”變?yōu)?1,表示這個頁中的某些數(shù)據(jù)最近被訪問過;如果是 store指令,還會使臟狀態(tài)位dirty也變?yōu)?,表示這個頁中的某些數(shù)據(jù)被改變了。但如果采用寫回(Write Back)的TLB,那么使用位use和臟狀態(tài)位dirty改變的信息并不會馬上從TLB中寫回到頁表,只有等到TLB中的一個表項要被替換的時候,才會將它對應(yīng)的信息寫回到頁表中,這會給操作系統(tǒng)進行頁表替換帶來問題,因為頁表中記錄的狀態(tài)位(use和dirty)可能是過時的。一種比較容易的解決辦法就是操作系統(tǒng)在Page Fault發(fā)生時,首先將TLB中的內(nèi)容寫回到頁表,然后就可以根據(jù)頁表中的信息進行后續(xù)處理了。

實際上,操作系統(tǒng)完全可以認為被TLB記錄的所有頁都是需要被使用的,這些頁在物理內(nèi)存中不能夠被替換。操作系統(tǒng)可以使用一些辦法來記錄頁表中哪些PTE被放到了TLB中來實現(xiàn)。

如果在系統(tǒng)中使用了D-Cache,那么物理內(nèi)存中每個頁的最新內(nèi)容都可能存在D-Cache中,要將這個頁的內(nèi)容寫回到硬盤,首先需要確認D-Cache中是否保留著這個頁的數(shù)據(jù)。因此在進行頁表替換時,操作系統(tǒng)就必須有能力從D-Cache中找出這個頁的內(nèi)容,并將其寫回到物理內(nèi)存中。

3.1.4 ?對TLB進行控制

如果由于某些原因?qū)е乱粋€頁的映射關(guān)系在頁表中不存在了,那么它在TLB中也不應(yīng)該存在,而操作系統(tǒng)在一些情況下,會把某些頁的映射關(guān)系從頁表中抹掉,例如:

(1) 當一個進程結(jié)束時,這個進程的指令(code)、數(shù)據(jù)(data)和堆棧(stack)所占據(jù)的頁表就需要變?yōu)闊o效,這樣就釋放了這個進程占據(jù)的物理內(nèi)存空間。但是,此時在I-TLB中可能存在這個進程的程序?qū)?yīng)的PTE,在D-TLB中可能還存在著這個進程的數(shù)據(jù)和堆棧的PTE,此時需要將I-TLB和D-TLB中和這個進程相關(guān)的所有內(nèi)容置為無效,如果沒有使用ASID,最簡單的做法就是將I-TLB和D-TLB中的全部內(nèi)容都置為無效,這樣保證新的進程可以使用一個干凈的TLB;如果實現(xiàn)了ASID,只需將這個進程對應(yīng)的內(nèi)容在TLB中置為無效就可以了。

(2) 當一個進程占用的物理內(nèi)存過大時,操作系統(tǒng)可能會將這個進程中的一部分不經(jīng)常使用頁寫回到硬盤中,這些頁在頁表中對應(yīng)的映射關(guān)系也應(yīng)該置為無效,此時也需要將I-TLB和D-TLB中對應(yīng)的內(nèi)容置為無效,但是,一般操作系統(tǒng)會盡量避免將存在于TLB中的頁置為無效,因為這些頁在以后很可能會被繼續(xù)使用。

因此,抽象出來,對TLB的管理需要包括的內(nèi)容有如下幾點:

能夠?qū)-TLB和D-TLB的所有表項(entry)置為無效;

能夠?qū)-TLB和D-TLB中某個ASID對應(yīng)的所有表項置為無效;

能夠?qū)-TLB和D-TLB中某個VPN對應(yīng)的表項置為無效;

不同的處理器有著不同的方法來對TLB進行管理。在ARM處理器中,使用系統(tǒng)控制協(xié)處理器(ARM稱之為CP15)中的寄存器對TLB進行控制,因此處理器只需要使用訪問協(xié)處理器的指令(MCR和MRC)來向CP15中對應(yīng)的寄存器寫入相應(yīng)的值,就可以對TLB進行操作。

相關(guān)推薦