Page table, TLB, Cache簡介(x86),tlbx86
分頁模型
以x86為例, intel的處理器的分頁單元處理4kB的頁, 32位的線性地址(虛擬位址)被分為3個域: -Directory, 目錄, 最高10位 -Table, 頁表, 中間10位 -Offset, 位移, 低12位 -正在使用的頁目錄的地址放在控制寄存器CR3中, directory欄位決定頁目錄中的目錄項, 而table則指向適當的頁表項, 該頁表項包含有所指向頁框的物理地址,
而offset則決定頁框內的具體地址.
-地址位(31-12)。指向頁目錄項/頁表項/頁的基地址。 -P(0)——存在位(Present)。表示該頁表或頁目錄在、或不在實體儲存體器中。為0表示不再主存中。
如果對某個虛擬位址執行轉換是所需要的頁目錄項或者頁表項中的P位為0,則分頁單元就將該虛擬位址放入到控制寄存器CR2中那個,併產生缺頁異常。 -R/W(1)——讀/寫位(Read/Write)。指明頁面是可讀可寫,還是唯讀。但是,R/W位對頁的防寫保護只在處理器處於使用者特權級時發揮作用。
當處理器處於系統特權級時,R/W位被忽略,即總可以讀、寫或執行。 -U/S(2)——使用者/管理員位(User/Supervisor)。指明頁面為使用者層(特權層3)和管理員層的程式均能使用,僅還是能由管理員層(特權層0~2)的程式使用。 -PWT(3)——頁直寫位(Page-level Write Through)。控制使用直寫還是回寫的快取寫入策略。 -PCD(4)——頁快取禁止位(Page-level Cache Disable)。控制禁止還是使用快取。 -A(5)——訪問位(Accessed)。當頁表或頁面進行讀或寫操作後,處理器將該位置位。處理器一旦置位該位不再清除它,只有軟體可以得其複位。 -D(6)——髒位。只用於頁表項,當對所涉及的頁面進行寫操作時,頁表項的D位被置位。類似訪問位,只有軟體可以複位。 -PS(7)——只用於頁目錄項,如果為1,表示頁目錄項指向的是2MB/4MB的頁框。 -PAT(7)——(Pentium III processor) 選擇一個PAT(page attribue table) 項,和PCD PWT 一起選擇一個PAT表項,進而選擇這個page的記憶體類型。 -G(8)——(Pentium Pro開始引入)置1代表是一個全域頁。可以防止常用頁從TLB中重新整理出去。只有在CR4中的page global entry(PGE)標誌置位時才起作用。 -AVL(D9~D11)——作業系統專用位(Available for system’s programmer use)。
-分頁單元首先將線性地址的高20位與TLB中所有的32項相比較。
•如果有一個地址匹配(即TLB命中),就直接得到了頁面的基地址,只要加上線性地址的低12位位移量,就計算出32位物理地址。
•如果沒有地址匹配,處理器將進行2級查表過程。同時,從頁表中讀到的高20位線性地址被存入TLB中。
TLB
-TLB (translation look-aside buffer), 其實就是一塊buffer, 緩衝了記憶體中的頁表項, 以加快虛擬位址到物理地址的轉換速度.
如果沒有TLB, 則每次取資料都需要兩次訪存(查頁表獲得物理地址+取資料) .
32位地址劃分及cache
Memory address被劃分為3部分: tag, index和block offset.
-Index對應cache row, tag對應記憶體位址的最高位, block offset表示需要的資料在某個cache row中的data block中的位置. -Index的長度=log2(cache rows) -Block offset的長度=log2(bytes_per_data_block), 4K為頁的話就是12
-Tag的長度=32 – index – block offset -以 32KB ,4 路組相聯,行大小為 16Bytes 的 Cache 為例,正常工作時其對地址的劃分如下所示: -Cache 以行大小(Line size)為單位分成若干個行。行 (Line) 是 Cache 的資料存放區和嵌入式管理單元。一個典型的 Cache 行結構為:
-其由 Tag 域、Status 域和資料域組成, -Tag 域存放該行資料對應地址的高位。CPU 在索引後,用相應地址與組內所有行的Tag 相比較,以之區分具體的行。 -資料域能容納的位元組數是為行大小 (Line Size),其為 Cache 與記憶體之間資料交換的單位。 -Status 域則為一些控制位資訊(如Valid, Lock 以及Parity check位等等),不同的Cache 類型,不同的Cache實現Status域稍有不同。 -以32KB 的4路組相聯,行大小為 16Bytes的Cache為例的話,有 32*1024/(16 * 4)= 512 組 -CPU 訪問組相聯 Cache 時,就先用index索引到組,然後組內同時匹配 Tag,進行路選。