如何关闭CPU的缓存系统,使得所有的内存都是不可缓存(UC)类型?分以下三步:1.将CR0寄存器的CD位和NE位分别置1和清0;2.使用WBINVD指令使所有已缓存的数据无效,并且将所有回写(WB)类型的内存缓存写回内存;3.通过修改MTRR控制MSR寄存器禁用MTRR使所有内存的默认类型为不可缓存类型(UC)
上代码
#include<ntifs.h>
#include<intrin.h>
#include"core.h"
VOID InitCallFramework(
int
iCpuNum)
{
KAFFINITY cpugrop
=
1
;
KIRQL irq;
for
(
i
0
; i < iCpuNum;
+
i)
cpugrop
(i
) ?
: cpugrop <<
KeSetSystemAffinityThreadEx(cpugrop);
irq
KeRaiseIrqlToDpcLevel();
DisableMTRR();
KeLowerIrql(irq);
}
return
VOID Unload(PDRIVER_OBJECT obj)
DbgPrint(
"Unload!\n"
);
VOID UnloadEx(PDRIVER_OBJECT obj)
NTSTATUS DriverEntry(PDRIVER_OBJECT obj, PUNICODE_STRING
str
)
ULONG CpuNum
8
/
CPU物理核心数量
InitCallFramework(CpuNum);
obj
-
>DriverUnload
Unload;
STATUS_SUCCESS;
以下是DisableMTRR函数的具体实现:
.code
DisableMTRR proc
cli;
mov rax,cr0;
or
rax,
040000000h
;;CD置
and
0dfffffffh
;;NW置
mov cr0,rax;
mov rax,cr4;
0ffffffffffffff7fh
mov cr4,rax;
wbinvd;
mov ecx,
02ffh
xor edx,edx;
mov eax,
0400h
wrmsr;
sti
ret
DisableMTRR endp
end
最后再说明一点,不要在VMawre里试验以上程序,因为VMware没有真正使用CPU缓存系统,在真机上试验才会看到效果。可以看到运行完运行完代码后电脑会得很卡,是非常卡哦!
[注意]看雪招聘,专注安全领域的专业人才平台!