如何关闭CPU的缓存系统,使得所有的内存都是不可缓存(UC)类型?
分以下三步:
1.将CR0寄存器的CD位和NE位分别置1和清0;
2.使用WBINVD指令使所有已缓存的数据无效,并且将所有回写(WB)类型的内存缓存写回内存;
3.通过修改MTRR控制MSR寄存器禁用MTRR使所有内存的默认类型为不可缓存类型(UC)
上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | VOID InitCallFramework( int iCpuNum)
{
KAFFINITY cpugrop = 1 ;
KIRQL irq;
for ( int i = 0 ; i < iCpuNum; + + i)
{
cpugrop = (i = = 0 ) ? 1 : cpugrop << 1 ;
KeSetSystemAffinityThreadEx(cpugrop);
irq = KeRaiseIrqlToDpcLevel();
DisableMTRR();
KeLowerIrql(irq);
}
return ;
}
VOID Unload(PDRIVER_OBJECT obj)
{
DbgPrint( "Unload!\n" );
}
VOID UnloadEx(PDRIVER_OBJECT obj)
{
DbgPrint( "Unload!\n" );
}
NTSTATUS DriverEntry(PDRIVER_OBJECT obj, PUNICODE_STRING str )
{
ULONG CpuNum = 8 ; / / CPU物理核心数量
InitCallFramework(CpuNum);
obj - >DriverUnload = Unload;
return STATUS_SUCCESS;
}
|
以下是DisableMTRR函数的具体实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | .code
DisableMTRR proc
cli;
mov rax,cr0;
or rax, 040000000h ;;CD置 1
and rax, 0dfffffffh ;;NW置 0
mov cr0,rax;
mov rax,cr4;
and rax, 0ffffffffffffff7fh ;
mov cr4,rax;
wbinvd;
mov ecx, 02ffh ;
xor edx,edx;
mov eax, 0400h ;
wrmsr;
wbinvd;
sti
ret
DisableMTRR endp
end
|
最后再说明一点,不要在VMawre里试验以上程序,因为VMware没有真正使用CPU缓存系统,在真机上试验才会看到效果。可以看到运行完运行完代码后电脑会得很卡,是非常卡哦!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课