第一部分:KiLog2MaximumIncrement的由來
?????? i = 1;
??????? j = KeMaximumIncrement;
??????? while ((1UI64<<i) <= KeMaximumIncrement) {
??????????? i++;
??????? }
??????? KiLog2MaximumIncrement = i;
2^17=131072
2^18=262144
i=18=KiLog2MaximumIncrement
中斷多久觸發一次? 使用windbg進入內核態,使用nt!KeMaximumIncrement命令查看看它的值 nt!KeMaximumIncrement=2625a=156250
注意,單位為100ns,因此156250*100/1000/1000=15.625ms
第二部分:KiMaximumIncrementReciprocal的由來
??????? Temp1 = 1UI64 << (KiLog2MaximumIncrement + 32);
??????? Temp1 /= KeMaximumIncrement;
??????? Temp1 -= 1UI64<<32;
??????? Temp1 += 1;
??????? KiMaximumIncrementReciprocal = (ULONG) Temp1;
??????? KeTimerReductionModulus = KeMaximumIncrement * TIMER_TABLE_SIZE;
??????? ASSERT ((KeTimerReductionModulus / TIMER_TABLE_SIZE) == KeMaximumIncrement);
??????? Temp1 = 1UI64<<32;
??????? Temp1 %= KeTimerReductionModulus;
??????? KiUpperModMul = (ULONG) Temp1;
4000000000000(十六進制) = 1125899906842624(十進制)
1125899906842624/156250=7205759403
100000000(十六進制) = 4294967296(十進制)
7205759403-4294967296=2910792107
2910792107+1=2910792108
2910792108(十進制) = AD7F29AC(十六進制)