-
-
有高手懂MiFlushTlb这个冲刷块表tlb中页表项的函数实现
-
发表于:
2012-4-14 18:11
5768
-
有高手懂MiFlushTlb这个冲刷块表tlb中页表项的函数实现
VOID
MiFlushTlb(PULONG Pt, PVOID Address)
{
#ifdef CONFIG_SMP
if (Pt)
{
MmUnmapPageTable(Pt);
}
if (KeNumberProcessors>1)
{
KeIpiGenericCall(MiFlushTlbIpiRoutine, Address);
}
else
{
MiFlushTlbIpiRoutine(Address);
}
#else
if ((Pt && MmUnmapPageTable(Pt)) || Address >= MmSystemRangeStart)
{
__invlpg(Address);
}
#endif
}
上面为什么是Address映射虚拟地址落在系统空间才可冲刷相应地址的块表tlb页表项,以及if前面这个条件为什么当Pt不为NULL或者MmUnmapPageTable(Pt)返回true才可冲刷Address对应的块表tlb中页表项,(为什么返回false不可以冲刷,为什么Pt为NULL不可以冲刷),明显下面这个MmUnmapPageTable(Pt)只有Pt为NULL或Pt这个地址在临时空间,并删除在临时空间中的映射才返回false
BOOLEAN MmUnmapPageTable(PULONG Pt)
{
if (Ke386Pae)
{
if ((PULONGLONG)Pt >= (PULONGLONG)PAGETABLE_MAP && (PULONGLONG)Pt < (PULONGLONG)PAGETABLE_MAP + 4*512*512)
{
return TRUE;
}
}
else
{
if (Pt >= (PULONG)PAGETABLE_MAP && Pt < (PULONG)PAGETABLE_MAP + 1024*1024)
{
return TRUE;
}
}
if (Pt)
{
MmDeleteHyperspaceMapping((PVOID)PAGE_ROUND_DOWN(Pt));
}
return FALSE;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)