Я не думаю, что здесь виноваты 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
Это оборудование отсутствует, его нет в современных системах.Я проверил свою машину, и у меня ее нет.
У чипсетов Intel ее нет:
![No secondary PIT](https://i.stack.imgur.com/MQA7R.png)
Есть толькоосновной PIT.
Современные таймеры - это таймер LAPIC и HPET (Linux даже прибегает к использованию регистров PMC ).
Windows поддерживает HWWDT, на самом деле Microsoft пошла так долго, как определение расширения ACPI: таблица WDAT .
Однако этот 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
:
![xrefs of wdt](https://i.stack.imgur.com/kEOXR.png)
В соответствии с Windows Internals, KeUpdateRunTime
используется для обновления внутреннего подсчета тиков Windows .
Я бы ожидал, что будет назначен только один логический процессориз этого, хотя я не уверен, как именно Windows экономит время.
Я бы также ожидал, что этот программный WDT будет реализован в режиме «ведущий-ведомый»: каждый ЦП увеличивает свой счетчик, а разработанный ЦП периодически проверяет счетчики (или любую эквивалентную реализацию).
Это, как представляется, предлагается в формулировке документации о проверке ошибок 0x101:
Проверка ошибок CLOCK_WATCHDOG_TIMEOUT имеет значение 0x00000101.Это указывает на то, что ожидаемое тактовое прерывание на вторичном процессоре в многопроцессорной системе не было получено в выделенном интервале.
Опять же, я не экспертв этой части Windows (пользователь MdRm, вероятно, есть), и это может быть совершенно неправильно, но если это не так, то вам, вероятно, лучше последовать совету Алекса и загрузиться с одним менее логичным процессором.
Затем можно выполнить кодна этом процессоре с последовательностью INIT-SIPI-SIPI, как описано в руководстве Intel, но вы должны быть осторожны, поскольку выдающий процессор использует подкачку, а спящий еще не работает (процессор запускается в реальном режиме).
Инициализация ЦП может быть немного громоздкой, но, в конце концов, не слишком большой.
Кража может привести к другим проблемам, помимо WDT, например, если Windows перенаправила прерывание только этому процессору.
Я не знаю, есть ли API драйвера для отмены регистрации логического процессора, я ничего не нашел, просматривая экспорт hal.dll и ntoskrnl.exe.