Переключение стека


При создании программы автоматически создается 4 стека. Переключение стека происходит при передаче контроля к более привилегированному неконфорному сегменту. Каждая задача при старте инициализирует до 4 стеков для каждого уровня привилегий, который располагается в разных сегментах, и каждый имеет свой селектор и смещение. В регистре SS E и SP загружаются логические адреса стека 3-го уровня. Адреса оставшихся стеков загружены в дескриптор состояния задачи. При изменении уровня привилегий и необходимости переключения стеков происходит набор операций:

Используя новый текущий уровень привилегий из дескриптора состояния задачи выбирается адрес нового сегмента стека.

Данный стек проверяется на наличие необходимого адресного пространства. Проверяется тип дескриптора сегмента стека и др. привилегий. Сохранение SS и ESP (временно). Новые значения адреса стека помешаются в SS и ESP.

2 стека:

Переключение стека

Заносим старые SS и ESP. Заносим параметры, которые передаются этой процедуре (А,В,С). Заносится точка возврата. Устанавливается новое значение регистров CS и EIP. Возврат из процедуры завершение командой RET. Проверка RPL сохраненного регистра CS. Загрузка CS и EIP из стека в регистры CS и EIP. При загрузке проверяется тип (является ли сегмент кодовым) и уровень привилегий. Если произошло переключение стека и происходит очистка параметров, то происходит увеличение ESP. Загружаются старые значения SS EIP, и уничтожаются текущие значения регистров SS и ESP, уровня 0. Изменяется значение ESP. Проверяются уровни привилегий всех сегментов данных.

Загрузка...