日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(26)TLB

發(fā)布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (26)TLB 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、為什么需要TLB?TLB是什么?

TLB(Translation Lookaside Buffer)

當(dāng)程序訪問一個線性地址,需要先查PDPT,然后查PDT,然后查頁表PTT(一直沒搞懂第三個T是什么的縮寫),最后才是訪問物理頁。這期間多次訪問內(nèi)存,效率非常低。于是TLB就被設(shè)計(jì)出來了。

TLB 是CPU內(nèi)部的表,一個CPU有一張TLB表,用來緩存線性地址和物理地址的映射關(guān)系,以及屬性和訪問次數(shù)。

LA,PA是線性地址到物理地址的映射,LRU是最近最久未使用的意思,用來控制替換的優(yōu)先級,當(dāng)TLB表填滿了,就會根據(jù)LRU刪除優(yōu)先級低的項(xiàng),以騰出空間給其他項(xiàng)。ATTR是屬性,如果是10-10-12分頁,那么就是PDE和PTE的屬性邏輯與,如果是2-9-9-12分頁,那么就是PDPE,PDE,PTE的屬性邏輯與。

進(jìn)程切換時,CR3改變,TLB就會隨之刷新,這是因?yàn)橄嗤木€性地址通過不同的CR3會映射到不同的物理地址。

操作系統(tǒng)的高2G映射基本不變,如果Cr3改了,TLB刷新,重建高2G以上很浪費(fèi)。
所以PDE和PTE中有個G標(biāo)志位,如果G位為1刷新TLB時將不會刷新 PDE/PTE的
G位為1的頁,當(dāng)TLB滿了,根據(jù)統(tǒng)計(jì)信息將不常用的地址廢棄,最近最常用的保留.

二、TLB的種類

TLB在X86體系的CPU里的實(shí)際應(yīng)用最早是從Intel的486CPU開始的,在X86體系的CPU里邊,一般都設(shè)有如下4組TLB:

第一組:緩存一般頁表(4K字節(jié)頁面)的指令頁表緩存(Instruction-TLB);
第二組:緩存一般頁表(4K字節(jié)頁面)的數(shù)據(jù)頁表緩存(Data-TLB);
第三組:緩存大尺寸頁表(2M/4M字節(jié)頁面)的指令頁表緩存(Instruction-TLB);
第四組:緩存大尺寸頁表(2M/4M字節(jié)頁面)的數(shù)據(jù)頁表緩存(Instruction-TLB)

三、實(shí)驗(yàn)

體驗(yàn)TLB的存在

編寫程序,在R0給NULL掛一個物理頁,并寫入數(shù)據(jù),然后修改NULL的物理頁,然后讀NULL,發(fā)現(xiàn)讀取了之前寫入的值,這證明第二次訪問NULL的時候是從TLB中取的物理地址,證明了TLB的存在。

// TLB.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <windows.h>DWORD TempVal = 0;void __declspec(naked) R0Function() {__asm{pushadpushfd // 1.給NULL掛物理頁(修改PTE,這里概率藍(lán)屏)0x01234867(G=0) 0x01234967(G=1)mov dword ptr ds:[0xc0000000],0x01234867// 2.寫NULL指針,生成TLB記錄mov dword ptr ds:[0],0x12345678// 3.再次修改物理頁mov dword ptr ds:[0xc0000000],0x02345867// 4.讀NULL,發(fā)現(xiàn)讀了之前賦的值,證明了TLB的存在mov eax,dword ptr ds:[0]mov TempVal,eaxpopfdpopad iretd} }int _tmain(int argc, _TCHAR* argv[]) {printf("在IDT表構(gòu)建中斷門,請?jiān)趙indbg中執(zhí)行下面的指令:\n");printf("eq 8003f500 %04xee00`0008%04x\n",(DWORD)R0Function>>16,(DWORD)R0Function & 0x0000FFFF);getchar();__asm int 0x20printf("%08X\n", TempVal);getchar();return 0; }

全局頁的意義

G=1,即為全局頁,進(jìn)程(CR3)切換時,TLB中的記錄不會被刷新。
在上一個實(shí)驗(yàn)的基礎(chǔ)上修改,首先,我們在讀取NULL之前,切換一下CR3:

void __declspec(naked) R0Function() {__asm{pushadpushfd // 1.給NULL掛物理頁(修改PTE,這里概率藍(lán)屏)0x01234867(G=0) 0x01234967(G=1)mov dword ptr ds:[0xc0000000],0x01234867// 2.寫NULL指針,生成TLB記錄mov dword ptr ds:[0],0x12345678// 3.再次修改物理頁mov dword ptr ds:[0xc0000000],0x02345867// 模擬進(jìn)程切換mov eax,cr3mov cr3,eax// 4.讀NULL,未能讀取到 0x01234867,證明TLB已被刷新mov eax,dword ptr ds:[0]mov TempVal,eaxpopfdpopad iretd} }

實(shí)驗(yàn)結(jié)果證明,進(jìn)程切換會刷新G=0的TLB記錄。

接下來,修改代碼,讓NULL的PTE的G=1,即,NULL的物理頁是全局頁,再看看結(jié)果有什么不同:

void __declspec(naked) R0Function() {__asm{pushadpushfd // 1.給NULL掛物理頁(修改PTE,這里概率藍(lán)屏)0x01234867(G=0) 0x01234967(G=1)mov dword ptr ds:[0xc0000000],0x01234967// 2.寫NULL指針,生成TLB記錄mov dword ptr ds:[0],0x12345678// 3.再次修改物理頁mov dword ptr ds:[0xc0000000],0x02345867// 模擬進(jìn)程切換mov eax,cr3mov cr3,eax// 4.讀NULL,讀取到 0x01234867,證明G=1的物理頁不刷新TLBmov eax,dword ptr ds:[0]mov TempVal,eaxpopfdpopad iretd} }

實(shí)驗(yàn)結(jié)果證明G=1時,TLB不刷新。

INVLPG指令的意義

INVLPG 是特權(quán)指令,需要在R0執(zhí)行,作用是清除某個線性地址在TLB中的記錄。
在上面的代碼基礎(chǔ)上修改:

void __declspec(naked) R0Function() {__asm{pushadpushfd // 1.給NULL掛物理頁(修改PTE,這里概率藍(lán)屏)0x01234867(G=0) 0x01234967(G=1)mov dword ptr ds:[0xc0000000],0x01234967// 2.寫NULL指針,生成TLB記錄mov dword ptr ds:[0],0x12345678// 3.再次修改物理頁mov dword ptr ds:[0xc0000000],0x02345867// 手動刪除TLB記錄invlpg dword ptr ds:[0]// 模擬進(jìn)程切換mov eax,cr3mov cr3,eax// 4.讀NULL,讀取到 0x01234867,證明G=1的物理頁不刷新TLBmov eax,dword ptr ds:[0]mov TempVal,eaxpopfdpopad iretd} }

發(fā)現(xiàn)讀取不到先前寫入的數(shù)據(jù)了,這是因?yàn)門LB記錄被刪除了,需要重新解析線性地址,讀取到新物理頁的值了。

總結(jié)

以上是生活随笔為你收集整理的(26)TLB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。