Сегментная защита памяти: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Jego.ruS (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 1: | Строка 1: | ||
Существует четыре уровня привилегий (PL) [[сегментная |
Существует четыре уровня привилегий (PL) [[сегментная адресация памяти|сегментов]] (0–3). Привилегированность увеличивается с уменьшением номера (т. е. нулевой – самый привилегированный). Уровни 0–2 соответствуют супервизору (Supervisor), 3 – пользователю (user). На нулевом уровне позволяется использование привилегированных инструкций. |
||
Уровень привилегий [[сегментная |
Уровень привилегий [[сегментная адресация памяти|сегмента]] (DPL {{lang-en|Descriptor Privilege Level}}) соответствует значению поля DPL в [[дескриптор сегмента|дескрипторе сегмента]]. |
||
Текущий уровень привилегий (CPL {{lang-en|Current Privilege Level}}) соответствует уровню привилегий [[сегментная |
Текущий уровень привилегий (CPL {{lang-en|Current Privilege Level}}) соответствует уровню привилегий [[сегментная адресация памяти|сегмента]] кода, [[сегментная адресация памяти|селектор]] которого загружен в регистр CS (т. е. уровню привилегий выполняющегося [[сегментная адресация памяти|сегмента]] кода). |
||
Запрашиваемый уровень привилегий (RPL {{lang-en|Requested Privilege Level}}) находится в двух младших [[бит]]ах [[сегментная |
Запрашиваемый уровень привилегий (RPL {{lang-en|Requested Privilege Level}}) находится в двух младших [[бит]]ах [[сегментная адресация памяти|селектора]] (задаётся программой). |
||
При загрузке [[сегментная |
При загрузке [[сегментная адресация памяти|селектора]] в сегментный регистр и при обращении к памяти проверяются условия ''сегментной защиты'', и при несоблюдении вызывается обработчик исключения #GP. |
||
Условия защиты следующие: |
Условия защиты следующие: |
||
* Нельзя обращаться за пределы [[сегментная |
* Нельзя обращаться за пределы [[сегментная адресация памяти|сегмента]], обозначенные лимитом<ref>Существует два вида [[сегментная адресация памяти|сегментов]]: ''растущие вверх'' и ''растущие вниз''. Допустимый диапазон [[сегментная адресация памяти|'''сегментных''' адресов]] для ''растущих вверх'' [[сегментная адресация памяти|сегментов]]: от нуля до лимита включительно. Для ''растущих вниз'': от лимита (включительно) до $FFFFF при G=0 или до $FFFFFFFF при G=1.</ref>; |
||
* В сегментные регистры ES, CS, SS, DS, FS, GS нельзя загружать [[сегментная |
* В сегментные регистры ES, CS, SS, DS, FS, GS нельзя загружать [[сегментная адресация памяти|селекторы]], указывающие на системные [[сегментная адресация памяти|сегменты]] (в которых [[бит]] S=0); |
||
* В регистры ES, DS, FS, GS можно загружать [[сегментная |
* В регистры ES, DS, FS, GS можно загружать [[сегментная адресация памяти|селекторы]] таких [[сегментная адресация памяти|сегментов]], у которых DPL>=Max(CPL, RPL); |
||
* В регистры ES, DS, FS, GS можно загружать ''только'' [[сегментная |
* В регистры ES, DS, FS, GS можно загружать ''только'' [[сегментная адресация памяти|селекторы сегментов]] данных или [[сегментная адресация памяти|сегментов]] кода для выполнения/чтения; |
||
* В регистр CS нельзя загружать [[сегментная |
* В регистр CS нельзя загружать [[сегментная адресация памяти|селектор сегмента]] данных; |
||
* В регистр SS можно загружать только [[сегментная |
* В регистр SS можно загружать только [[сегментная адресация памяти|селектор сегмента]] данных для чтения/записи с DPL = CPL; |
||
* В [[сегментная |
* В [[сегментная адресация памяти|сегмент]] кода нельзя писать; |
||
* В [[сегментная |
* В [[сегментная адресация памяти|сегмент]] данных только для чтения нельзя писать; |
||
* В системные регистры [[LDTR]], [[TR]] можно загружать только [[сегментная |
* В системные регистры [[LDTR]], [[TR]] можно загружать только [[сегментная адресация памяти|селекторы сегментов]] LDT и TSS соответственно; |
||
== Примечания == |
== Примечания == |
||
<references /> |
<references /> |
Версия от 17:10, 11 июля 2008
Существует четыре уровня привилегий (PL) сегментов (0–3). Привилегированность увеличивается с уменьшением номера (т. е. нулевой – самый привилегированный). Уровни 0–2 соответствуют супервизору (Supervisor), 3 – пользователю (user). На нулевом уровне позволяется использование привилегированных инструкций.
Уровень привилегий сегмента (DPL англ. Descriptor Privilege Level) соответствует значению поля DPL в дескрипторе сегмента.
Текущий уровень привилегий (CPL англ. Current Privilege Level) соответствует уровню привилегий сегмента кода, селектор которого загружен в регистр CS (т. е. уровню привилегий выполняющегося сегмента кода).
Запрашиваемый уровень привилегий (RPL англ. Requested Privilege Level) находится в двух младших битах селектора (задаётся программой).
При загрузке селектора в сегментный регистр и при обращении к памяти проверяются условия сегментной защиты, и при несоблюдении вызывается обработчик исключения #GP.
Условия защиты следующие:
- Нельзя обращаться за пределы сегмента, обозначенные лимитом[1];
- В сегментные регистры ES, CS, SS, DS, FS, GS нельзя загружать селекторы, указывающие на системные сегменты (в которых бит S=0);
- В регистры ES, DS, FS, GS можно загружать селекторы таких сегментов, у которых DPL>=Max(CPL, RPL);
- В регистры ES, DS, FS, GS можно загружать только селекторы сегментов данных или сегментов кода для выполнения/чтения;
- В регистр CS нельзя загружать селектор сегмента данных;
- В регистр SS можно загружать только селектор сегмента данных для чтения/записи с DPL = CPL;
- В сегмент кода нельзя писать;
- В сегмент данных только для чтения нельзя писать;
- В системные регистры LDTR, TR можно загружать только селекторы сегментов LDT и TSS соответственно;
Примечания
- ↑ Существует два вида сегментов: растущие вверх и растущие вниз. Допустимый диапазон сегментных адресов для растущих вверх сегментов: от нуля до лимита включительно. Для растущих вниз: от лимита (включительно) до $FFFFF при G=0 или до $FFFFFFFF при G=1.