- 清空没有标记G(PTE中)的所有TLB项
__asm{
mov eax,cr3
mov cr3,eax
}
- 强行更新TLB项,无视G位
__asm invlpg ds:[0x405000]
由于我们直接在
section
声明中同时标识execute
和write
无法通过编译,我们使用go()
函数中强制执行数据页中指令的方式(当作函数执行)来使页有执行属性。因为WindowsXP中DEP只是针对系统服务和内核,对RING3没有作用,所以这样的做法是有效的。CPU流水线
指令TLB(iTLB)和数据TLB(dTLB)
当页属性有执行权限的时候,由于CPU取指令和执行指令并行流水线执行,导致可能把数据放到指令TLB中,由于指令TLB和数据TLB的某种关系(不清楚),当取指令执行的时候,还是会使用指令TLB中缓存的PTE等数据,而不会访问页中真正的PTE。