Могу ли я отключить сторожевой таймер в Windows 7?

#windows #assembly #x86-64 #watchdog

#Windows #сборка #x86-64 #сторожевой таймер

Вопрос:

Я пытаюсь отключить все прерывания, включая 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. Я не могу придумать ни одной веской причины для этого.

2. @Джошуа: высокоточный микро-бенчмаркинг является очевидным вариантом использования для отключения сторожевого таймера. Но тогда выполнение пустого бесконечного цикла кажется бессмысленным, согласен.

3. Теоретически можно было бы загружать Windows на меньшем количестве процессоров, чем имеется в системе (конфигурация системы-> загрузка-> дополнительные параметры), но тогда нужно было бы загружать остальные процессоры вручную.

4. @AlexeyFrunze Я уже сделал это, я пытаюсь узнать больше о внутренних компонентах моего оборудования, и в этом суть того, почему я это делаю.

5. И каковы результаты этого, если таковые имеются?

Ответ №1:

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

Нет вторичной ямы

Существует только первичный PIT.

Современными таймерами являются таймер LAPIC и HPET (Linux даже прибегал к использованию регистров PMC).


Windows поддерживает HW WDT, фактически 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 :

внешние ссылки wdt

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

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

Похоже, это следует из формулировки документации по проверке ошибок 0x101:

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

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

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

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