TLB的作用及工作過(guò)程
頁(yè)表一般都很大,并且存放在內(nèi)存中,所以處理器引入MMU后,讀取指令、數(shù)據(jù)需要訪問(wèn)兩次內(nèi)存:首先通過(guò)查詢頁(yè)表得到物理地址,然后訪問(wèn)該物理地址讀取指令、數(shù)據(jù)。為了減少因?yàn)镸MU導(dǎo)致的處理器性能下降,引入了TLB,TLB是Translation Lookaside Buffer的簡(jiǎn)稱,可翻譯為“地址轉(zhuǎn)換后援緩沖器”,也可簡(jiǎn)稱為“快表”。簡(jiǎn)單地說(shuō),TLB就是頁(yè)表的Cache,其中存儲(chǔ)了當(dāng)前最可能被訪問(wèn)到的頁(yè)表項(xiàng),其內(nèi)容是部分頁(yè)表項(xiàng)的一個(gè)副本。只有在TLB無(wú)法完成地址翻譯任務(wù)時(shí),才會(huì)到內(nèi)存中查詢頁(yè)表,這樣就減少了頁(yè)表查詢導(dǎo)致的處理器性能下降。
TLB中的項(xiàng)由兩部分組成:標(biāo)識(shí)和數(shù)據(jù)。標(biāo)識(shí)中存放的是虛地址的一部分,而數(shù)據(jù)部分中存放物理頁(yè)號(hào)、存儲(chǔ)保護(hù)信息以及其他一些輔助信息。虛地址與TLB中項(xiàng)的映射方式有三種:全關(guān)聯(lián)方式、直接映射方式、分組關(guān)聯(lián)方式。OR1200處理器中實(shí)現(xiàn)的是直接映射方式,所以本書(shū)只對(duì)直接映射方式作介紹。直接映射方式是指每一個(gè)虛擬地址只能映射到TLB中唯一的一個(gè)表項(xiàng)。假設(shè)內(nèi)存頁(yè)大小是8KB,TLB中有64項(xiàng),采用直接映射方式時(shí)的TLB變換原理如圖10.4所示。
?
因?yàn)轫?yè)大小是8KB,所以虛擬地址的0-12bit作為頁(yè)內(nèi)地址偏移。TLB表有64項(xiàng),所以虛擬地址的13-18bit作為T(mén)LB表項(xiàng)的索引。假如虛擬地址的13-18bit是1,那么就會(huì)查詢TLB的第1項(xiàng),從中取出標(biāo)識(shí),與虛擬地址的19-31位作比較,如果相等,表示TLB命中,反之,表示TLB失靶。TLB失靶時(shí),可以由硬件將需要的頁(yè)表項(xiàng)加載入TLB,也可由軟件加載,具體取決于處理器設(shè)計(jì),OR1200沒(méi)有提供硬件加載頁(yè)表項(xiàng)的功能,只能由軟件實(shí)現(xiàn)。TLB命中時(shí),此時(shí)翻譯得到的物理地址就是TLB第1項(xiàng)中的標(biāo)識(shí)(即物理地址13-31位)與虛擬地址0-12bit的結(jié)合。在地址翻譯的過(guò)程中還會(huì)結(jié)合TLB項(xiàng)中的輔助信息判斷是否發(fā)生違反安全策略的情況,比如:要修改某一頁(yè),但該頁(yè)是禁止修改的,此時(shí)就違反了安全策略,會(huì)觸發(fā)異常。
OR1200中的MMU分為指令MMU、數(shù)據(jù)MMU,分別簡(jiǎn)稱為IMMU、DMMU。采用的是頁(yè)式內(nèi)存管理機(jī)制,每一頁(yè)大小是8KB,沒(méi)有實(shí)現(xiàn)頁(yè)表管理、頁(yè)表查詢、更新、鎖定等功能,都需要軟件實(shí)現(xiàn)。實(shí)際上OR1200的MMU模塊主要實(shí)現(xiàn)的就是TLB,OR1200中TLB的大小可以配置,默認(rèn)是64項(xiàng),采用的是直接映射方式。IMMU中有ITLB,DMMU中有DTLB,但是ITLB、DTLB的加載、更新、失效、替換等功能也都需要軟件實(shí)現(xiàn)。本章從下一節(jié)開(kāi)始將分別對(duì)IMMU、DMMU進(jìn)行分析。
TLB工作原理
TLB - translation lookaside buffer
快表,直譯為旁路快表緩沖,也可以理解為頁(yè)表緩沖,地址變換高速緩存。
由于頁(yè)表存放在主存中,因此程序每次訪存至少需要兩次:一次訪存獲取物理地址,第二次訪存才獲得數(shù)據(jù)。提高訪存性能的關(guān)鍵在于依靠頁(yè)表的訪問(wèn)局部性。當(dāng)一個(gè)轉(zhuǎn)換的虛擬頁(yè)號(hào)被使用時(shí),它可能在不久的將來(lái)再次被使用到,。
TLB是一種高速緩存,內(nèi)存管理硬件使用它來(lái)改善虛擬地址到物理地址的轉(zhuǎn)換速度。當(dāng)前所有的個(gè)人桌面,筆記本和服務(wù)器處理器都使用TLB來(lái)進(jìn)行虛擬地址到物理地址的映射。使用TLB內(nèi)核可以快速的找到虛擬地址指向物理地址,而不需要請(qǐng)求RAM內(nèi)存獲取虛擬地址到物理地址的映射關(guān)系。這與data cache和instruction caches有很大的相似之處。
TLB原理
當(dāng)cpu要訪問(wèn)一個(gè)虛擬地址/線性地址時(shí),CPU會(huì)首先根據(jù)虛擬地址的高20位(20是x86特定的,不同架構(gòu)有不同的值)在TLB中查找。如果是表中沒(méi)有相應(yīng)的表項(xiàng),稱為T(mén)LB miss,需要通過(guò)訪問(wèn)慢速RAM中的頁(yè)表計(jì)算出相應(yīng)的物理地址。同時(shí),物理地址被存放在一個(gè)TLB表項(xiàng)中,以后對(duì)同一線性地址的訪問(wèn),直接從TLB表項(xiàng)中獲取物理地址即可,稱為T(mén)LB hit。
想像一下x86_32架構(gòu)下沒(méi)有TLB的存在時(shí)的情況,對(duì)線性地址的訪問(wèn),首先從PGD中獲取PTE(第一次內(nèi)存訪問(wèn)),在PTE中獲取頁(yè)框地址(第二次內(nèi)存訪問(wèn)),最后訪問(wèn)物理地址,總共需要3次RAM的訪問(wèn)。如果有TLB存在,并且TLB hit,那么只需要一次RAM訪問(wèn)即可。
TLB表項(xiàng)
TLB內(nèi)部存放的基本單位是頁(yè)表?xiàng)l目,對(duì)應(yīng)著RAM中存放的頁(yè)表?xiàng)l目。頁(yè)表?xiàng)l目的大小固定不變的,所以TLB容量越大,所能存放的頁(yè)表?xiàng)l目越多,TLB hit的幾率也越大。但是TLB容量畢竟是有限的,因此RAM頁(yè)表和TLB頁(yè)表?xiàng)l目無(wú)法做到一一對(duì)應(yīng)。因此CPU收到一個(gè)線性地址,那么必須快速做兩個(gè)判斷:
所需的也表示否已經(jīng)緩存在TLB內(nèi)部(TLB miss或者TLB hit)
所需的頁(yè)表在TLB的哪個(gè)條目?jī)?nèi)
為了盡量減少CPU做出這些判斷所需的時(shí)間,那么就必須在TLB頁(yè)表?xiàng)l目和內(nèi)存頁(yè)表?xiàng)l目之間的對(duì)應(yīng)方式做足功夫
全相連 - full associative
在這種組織方式下,TLB cache中的表項(xiàng)和線性地址之間沒(méi)有任何關(guān)系,也就是說(shuō),一個(gè)TLB表項(xiàng)可以和任意線性地址的頁(yè)表項(xiàng)關(guān)聯(lián)。這種關(guān)聯(lián)方式使得TLB表項(xiàng)空間的利用率最大。但是延遲也可能相當(dāng)?shù)拇?,因?yàn)槊看蜟PU請(qǐng)求,TLB硬件都把線性地址和TLB的表項(xiàng)逐一比較,直到TLB hit或者所有TLB表項(xiàng)比較完成。特別是隨著CPU緩存越來(lái)越大,需要比較大量的TLB表項(xiàng),所以這種組織方式只適合小容量TLB
直接匹配
每一個(gè)線性地址塊都可通過(guò)模運(yùn)算對(duì)應(yīng)到唯一的TLB表項(xiàng),這樣只需進(jìn)行一次比較,降低了TLB內(nèi)比較的延遲。但是這個(gè)方式產(chǎn)生沖突的幾率非常高,導(dǎo)致TLB miss的發(fā)生,降低了命中率。
比如,我們假定TLB cache共包含16個(gè)表項(xiàng),CPU順序訪問(wèn)以下線性地址塊:1, 17 , 1, 33。當(dāng)CPU訪問(wèn)地址塊1時(shí),1 mod 16 = 1,TLB查看它的第一個(gè)頁(yè)表項(xiàng)是否包含指定的線性地址塊1,包含則命中,否則從RAM裝入;然后CPU方位地址塊17,17 mod 16 = 1,TLB發(fā)現(xiàn)它的第一個(gè)頁(yè)表項(xiàng)對(duì)應(yīng)的不是線性地址塊17,TLB miss發(fā)生,TLB訪問(wèn)RAM把地址塊17的頁(yè)表項(xiàng)裝入TLB;CPU接下來(lái)訪問(wèn)地址塊1,此時(shí)又發(fā)生了miss,TLB只好訪問(wèn)RAM重新裝入地址塊1對(duì)應(yīng)的頁(yè)表項(xiàng)。因此在某些特定訪問(wèn)模式下,直接匹配的性能差到了極點(diǎn)
組相連 - set-associative
為了解決全相連內(nèi)部比較效率低和直接匹配的沖突,引入了組相連。這種方式把所有的TLB表項(xiàng)分成多個(gè)組,每個(gè)線性地址塊對(duì)應(yīng)的不再是一個(gè)TLB表項(xiàng),而是一個(gè)TLB表項(xiàng)組。CPU做地址轉(zhuǎn)換時(shí),首先計(jì)算線性地址塊對(duì)應(yīng)哪個(gè)TLB表項(xiàng)組,然后在這個(gè)TLB表項(xiàng)組順序比對(duì)。按照組長(zhǎng)度,我們可以稱之為2路,4路,8路。
經(jīng)過(guò)長(zhǎng)期的工程實(shí)踐,發(fā)現(xiàn)8路組相連是一個(gè)性能分界點(diǎn)。8路組相連的命中率幾乎和全相連命中率幾乎一樣,超過(guò)8路,組內(nèi)對(duì)比延遲帶來(lái)的缺點(diǎn)就超過(guò)命中率提高帶來(lái)的好處了。
這三種方式各有優(yōu)缺點(diǎn),組相連是個(gè)折衷的選擇,適合大部分應(yīng)用環(huán)境。當(dāng)然針對(duì)不同的領(lǐng)域,也可以采用其他的cache組織形式。
TLB表項(xiàng)更新
TLB表項(xiàng)更新可以有TLB硬件自動(dòng)發(fā)起,也可以有軟件主動(dòng)更新
TLB miss發(fā)生后,CPU從RAM獲取頁(yè)表項(xiàng),會(huì)自動(dòng)更新TLB表項(xiàng)
TLB中的表項(xiàng)在某些情況下是無(wú)效的,比如進(jìn)程切換,更改內(nèi)核頁(yè)表等,此時(shí)CPU硬件不知道哪些TLB表項(xiàng)是無(wú)效的,只能由軟件在這些場(chǎng)景下,刷新TLB。
在linux kernel軟件層,提供了豐富的TLB表項(xiàng)刷新方法,但是不同的體系結(jié)構(gòu)提供的硬件接口不同。比如x86_32僅提供了兩種硬件接口來(lái)刷新TLB表項(xiàng):
向cr3寄存器寫(xiě)入值時(shí),會(huì)導(dǎo)致處理器自動(dòng)刷新非全局頁(yè)的TLB表項(xiàng)
在Pentium Pro以后,invlpg匯編指令用來(lái)無(wú)效指定線性地址的單個(gè)TLB表項(xiàng)無(wú)效。
MMU和cache詳解(TLB機(jī)制)
1. MMU
MMU:memory management unit,稱為內(nèi)存管理單元,或者是存儲(chǔ)器管理單元,MMU是硬件設(shè)備,它被保存在主存(main memory)的兩級(jí)也表控制,并且是由協(xié)處理器CP15的寄存器1的M位來(lái)決定是enabled還是disabled。MMU的主要作用是負(fù)責(zé)從CPU內(nèi)核發(fā)出的虛擬地址到物理地址的映射,并提供硬件機(jī)制的內(nèi)存訪問(wèn)權(quán)限檢查。MMU使得每個(gè)用戶進(jìn)程擁有自己的地址空間(對(duì)于WINCE5.0,每個(gè)進(jìn)程是32MB;而對(duì)于WINCE6.0,每個(gè)進(jìn)程的獨(dú)占的虛擬空間是2GB),并通過(guò)內(nèi)存訪問(wèn)權(quán)限的檢查保護(hù)每個(gè)進(jìn)程所用的內(nèi)存不被其他進(jìn)程破壞。
下面是MMU提供的功能和及其特征
?
VA和PA
VA:virtual address稱為虛擬地址,PA:physical address稱為物理地址。CPU通過(guò)地址來(lái)訪問(wèn)內(nèi)存中的單元,如果CPU沒(méi)有MMU,或者有MMU但沒(méi)有啟動(dòng),那么CPU內(nèi)核在取指令或者訪問(wèn)內(nèi)存時(shí)發(fā)出的地址(此時(shí)必須是物理地址,假如是虛擬地址,那么當(dāng)前的動(dòng)作無(wú)效)將直接傳到CPU芯片的外部地址引腳上,直接被內(nèi)存芯片(物理內(nèi)存)接收,這時(shí)候的地址就是物理地址。如果CPU啟用了MMU(一般是在bootloader中的eboot階段的進(jìn)入main()函數(shù)的時(shí)候啟用),CPU內(nèi)核發(fā)出的地址將被MMU截獲,這時(shí)候從CPU到MMU的地址稱為虛擬地址,而MMU將這個(gè)VA翻譯成為PA發(fā)到CPU芯片的外部地址引腳上,也就是將VA映射到PA中。MMU將VA映射到PA是以頁(yè)(page)為單位的,對(duì)于32位的CPU,通常一頁(yè)為4k,物理內(nèi)存中的一個(gè)物理頁(yè)面稱頁(yè)為一個(gè)頁(yè)框(page frame)。虛擬地址空間劃分成稱為頁(yè)(page)的單位,而相應(yīng)的物理地址空間也被進(jìn)行劃分,單位是頁(yè)框(frame).頁(yè)和頁(yè)框的大小必須相同。
VA到PA的映射過(guò)程
?
首先將CPU內(nèi)核發(fā)送過(guò)來(lái)的32位VA[31:0]分成三段,前兩段VA[31:20]和VA[19:12]作為兩次查表的索引,第三段VA[11:0]作為頁(yè)內(nèi)的偏移,查表的步驟如下:
從協(xié)處理器CP15的寄存器2(TTB寄存器,translation table base register)中取出保存在其中的第一級(jí)頁(yè)表(translation table)的基地址,這個(gè)基地址指的是PA,也就是說(shuō)頁(yè)表是直接按照這個(gè)地址保存在物理內(nèi)存中的。
以TTB中的內(nèi)容為基地址,以VA[31:20]為索引值在一級(jí)頁(yè)表中查找出一項(xiàng)(2^12=4096項(xiàng)),這個(gè)頁(yè)表項(xiàng)(也稱為一個(gè)描述符,descriptor)保存著第二級(jí)頁(yè)表(coarse page table)的基地址,這同樣是物理地址,也就是說(shuō)第二級(jí)頁(yè)表也是直接按這個(gè)地址存儲(chǔ)在物理內(nèi)存中的。
以VA[19:12]為索引值在第二級(jí)頁(yè)表中查出一項(xiàng)(2^8=256),這個(gè)表項(xiàng)中就保存著物理頁(yè)面的基地址,我們知道虛擬內(nèi)存管理是以頁(yè)為單位的,一個(gè)虛擬內(nèi)存的頁(yè)映射到一個(gè)物理內(nèi)存的頁(yè)框,從這里就可以得到印證,因?yàn)椴楸硎且皂?yè)為單位來(lái)查的。
有了物理頁(yè)面的基地址之后,加上VA[11:0]這個(gè)偏移量(2^12=4KB)就可以取出相應(yīng)地址上的數(shù)據(jù)了。
這個(gè)過(guò)程稱為T(mén)ranslation Table Walk,Walk這個(gè)詞用得非常形象。從TTB走到一級(jí)頁(yè)表,又走到二級(jí)頁(yè)表,又走到物理頁(yè)面,一次尋址其實(shí)是三次訪問(wèn)物理內(nèi)存。注意這個(gè)“走”的過(guò)程完全是硬件做的,每次CPU尋址時(shí)MMU就自動(dòng)完成以上四步,不需要編寫(xiě)指令指示MMU去做,前提是操作系統(tǒng)要維護(hù)頁(yè)表項(xiàng)的正確性,每次分配內(nèi)存時(shí)填寫(xiě)相應(yīng)的頁(yè)表項(xiàng),每次釋放內(nèi)存時(shí)清除相應(yīng)的頁(yè)表項(xiàng),在必要的時(shí)候分配或釋放整個(gè)頁(yè)表。
CPU訪問(wèn)內(nèi)存時(shí)的硬件操作順序
?
CPU訪問(wèn)內(nèi)存時(shí)的硬件操作順序,各步驟在圖中有對(duì)應(yīng)的標(biāo)號(hào):
CPU內(nèi)核(圖中的ARM)發(fā)出VA請(qǐng)求讀數(shù)據(jù),TLB(translation lookaside buffer)接收到該地址,那為什么是TLB先接收到該地址呢?因?yàn)門(mén)LB是MMU中的一塊高速緩存(也是一種cache,是CPU內(nèi)核和物理內(nèi)存之間的cache),它緩存最近查找過(guò)的VA對(duì)應(yīng)的頁(yè)表項(xiàng),如果TLB里緩存了當(dāng)前VA的頁(yè)表項(xiàng)就不必做translation table walk了,否則就去物理內(nèi)存中讀出頁(yè)表項(xiàng)保存在TLB中,TLB緩存可以減少訪問(wèn)物理內(nèi)存的次數(shù)。
頁(yè)表項(xiàng)中不僅保存著物理頁(yè)面的基地址,還保存著權(quán)限和是否允許cache的標(biāo)志。MMU首先檢查權(quán)限位,如果沒(méi)有訪問(wèn)權(quán)限,就引發(fā)一個(gè)異常給CPU內(nèi)核。然后檢查是否允許cache,如果允許cache就啟動(dòng)cache和CPU內(nèi)核互操作。
如果不允許cache,那直接發(fā)出PA從物理內(nèi)存中讀取數(shù)據(jù)到CPU內(nèi)核。
如果允許cache,則以VA為索引到cache中查找是否緩存了要讀取的數(shù)據(jù),如果cache中已經(jīng)緩存了該數(shù)據(jù)(稱為cache hit)則直接返回給CPU內(nèi)核,如果cache中沒(méi)有緩存該數(shù)據(jù)(稱為cache miss),則發(fā)出PA從物理內(nèi)存中讀取數(shù)據(jù)并緩存到cache中,同時(shí)返回給CPU內(nèi)核。但是cache并不是只去CPU內(nèi)核所需要的數(shù)據(jù),而是把相鄰的數(shù)據(jù)都去上來(lái)緩存,這稱為一個(gè)cache line。ARM920T的cache line是32個(gè)字節(jié),例如CPU內(nèi)核要讀取地址0x30000134~0x3000137的4個(gè)字節(jié)數(shù)據(jù),cache會(huì)把地址0x30000120~0x3000137(對(duì)齊到32字節(jié)地址邊界)的32字節(jié)都取上來(lái)緩存。
ARM920T支持多種尺寸規(guī)格的頁(yè)表
ARM體系結(jié)構(gòu)最多使用兩級(jí)頁(yè)表來(lái)進(jìn)行轉(zhuǎn)換,頁(yè)表由一個(gè)個(gè)條目組成,每個(gè)條目存儲(chǔ)一段虛擬地址對(duì)應(yīng)的物理地址及訪問(wèn)權(quán)限,或者下一級(jí)頁(yè)表的地址。S3C2443最多會(huì)用到兩級(jí)頁(yè)表,已段(section,大小為1M)的方式進(jìn)行轉(zhuǎn)換時(shí)只用到一級(jí)頁(yè)表,以頁(yè)(page)的方式進(jìn)行轉(zhuǎn)換時(shí)用到兩級(jí)頁(yè)表。而頁(yè)的大小有3種:大頁(yè)(large pages,64KB),小頁(yè)(small pages,4KB)和極小頁(yè)(tiny pages,1KB)。條目也成為描述符,有段描述符、大頁(yè)描述符、小頁(yè)描述符和極小頁(yè)描述符,分別保存段、大頁(yè)、小頁(yè)和極小頁(yè)的起始物理地址,見(jiàn)下圖
?
MMU的查表過(guò)程,首先從CP15的寄存器TTB找到一級(jí)頁(yè)表的基地址,再把VA[31:20]作為索引值從表中找出一項(xiàng),這個(gè)表項(xiàng)稱為一級(jí)頁(yè)描述符(level one descriptor),一個(gè)這樣的表項(xiàng)占4個(gè)字節(jié),那么一級(jí)頁(yè)表需要保存的物理內(nèi)存的大小是4*4096=16KB,表項(xiàng)可以是一下四種格式之一:
?
如果描述符的最低位是00,屬于fault格式,表示該范圍的VA沒(méi)有映射到PA。
如果描述符的最低位是10,屬于section格式,這種格式?jīng)]有二級(jí)頁(yè)表而是直接映射到物理頁(yè)面,一個(gè)色彩體哦你是1M的大頁(yè)面,描述符中的VA[31:20]就是這個(gè)頁(yè)面的基地址,基地址的VA[19:0]低位全為0,對(duì)齊到1M地址邊界,描述符中的domain和AP位控制訪問(wèn)權(quán)限,C、B兩位控制緩存。
如果描述符的最低兩位是01或11,則分別對(duì)應(yīng)兩種不同規(guī)格的二級(jí)頁(yè)表。根據(jù)地址對(duì)齊的規(guī)律想一下,這兩種頁(yè)表分別是多大?從一級(jí)描述符中取出二級(jí)頁(yè)表的基地址,再把VA的一部分作為索引去查二級(jí)描述符(level two descriptor),如果是coarse page,則VA[19:12](2^8=256)作為查找二級(jí)頁(yè)表表項(xiàng)的索引;如果是fine page,則VA[19:10](2^10=024)。二級(jí)描述符可以是下面四種格式之一:
?
二級(jí)描述符最低兩位是00是屬于fault格式,其它三種情況分別對(duì)應(yīng)三種不同規(guī)格的物理頁(yè)面,分別是large page(64KB)、small page(4KB)和tiny page(1KB),其中l(wèi)arge page和small page有4組AP權(quán)限位,每組兩個(gè)bit,這樣可以為每1/4個(gè)物理頁(yè)面分別設(shè)置不同的權(quán)限,也就是說(shuō)large page可以為每16KB設(shè)置不同的權(quán)限,small page可以為每1KB設(shè)置不同的權(quán)限。
ARM920T提供了多種頁(yè)表和頁(yè)面規(guī)格,但操作系統(tǒng)只采用其中一種,WINCE采用的就是一級(jí)描述符是coarse page table格式(也即由VA[19:12]來(lái)作為查找二級(jí)頁(yè)表項(xiàng)的索引),二級(jí)描述符是small page格式(也即是VA[11:0]來(lái)作為查找物理頁(yè)面偏移量的索引),每個(gè)物理頁(yè)面大小是4KB。
?
根據(jù)上圖我們來(lái)分析translation table walk的過(guò)程
VA被劃分為三段用于地址映射過(guò)程,各段的長(zhǎng)度取決于頁(yè)描述符的格式。
TTB寄存器中只有[31:14]位有效,低14位全為0,因此一級(jí)頁(yè)表的基地址對(duì)齊到16K地址邊界,而一級(jí)頁(yè)表的大小也是16K。
一級(jí)頁(yè)表的基地址加上VA[31:20]左移兩位組成一個(gè)物理地址。想一想為什么VA[31:20]要左移兩位占據(jù)[13:2]的位置,而空出[1:0]兩位呢?應(yīng)該是需要空出最低兩位用于表示當(dāng)前要尋找的一級(jí)描述符是coarse page格式,目前不清楚,有待了解。
用這個(gè)組裝的物理地址從物理內(nèi)存中讀取一級(jí)頁(yè)表描述符,這是一個(gè)coarse page table格式的描述符。
通過(guò)domain權(quán)限檢查后,coarse page table的基地址再加上VA[19:12]左移兩位組裝成一個(gè)物理地址。
用這個(gè)組裝的物理地址從物理內(nèi)存中讀取二級(jí)頁(yè)表描述符,這是一個(gè)small page格式的描述符。
通過(guò)AP權(quán)限檢查后,small page的基地址再加上VA[11:0]就是最終的物理地址了。
Linux內(nèi)核-內(nèi)存-硬件高速緩存和TLB原理
硬件高速緩存和TLB原理
基本概念
硬件高速緩存的引入是為了縮小CPU和RAM之間的速度不匹配,高速緩存單元插在分頁(yè)單元和主內(nèi)存之間,它包含一個(gè)硬件高速緩存內(nèi)存和一個(gè)高速緩存控制器。高速緩存內(nèi)存存放內(nèi)存中真正的行。高速緩存控制器存放一個(gè)表項(xiàng)數(shù)組,每個(gè)表項(xiàng)對(duì)應(yīng)高速緩存內(nèi)存中的一個(gè)行,如下圖:
?
2.除了通用硬件高速緩存,80x86處理器還包含了另一個(gè)稱為轉(zhuǎn)換后援緩沖器或TLB(Translation Lookaside Buffer)的高速緩存用于加快線性地址的轉(zhuǎn)換。TLB是一個(gè)小的、虛擬尋址的緩存,其中的每一行都保存著一個(gè)由單個(gè)頁(yè)表?xiàng)l目組成的塊。
原理
下面通過(guò)一個(gè)具體的地址翻譯示例來(lái)說(shuō)明緩存和TLB的原理(注意:這是簡(jiǎn)化版的示例,實(shí)際過(guò)程可能復(fù)雜些,不過(guò)原理相同),地址翻譯基于以下設(shè)定:
存儲(chǔ)器是按字節(jié)尋址的
存儲(chǔ)器訪問(wèn)是針對(duì)1字節(jié)的字的
虛擬地址(線性地址)是14位長(zhǎng)的
物理地址是12位長(zhǎng)的
頁(yè)面大小是64字節(jié)
TLB是四路組相連的,總共有16個(gè)條目
L1 Cache是物理尋址、直接映射的,行大小為4字節(jié),總共有16個(gè)組
下面給出小存儲(chǔ)系統(tǒng)的一個(gè)快照,包括TLB、頁(yè)表的一部分和L1高速緩存
虛擬地址(TLBI為索引):
?
TLB:四組,16個(gè)條目,四路組相連(PPN為物理頁(yè)號(hào)):
?
頁(yè)表:只展示前16個(gè)頁(yè)表?xiàng)l目(PTE)
?
物理地址(CO為塊偏移):
?
高速緩存:16個(gè)組,4字節(jié)的塊,直接映射
?
基于以上的設(shè)定,我們來(lái)看下當(dāng)CPU執(zhí)行一條讀地址0x3d4(虛擬地址)處字節(jié)的加載指令時(shí)發(fā)生了什么:
從0x3d4中取出如下幾個(gè)字段:
TLBT: 0x03
TLBI: 0x03
VPN: 0x0F
VPO: 0x14
?
首先,MMU從虛擬地址中取出以上字段,然后檢查T(mén)LB,看它是否因?yàn)榍懊娴哪硞€(gè)存儲(chǔ)器的引用而緩存了PTE0x0F的一個(gè)拷貝。TLB從VPN中抽取出TLB索引(TLBI:0x03)和TLB標(biāo)記(TLBT:0x03),由上面的TLB表格可知,組0x3的第二個(gè)條目中有效匹配,所以命中,將緩存的PPN(0x0D)返回給MMU。
將上述的PPN(0x0D)和來(lái)自虛擬地址的VPO(0x14)連接起來(lái),得到物理地址(0x354)。
接下來(lái),MMU發(fā)送物理地址給緩存,緩存從物理地址中取出緩存偏移CO(0x0)、緩存組索引CI(0x5)以及緩存標(biāo)記CT(0x0D)。
從上面高速緩存表格中可得,組0x5中的標(biāo)記與CT相匹配,所以緩存檢測(cè)到一個(gè)命中,讀出在偏移量CO處的數(shù)據(jù)字節(jié)(0x36),并將它返回給MMU,隨后MMU將它傳遞回CPU。
?
評(píng)論
查看更多