0.地址剖析
当指令 MOV DWORD PTR DS:[0x12345678]指令执行时:
在10-10-12分页模式下必要查找PDE PTE再通过物理页加页内偏移读取数据(4byte + 4Byte + 读取大小)
在2-9-9-12分页模式下必要查找PDPE PDE PTE再通过物理页加业内偏移读取数据(8Byte + 8Byte + 8Byte + 读取大小)
这两种情况都是不涉及跨页如果读取时发生跨页剖析会更繁琐耗时更多,为了提高服从,CPU内部做了一个表TLB(translation lookaside buffer).A processor may cache information about the translation of linear addresses in translation lookaside buffers(TLBs).
1.TLB布局
LA(线性地址)PA(物理地址)ATTR(属性)LRU(统计)......1).Linear address
Segment.Base + offset 为线性地址
2).Physical address
通过对应分页方式剖析得到物理地址
3).Attribute(属性)
10-10-12分页模式下属性为PDE AND PTE
2-9-9-12分页模式下属性为PDPTE AND PDE AND PTE
4).TLB革新规则
只要Cr3变了,TLB立马革新,一核一套TLB.
操作体系的高2G映射根本不变,如果Cr3改了,TLB革新 重建高2G以上很浪费.
所以PDE和PTE中有个G标志位,如果G位为1革新TLB时将不会革新.
PDE/PTE的G位为1的页,当TLB满了,根据统计信息将不常用的地址废弃,近来最常用的保留.
通过Windbg查看GDT.Base对应属性:
1).!pte 指令
2).!vtop 指令
2.TLB种类
TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,在X86体系的CPU里边,一样平常都设有如下4组TLB:第一组:缓存一样平常页表(4K字节页面)的指令页表缓存(Instruction-TLB);第二组:缓存一样平常页表(4K字节页面)的数据页表缓存(Data-TLB);第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Data-TLB)3.代码示例
3.1 感受TLB存在
#include #include DWORD dwData = 0;_declspec(naked) VOID TEST(){ __asm { //0线性地址挂PTE //G = 0 非全局页 mov dword ptr ds:[0xC0000000],0x1234867; //0线性地址赋值 mov dword ptr ds:[0], 0x12345678; //更改CR3 革新除全局页以外的缓存 mov eax, cr3 mov cr3, eax //更改0线性地址PTE 不是全局页不革新TLB情况数据不会革新 mov dword ptr ds:[0xC0000000], 0x2345867; //变量赋值 mov eax, dword ptr ds:[0] mov DWORD ptr ds:[dwData], eax iretd }}int main(){ printf("INTERRUPT ADDR [0x%08x] \n",TEST); system("Pause"); __asm { int 0x20 } printf("DATA [0x%08x] \n",dwData); system("Pause"); return 0;}未进行切换CR3时:
进行切换CR3后:
3.2 体验全局页
#include #include DWORD dwData = 0;_declspec(naked) VOID TEST(){ __asm { //0线性地址挂PTE //G = 1 全局页 mov dword ptr ds:[0xC0000000],0x1234967; //0线性地址赋值 mov dword ptr ds:[0], 0x12345678; //更改CR3 革新除全局页以外的缓存 mov eax, cr3 mov cr3, eax //更改0线性地址PTE 不是全局页不革新TLB情况数据不会革新 mov dword ptr ds:[0xC0000000], 0x2345867; //变量赋值 mov eax, dword ptr ds:[0] mov DWORD ptr ds:[dwData], eax iretd }}int main(){ printf("INTERRUPT ADDR [0x%08x] \n",TEST); system("Pause"); __asm { int 0x20 } printf("DATA [0x%08x] \n",dwData); system("Pause"); return 0;}
3.3 通过INVLPG指令革新全局页
#include #include DWORD dwData = 0;_declspec(naked) VOID TEST(){ __asm { //0线性地址挂PTE //G = 1 全局页 mov dword ptr ds:[0xC0000000],0x1234967; //0线性地址赋值 mov dword ptr ds:[0], 0x12345678; //INVLPG 革新缓存 INVLPG dword ptr ds:[0] //更改CR3 革新除全局页以外的缓存 mov eax, cr3 mov cr3, eax //更改0线性地址PTE 不是全局页不革新TLB情况数据不会革新 mov dword ptr ds:[0xC0000000], 0x2345867; //变量赋值 mov eax, dword ptr ds:[0] mov DWORD ptr ds:[dwData], eax iretd }}int main(){ printf("INTERRUPT ADDR [0x%08x] \n",TEST); system("Pause"); __asm { int 0x20 } printf("DATA [0x%08x] \n",dwData); system("Pause"); return 0;}
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |