В этой статье отсутствует преамбула. |
Сегментная защита памяти — один из вариантов реализации защиты памяти в процессорах архитектуры x86. Может применяться в защищенном режиме процессоров начиная с Intel 80286 и совместимых.
При использовании плоской модели памяти (англ. flat model, применяется многими современными ОС), каждый сегмент описывает весь объем виртуальной памяти. В такой модели защита памяти реализуется дополнительно страничной памятью.[1]
Существует четыре уровня привилегий (PL) сегментов (0-3). Привилегированность увеличивается с уменьшением номера (то есть нулевой — самый привилегированный). Уровни 0-2 соответствуют супервизору (Supervisor), 3 — пользователю (user). На нулевом уровне позволяется использование привилегированных инструкций.
Уровень привилегий сегмента (DPL англ. Descriptor Privilege Level) соответствует значению поля DPL в дескрипторе сегмента.
Текущий уровень привилегий (CPL англ. Current Privilege Level) соответствует уровню привилегий сегмента кода, селектор которого загружен в регистр CS (то есть уровню привилегий выполняющегося сегмента кода).
Запрашиваемый уровень привилегий (RPL англ. Requested Privilege Level) находится в двух младших битах селектора (задаётся программой).
При загрузке селектора в сегментный регистр и при обращении к памяти проверяются условия сегментной защиты, и при несоблюдении вызывается обработчик исключения #GP.
Условия защиты следующие:
Взаимодействие четырёх уровней между собой осуществляется посредством шлюзов. Дескриптор шлюза так же, как и дескриптор сегмента имеет поле PL. Обращение к шлюзу подчинено вышеописанным правилам, но существуют дополнительные правила, накладывающие естественные ограничения на сегмент кода/TSS, указанный в шлюзе:
Если посредством шлюза происходит обращение к неподчинённому сегменту с таким же уровнем привилегий, или к подчинённому сегменту кода с таким же или численно меньшим уровнем привилегий, то происходит простой переход:
Push Flags ; Только для шлюзов прерывания и ловушки
Push CS
Push IP
Jmp FAR Gate_Address
Если же происходит переход к неподчинённому сегменту кода с численно меньшим уровнем привилегий, то происходит переключение стека во избежание его переполнения на верхних (численно меньших) уровнях. Напр. если происходит ошибка стека на нулевом уровне, то процессор останавливается.
Сегмент TSS содержит три дальних адреса стека — для уровней привилегий 0 — 2.
При переходе с больших на меньшие уровни через шлюзы происходит смена привилегий, и, соответственно, переключение стеков.[3]
Алгоритм переключения выглядит несколько сложнее:
При выполнении команды RetF/IRet:
В этой статье или разделе имеется список источников или внешних ссылок, но источники отдельных утверждений остаются неясными из-за отсутствия сносок. |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .