Теперь у меня возникла проблема с Linux NMI Watchdog. Я хочу использовать сторожевой таймер Linux NMI для обнаружения и восстановления ОС. Поэтому я добавляю "nmi_watchdog = 1" в grub.cfg. А затем проверьте /proc/interrupt, NMI были вызваны в секунду. Но после того, как я загрузил модуль с тупиком (двойным приобретением спин-блокировки), система полностью зависала, и ничего не происходило (никогда не паникуйте!). Похоже, что наблюдатель nmi не работает!
Затем я прочитал Documantation/nmi_watchdog.txt, в нем говорится:
Помните, что при использовании локального APIC частота прерываний NMI он генерирует, зависит от нагрузки системы. Местный сторожевой тайник APIC NMI, не имея лучшего источника, использует событие цикл unhalted.
Что означает событие цикл unhalted?
Он добавил
но если ваша система блокирует что-либо, кроме процессора "hlt" инструкции, сторожевой таймер будет запускаться очень скоро, как "циклы" unhalted "будет происходить каждый такт... Если он блокируется "hlt" , тогда вам не повезло - это событие не произойдет вообще и сторожевой таймер не будет.
Похоже, что сторожевой таймер не будет запускаться, если процессор выполнит команду "hlt" , затем я ищу "hlt" в "Руководстве разработчика Intel 64 и IA-32 для разработчиков архитектуры, глава 2A", он описывает следующее:
Прекращает выполнение команд и помещает процессор в состояние HALT. Включенное прерывание (включая NMI и SMI), исключение отладки, BINIT #, сигнал INIT # или сигнал RESET # возобновитьвыполнение.
Тогда я потерял...
Мой вопрос:
- Как работает ли Linux nm-сторожевой таймер?
- Кто запускает nmi?
Моя ОС - Ubuntn 10.04 LTS, Linux-2.6.32.21, CPU Pentium 4 с двумя ядрами 3,20 ГГц.
Я не читал весь исходный код о nmi watchdog (нет времени), если я не мог понять, как работает nmi watchdog, я хочу использовать прерывание счетчика контроля производительности и прерывание между процессорами (предоставляется APIC), чтобы отправьте NMI вместо nmi watchdog.
Может кто-нибудь мне помочь? Спасибо.