Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ядро ОС.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
873.98 Кб
Скачать

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

Если же происходит переход к неподчинённому сегменту кода с численно меньшим уровнем привилегий, то происходит переключение стека во избежание его переполнения на верхних (численно меньших) уровнях. Напр. если происходит ошибка стека на нулевом уровне, то процессор останавливается.

Сегмент TSS содержит три дальних адреса стека — для уровней привилегий 0 — 2.

При переходе с больших на меньшие уровни через шлюзы происходит смена привилегий, и, соответственно, переключение стеков.

Алгоритм переключения выглядит несколько сложнее:

  • Из соответствующих полей TSS загружаются новые значения SS, (E)SP;

  • В новый стек сохраняются предыдущие значения SS, (E)SP (до вызова);

  • Если шлюз является шлюзом вызова, то в новый стек копируются WC слов/двойных слов из стека вызывающей программы;

  • Если это шлюз прерывания или ловушки, то сохраняется значение (E)Flags;

  • Сохраняется текущее значение CS, (E)IP;

  • Из дескриптора шлюза в регистры CS:(E)IP загружается новый дальний адрес, указанный в соответствующих полях дескриптора;

При выполнении команды RetF/IRet:

  • Процессор извлекает из стека дальний адрес возврата (и регистр флагов);

  • Если у команды RetF есть параметр, то увеличивает значение (E)SP на его значение (удаляет из стека переданные процедуре параметры);

  • Анализирует RPL селектора CS: если он численно больше CPL, то извлекает из стека дальний адрес прежней вершины стека и загружает его в SS:(E)SP. Таким образом происходит возврат к старому стеку;

Страничная память

При страничной организации памяти, все адресное пространство делится на фрагменты фиксированного размера, называемые страницами. Их размер кратен степени 2, и обычно равен 4096, но возможно использование одновременно нескольких размеров страниц (4 кб, 2-4МБ в x86, от 4 до 256 кб в IA64). При помощи механизма виртуальной памяти, каждая страница виртуальной памяти может быть поставлена в соответствие любой странице физической памяти, либо помечена как защищенная. При помощи виртуальной памяти возможно использование линейного адресного пространства виртуальной памяти, которое на самом деле образовано фрагментированными участками адресного пространства физической памяти.

Многие архитектуры, использующие страничную организацию памяти, в том числе и наиболее популярная x86, реализуют защиту памяти на уровне страниц.

Таблица страниц используется для установления соответствия адресов в виртуальной памяти физическим адресам. Обычно эта таблица невидима для программы. Возможность установки в таблицах произвольных отображений позволяет легко выделить новую память, так как дополнительная страница, расположенная в нужном месте виртуального адресного пространства, может быть отображена на любую свободную страницу в оперативной памяти.

При таком отображении, приложение не имеет возможности обратиться к странице, отсутствующей в её таблице страниц. Если при обращении по произвольному адресу не было найдено подходящее отображение, происходит исключительная ситуация page fault (PF).

Следует заметить, что page fault — это не фатальное событие. Эти прерывания могут использоваться не только для защиты памяти, но и другими способами. Так, ОС, перехватив PF, может загрузить страницу в память, например, если она была ранее выгружена на жесткий диск в процессе подкачки страниц, после чего приложение может продолжать работу. Такая схема позволяет прозрачным способом увеличить количество доступной приложениям памяти.