我试图在处理器的单个内核上禁用包括NMI在内的所有中断,并使用针对自身的JMP指令(字节码0xEBFE
)将该内核置于无限循环中,并尝试了以下机器代码:
cli
in al, 0x70
mov bl, 0x80
or al, bl
out 0x70, al
jmp self (0xEBFE)
我假设禁用NMI中断也将禁用看门狗,因为根据this link,看门狗定时器是NMI中断,但是运行此代码时发生的情况是大约5秒钟后,我用代码0x101 { {3}}。我想知道Windows是否注意到我已禁用NMI中断,然后在启动内核崩溃之前重新启用它们。有谁知道如何在Windows 7中禁用看门狗计时器?
答案 0 :(得分:3)
我认为这里的NMI没有错。
外部NMI已过时,很难在SMP系统中进行路由。看门狗定时器也已过时,它是辅助PIT或主要PIT的有限第四通道:
----------P00440047-------------------------- PORT 0044-0047 - Microchannel - PROGRAMMABLE INTERVAL TIMER 2 SeeAlso: PORT 0040h,PORT 0048h 0044 RW PIT counter 3 (PS/2) used as fail-safe timer. generates an NMI on time out. for user generated NMI see at 0462. 0047 -W PIT control word register counter 3 (PS/2, EISA) bit 7-6 = 00 counter 3 select = 01 reserved = 10 reserved = 11 reserved bit 5-4 = 00 counter latch command counter 3 = 01 read/write counter bits 0-7 only = 1x reserved bit 3-0 = 00 ----------P0048004B-------------------------- PORT 0048-004B - EISA - PROGRAMMABLE INTERVAL TIMER 2 Note: this second timer is also supported by many Intel chipsets SeeAlso: PORT 0040h,PORT 0044h 0048 RW EISA PIT2 counter 3 (Watchdog Timer) 0049 ?? EISA 8254 timer 2, not used (counter 4) 004A RW EISA PIT2 counter 5 (CPU speed control) 004B -W EISA PIT2 control word
这些硬件不见了,在现代系统中不存在。我已经测试过机器了,但是没有。
英特尔芯片组没有它:
只有主要的PIT。
现代计时器是LAPIC计时器和HPET(Linux did even resort to using the PMC registers)。
Windows确实支持硬件WDT,实际上微软一直在定义ACPI扩展名:the WDAT table。
但是,该WDT只能以硬件方式重新引导或关闭系统,而无需软件的干预。
// Configures the watchdog hardware to perform a reboot // when it is fired. // #define WATCHDOG_ACTION_SET_REBOOT 0x11 // // Determines if the watchdog hardware is configured to perform // a system shutdown when fired. // #define WATCHDOG_ACTION_QUERY_SHUTDOWN 0x12 // // Configures the watchdog hardware to perform a system shutdown // when fired. // #define WATCHDOG_ACTION_SET_SHUTDOWN 0x13
Microsoft对此WDT的要求不高,因为必须在引导过程中尽早在PnP枚举(即PCI(e)枚举)之前对其进行设置。
这不是对系统进行错误检查的计时器。 顺便说一句,我没有这个计时器(我的系统缺少WDAT表),并且我不希望在客户端硬件上找到它。
错误检查0x101是由于软件WDT引起的,它在ntoskrnl.exe
中的函数内部引发。
KeUpdateRunTime
和从DriverEntry
开始的另一连串调用调用此函数:
根据Windows Internals, KeUpdateRunTime
is used to update the internal ticks counting of Windows。
我希望只由一个逻辑处理器负责,尽管我不确定Windows的运行时间到底有多精确。
我还希望该软件WDT以主从方式实现:每个CPU递增其自己的计数器,并且设计的CPU定期检查计数器(或任何等效的实现)。
0x101错误检查文档的措辞似乎暗示了这一点:
CLOCK_WATCHDOG_TIMEOUT错误检查的值为0x00000101。这表明在分配的时间间隔内未收到多处理器系统中辅助处理器上的预期时钟中断。
再次,我不是Windows的这一部分的专家(用户MdRm,可能是),这可能是完全错误的,但是如果不是这样,那么您最好听从Alex的建议并少启动一下逻辑CPU。
然后,您可以按照Intel手册中的描述,以INIT-SIPI-SIPI序列在该CPU上执行代码,但是您必须小心,因为签发的处理器正在使用分页,而尚未休眠的页面正在使用分页(处理器将实时启动。模式)。
初始化CPU可能有点麻烦,但毕竟不是太多。
窃取它可能会导致WDT以外的其他问题,例如,如果Windows仅将中断路由到该处理器。
我不知道是否有用于注销逻辑处理器的驱动程序API,我没有发现hal.dll和ntoskrnl.exe的导出。