Немаскируемое прерывание
Немаскируемое прерывание (англ. Non-Maskable Interrupt, NMI) — это тип аппаратного прерывания в компьютерных системах, которое не может быть заблокировано (замаскировано) программным обеспечением путём установки соответствующих флагов в регистре маскирования прерываний процессора. NMI предназначено для обработки критических событий, требующих немедленного внимания системы, независимо от текущего контекста выполнения. В отличие от обычных (маскируемых) прерываний, NMI имеет наивысший приоритет и обрабатывается процессором даже в тех случаях, когда другие прерывания временно отключены.
История
Концепция немаскируемых прерываний возникла на ранних этапах развития вычислительной техники, когда потребовался механизм для обработки неисправимых аппаратных ошибок и аварийных ситуаций. В первых микропроцессорах, таких как Intel 8080 (1974 год) и Zilog Z80 (1976 год), уже существовал отдельный вход для NMI. В архитектуре x86, начиная с процессора Intel 8086 (1978 год), NMI было реализовано как отдельный сигнал на шине управления, который генерирует прерывание с фиксированным номером (вектором) 2. В более поздних архитектурах, например ARM, также предусмотрены специальные линии для NMI, хотя реализация может отличаться.
Отличия от маскируемых прерываний
Основное отличие NMI от маскируемых прерываний (англ. Maskable Interrupt, MI) заключается в возможности программного управления их обработкой. Маскируемые прерывания могут быть временно отключены (замаскированы) путём установки флага IF (Interrupt Flag) в регистре флагов процессора в ноль. NMI, напротив, не подчиняется этому флагу и обрабатывается всегда, когда активен соответствующий сигнал на аппаратном входе. Это делает NMI пригодным для критических ситуаций, где задержка обработки может привести к потере данных или повреждению оборудования.
Причины возникновения NMI
NMI может генерироваться по различным причинам, которые зависят от архитектуры системы и её конфигурации. Наиболее распространённые источники:
- Аппаратные ошибки памяти: ошибки чётности (parity errors) или неисправимые ошибки ECC (Error-Correcting Code) в оперативной памяти.
- Сбои шины данных: ошибки при передаче данных по системной шине.
- Таймеры наблюдения (Watchdog timers) : срабатывание аппаратного таймера, который сигнализирует о зависании системы.
- Кнопка сброса или аварийного выключения: нажатие физической кнопки на корпусе компьютера или сервера.
- Ошибки питания: обнаружение критического падения напряжения или перегрева компонентов.
- Сигналы от контроллеров ввода-вывода: например, от контроллера прерываний (PIC или APIC) при возникновении неисправности.
Обработка NMI в процессорах x86
В архитектуре x86 NMI обрабатывается следующим образом:
- При получении сигнала NMI процессор завершает выполнение текущей инструкции.
- Сохраняет в стеке регистр флагов (EFLAGS), регистр CS (сегмент кода) и указатель инструкции (EIP/IP).
- Сбрасывает флаг IF (запрещая маскируемые прерывания) и очищает флаг TF (трассировка).
- Загружает адрес обработчика NMI из вектора прерывания 2 (таблица векторов прерываний IDT).
- Передаёт управление обработчику NMI.
Обработчик NMI должен быть максимально коротким и надёжным, так как во время его выполнения маскируемые прерывания отключены, а повторное NMI (если оно произойдёт до завершения обработки) может привести к неопределённому поведению. В современных системах, особенно в многопроцессорных конфигурациях, обработка NMI может быть сложнее из-за необходимости синхронизации между ядрами.
Применение NMI
NMI находит применение в следующих областях:
- Отладка и диагностика: в отладчиках ядра операционных систем (например, WinDbg или kdb) NMI используется для принудительного входа в отладчик при зависании системы. В Linux это реализовано через механизм NMI watchdog.
- Сброс системы (Reset): некоторые реализации кнопки сброса генерируют NMI, чтобы система могла корректно завершить критически важные операции перед перезагрузкой.
- Обработка ошибок памяти: в серверных системах с ECC-памятью NMI сигнализирует о неисправимых ошибках, что позволяет операционной системе сохранить данные и перезапуститься.
- Таймеры наблюдения: в промышленных и встраиваемых системах NMI от watchdog-таймера используется для аварийного сброса при зависании.
- Виртуализация: в гипервизорах (например, VMware ESXi, KVM) NMI может быть перехвачено для обработки ошибок гостевых систем.
Критика и ограничения
Несмотря на свою полезность, NMI имеет ряд недостатков. Во-первых, его обработка требует особой осторожности, так как вложенные NMI (когда новое NMI возникает до завершения обработки предыдущего) могут привести к неопределённому состоянию. Во-вторых, в многопроцессорных системах NMI может быть направлено на одно ядро, что создаёт проблемы с синхронизацией. В-третьих, злоумышленники могут использовать NMI для атак типа «отказ в обслуживании» (DoS) путём генерации ложных сигналов, если имеют физический доступ к оборудованию. В современных операционных системах, таких как Windows и Linux, существуют механизмы для ограничения воздействия NMI на пользовательские процессы, но полное устранение рисков невозможно.
Интересные факты
- В процессорах Intel 80486 и Pentium NMI могло быть вызвано ошибкой в работе кэш-памяти.
- В некоторых архитектурах, например в ARM Cortex-M, NMI имеет наивысший приоритет среди всех прерываний, включая системные исключения.
- В операционной системе Linux существует специальный драйвер nmi_watchdog, который использует NMI для обнаружения зависаний ядра.
- В ранних версиях BIOS (Basic Input/Output System) NMI могло быть вызвано ошибкой чётности на шине ISA, что приводило к синему экрану смерти (BSOD) в Windows.
Источники
- Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1.
- Tanenbaum, A. S. (2016). Modern Operating Systems (4th ed.). Pearson.
- Love, R. (2010). Linux Kernel Development (3rd ed.). Addison-Wesley.
- ARM Architecture Reference Manual, ARMv7-A and ARMv8-A editions.
- Microsoft Docs: «Non-Maskable Interrupts (NMI)» (Windows Hardware Developer Center).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →