Действительно ли необходимо блокировать всю память, которая может быть затронута обработчиком прерываний?
Каждый ресурс, который я читаю о DPMI и прерываниях, говорит, что вся память (код / данные / стек), которая может быть использована в обработчике прерываний, должна быть заблокирована (или закреплена), чтобы гарантировать, что она не будет выгружена. Идея заключается в том, что, когда в обработчике прерывания возникает сбой страницы, вы получите двойную ошибку, и ваша программа потерпит крах.
Но так ли это на самом деле? Я полагаю, что двойной сбой может произойти в тот момент, когда происходит прерывание, и процессор пытается перейти к вашему обработчику прерываний, но код оказывается выгруженным. Как только ваш код ISR уже запущен, я не вижу, как сбой страницы может привести к катастрофе. Чем отличается контекст прерывания от обычного контекста программы?
В качестве быстрого теста я написал простой таймер ISR, который выделяет некоторую память char* ptr = new char[1024*1024]
, а затем сразу же отбрасывает указатель. Работая под CWSDPMI с включенной подкачкой, через некоторое время происходит сбой, но только потому, что new
бросает std::bad_alloc
исключение. Никаких двойных ошибок, насколько я могу судить.
Возможно, если прерывание происходит во время выполнения дискового ввода-вывода (в середине int 21), и обработчик ошибок страницы снова вызывает int 21, это может вызвать проблемы. Но тогда это не имеет ничего общего с двойными ошибками. И потом я не думаю, что обработчик прерываний защищенного режима мог бы быть вызван во время int 21, так или иначе.
Действительно ли запертая память так важна?