· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Прерывание и переполнение стека

Посл.отвђт Сообщенiе


Дата: Мар 31, 2004 17:49:57 · Поправил: captain cobalt

Перечитываю сейчас в N+1 раз мануалы интела.
И в очередной раз вижу, что все прерывания и исключения делятся
на 3 категории: benign, contributory и page fault.
Аппаратные прерывания принадлежат категории benign.
Далее видим таблицу, что если при попытке вызвать
обработчик benign прерывания возникает исключение,то они
обрабатываются последовательно (не происходит Double Fault)

Представим ситуацию. Код у нас выполняется на нулевом
уровне привилегий (например, ядро операционной системы).
И в какой то момент он доходит до состояния, в котором
стек полностью заполнен - если попытаться туда что-либо
положить, произойдет переполнение стека. И вот в этот момент
происходит аппаратное прерывание. Пусть обработчик прерывания
вызывается не через task gate. Тогда, так как весь код находится
на нулевом уровне, переключения стека не происходит. Процессор
пытается записать в стек контекст. У него это не получается.
Стек переполняется. Происходит исключение. Опять некуда записывать.

В сооответствии с теорией, процессор имеет возможность обработать
аппаратное прерывание и переполнение стека последовательно.
И вот вопрос в том, как он сможет это сделать, если не удалось
сохранить второй контекст? Тот модуль ядра операционной системы,
который обращается со стеком подобным образом, нас не интересует,
мы ему по голове надаём. Но вот аппаратное прерывание хотелось бы
"не потерять". Можно ли сделать это надежным способом?


Дата: Мар 31, 2004 18:12:14

Ну вызвать обработчик #SS через TaskGate например.


Дата: Мар 31, 2004 18:14:04

В смысле он там должен лежать всегда.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075