Введение

В вычислительной технике, не маскируемый прерыватель (NMI) – это аппаратный прерыватель, который стандартные методы маскировки прерываний в системе не могут игнорировать. Он обычно возникает для сигнализации о неисправимых аппаратных ошибках. Некоторые NMI могут быть замаскированы, но только с использованием проприетарных методов, специфичных для данного NMI. В отношении SPARC, не маскируемый прерыватель (NMI), несмотря на то, что имеет наивысший приоритет среди прерываний, может быть предотвращен с помощью маски прерываний. NMI часто используется, когда критично время отклика или когда прерывание не должно быть отключено во время нормальной работы системы. К таким областям применения относятся сообщение о неисправимых аппаратных ошибках, отладка и профилирование системы, а также обработка специальных случаев, таких как сброс системы. Современные компьютерные архитектуры обычно используют NMI для обработки неисправимых ошибок, требующих немедленного внимания. Поэтому такие прерывания не следует маскировать при нормальной работе системы. Эти ошибки включают неисправимые ошибки внутренних системных чипсетов, повреждение системной памяти, например, ошибки четности и ECC, а также повреждение данных, обнаруженное на системных и периферийных шинах. На некоторых системах пользователь компьютера может инициировать NMI через аппаратные и программные интерфейсы отладки и кнопки сброса системы. Программисты обычно используют отладочные NMI для диагностики и исправления некорректного кода. В таких случаях NMI может выполнить обработчик прерывания, который передает управление специальной программе-монитору. Из этой программы разработчик может проверить память машины и изучить внутреннее состояние программы в момент прерывания. Это также позволяет отлаживать или диагностировать компьютеры, которые кажутся зависшими.

История

В более старых архитектурах NMIs использовались для прерываний, которые обычно никогда не отключались из-за требуемого времени отклика. Это были скрытые сигналы. Примерами служат контроллер дисковода на Amstrad PCW, сопроцессор 8087 на x86 при использовании в IBM PC или его совместимых (хотя Intel рекомендовал подключать его к обычному прерыванию), и индикатор низкого заряда батареи на HP 95LX. В оригинальном IBM PC, NMI вызывался при обнаружении ошибки четности в системной памяти или при сообщении об этом внешним устройством. В любом случае, компьютер отображал сообщение об ошибке и останавливался. Некоторые более поздние клоны ПК использовали NMI для маскировки аппаратных различий от стандартного ПК. На таких компьютерах NMI генерировался при попытке программы получить доступ к несовместимому оборудованию. Обработчик прерываний BIOS затем преобразовывал запрос программы, чтобы он соответствовал фактически установленному оборудованию. SMM в 386SL – более подходящий способ для этого. Некоторые 8-битные домашние компьютеры использовали линию NMI для выполнения "тёплого перезапуска", если система зависла. Обычно это восстанавливало регистры управления до известных надёжных значений, хранящихся в ПЗУ, не уничтожая данные, которые пользователь мог загрузить. На 8-битных компьютерах Commodore клавиша подключалась напрямую или косвенно к линии NMI процессора серии 6502, но сброс происходил только в том случае, если подпрограмма обработки NMI в ПЗУ обнаруживала, что она также удерживается при нажатии (эта комбинация была версией "салюта тремя пальцами" от Commodore). Commodore также подключил MOS Technology 6526 CIA #2 в C64 и C128 к линии NMI процессора, что являлось частью механизма программной эмуляции 6551 ACIA. В 8-битных линейках Atari для той же цели использовалась кнопка. Отладочные NMI появлялись в различных формах, включая "кнопку программиста" Apple Macintosh и определённые комбинации клавиш на рабочих станциях Sun. С появлением Windows 2000 Microsoft разрешила использовать NMI для принудительного перехода системы в отладчик или для сброса содержимого памяти на диск и перезагрузки. Отладочные NMI также использовались устройствами, позволяющими обычным пользователям и геймерам манипулировать работающими программами. Устройства, добавляющие кнопку для генерации NMI, такие как Multiface от Romantic Robot, были популярным аксессуаром для 8-битных и 16-битных домашних компьютеров 1980-х годов. Эти периферийные устройства имели небольшой объем ПЗУ и кнопку NMI. Нажатие кнопки передавало управление программному обеспечению в ПЗУ периферийного устройства, позволяя сохранить приостановленную программу на диск (особенно полезно для игр на кассетах без поддержки дисков, но также для сохранения игр в процессе), сохранить или распечатать скриншоты или изменить значения в памяти – например, для читерства и получения дополнительных жизней. Не все компьютеры предоставляют механизм для вызова NMI; однако многие машины (обычно серверы в стойке) имеют физическую кнопку, предназначенную специально для этой цели. Другие машины могут предоставлять эту функциональность через плату расширения. Продукты DISCiPLE и +D от Miles Gordon Technology для ZX Spectrum имели NMI-генерирующую "волшебную кнопку". На Nintendo Entertainment System NMI генерируется во время каждого интервала вертикального прохода. Поскольку эти NMI (часто называемые "vblank-прерываниями") происходят часто и регулярно, код, манипулирующий игровой графикой и звуком, часто выполняется внутри подпрограммы обработки NMI. Очистка 7-го бита регистра PPU отключает vblank-прерывания, а установка его – включает.