我正在尝试禁用所有中断,包括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 CLOCK_WATCHDOG_TIMEOUT进行了错误检查。我想知道Windows是否注意到我已禁用NMI中断,然后在启动内核崩溃之前重新启用它们。有谁知道如何在Windows 7中禁用看门狗定时器?
我不认为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确实支持HW 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
微软对此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启动。 然后,您可以使用英特尔手册中所述的INIT-SIPI-SIPI序列在该CPU上执行代码,但是您必须小心,因为发布处理器正在使用分页,而休眠处理器尚未处理(处理器将以实时方式启动)模式)。
初始化CPU可能有点麻烦,但毕竟不是太多。 窃取它可能会导致除WDT之外的其他问题,例如,如果Windows仅向该处理器发送了中断。
我不知道是否有取消注册逻辑处理器的驱动程序API,我发现没有看到hal.dll和ntoskrnl.exe的导出。