Могу ли я отключить сторожевой таймер в Windows 7? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь отключить все прерывания, включая NMI на одном ядре процессора, и поместить это ядро ​​в бесконечный цикл с нацеливанием самой инструкции JMP (байт-код 0xEBFE). Я попытался сделать это с помощью следующего машинного кода:

cli
in al, 0x70
mov bl, 0x80
or al, bl
out 0x70, al
jmp self (0xEBFE)

Я предполагал, что отключение прерываний NMI также приведет к отключению сторожевого таймера, поскольку согласно этой ссылке сторожевой таймер является прерыванием NMI, но то, что произошло, когда я запустил этот код, произошло примерно через 5 секунд, когда мой компьютер проверил ошибку код 0x101 CLOCK_WATCHDOG_TIMEOUT . Мне интересно, замечает ли Windows, что я отключил прерывания NMI, а затем снова включил их, прежде чем инициировать панику ядра. Кто-нибудь знает как отключить сторожевой таймер в windows 7?

1 Ответ

3 голосов
/ 29 марта 2019

Я не думаю, что здесь виноваты 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

Есть толькоосновной 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

В соответствии с Windows Internals, KeUpdateRunTime используется для обновления внутреннего подсчета тиков Windows .
Я бы ожидал, что будет назначен только один логический процессориз этого, хотя я не уверен, как именно Windows экономит время.

Я бы также ожидал, что этот программный WDT будет реализован в режиме «ведущий-ведомый»: каждый ЦП увеличивает свой счетчик, а разработанный ЦП периодически проверяет счетчики (или любую эквивалентную реализацию).

Это, как представляется, предлагается в формулировке документации о проверке ошибок 0x101:

Проверка ошибок CLOCK_WATCHDOG_TIMEOUT имеет значение 0x00000101.Это указывает на то, что ожидаемое тактовое прерывание на вторичном процессоре в многопроцессорной системе не было получено в выделенном интервале.

Опять же, я не экспертв этой части Windows (пользователь MdRm, вероятно, есть), и это может быть совершенно неправильно, но если это не так, то вам, вероятно, лучше последовать совету Алекса и загрузиться с одним менее логичным процессором.
Затем можно выполнить кодна этом процессоре с последовательностью INIT-SIPI-SIPI, как описано в руководстве Intel, но вы должны быть осторожны, поскольку выдающий процессор использует подкачку, а спящий еще не работает (процессор запускается в реальном режиме).

Инициализация ЦП может быть немного громоздкой, но, в конце концов, не слишком большой.
Кража может привести к другим проблемам, помимо WDT, например, если Windows перенаправила прерывание только этому процессору.

Я не знаю, есть ли API драйвера для отмены регистрации логического процессора, я ничего не нашел, просматривая экспорт hal.dll и ntoskrnl.exe.

...