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

Сегментирование памяти

Сегментирование памяти означает разбиение компьютерной памяти на фрагменты переменной длины, называемые сегментами (см Сегментная адресация памяти).

В архитектуре x86 есть несколько режимов сегментации, которые могут использоваться для защиты памяти. В процессорах архитектуры x86, существуют глобальная дескрипторная таблица и локальная дескрипторная таблица, описывающие сегменты памяти. Указатели на сегменты в подобных процессорах хранятся в специализированных сегментных регистрах. Изначально их было 4: CS (code segment), SS (stack segment), DS (data segment) и ES (extra segment); затем добавили ещё два: FS и GS.

Сегментная защита памяти — один из вариантов реализации защиты памяти в процессорах архитектуры x86. Может применяться в защищенном режиме процессоров начиная с Intel 80286 и совместимых.

При использовании плоской модели памяти (flat model, применяется многими современными ОС), каждый сегмент описывает весь объем виртуальной памяти. В такой модели защита памяти реализуется дополнительно страничной памятью.

Существует четыре уровня привилегий (PL) сегментов (0-3). Привилегированность увеличивается с уменьшением номера (то есть нулевой — самый привилегированный). Уровни 0-2 соответствуют супервизору (Supervisor), 3 — пользователю (user). На нулевом уровне позволяется использование привилегированных инструкций.

Уровень привилегий сегмента (DPL Descriptor Privilege Level) соответствует значению поля DPL в дескрипторе сегмента.

Текущий уровень привилегий (CPL Current Privilege Level) соответствует уровню привилегий сегмента кода, селектор которого загружен в регистр CS (то есть уровню привилегий выполняющегося сегмента кода).

Запрашиваемый уровень привилегий (RPL Requested Privilege Level) находится в двух младших битах селектора (задаётся программой).

Условия и принцип защиты

При загрузке селектора в сегментный регистр и при обращении к памяти проверяются условия сегментной защиты, и при несоблюдении вызывается обработчик исключения #GP.

Условия защиты следующие:

  • Нельзя обращаться за пределы сегмента, обозначенные лимитом[2];

  • В сегментные регистры ES, CS, SS, DS, FS, GS нельзя загружать селекторы, указывающие на системные сегменты (в которых бит S=0);

  • В регистры ES, DS, FS, GS можно загружать селекторы таких сегментов, у которых DPL>=Max(CPL, RPL);

  • В регистры ES, DS, FS, GS можно загружать только селекторы сегментов данных или сегментов кода для выполнения/чтения;

  • В регистр CS нельзя загружать селектор сегмента данных;

  • В регистр CS можно загружать селектор сегмента кода только при CPL=DPL;

  • В регистр SS можно загружать только селектор сегмента данных для чтения/записи с DPL = CPL;

  • В сегмент кода нельзя писать;

  • В сегмент данных только для чтения нельзя писать;

  • В системные регистры LDTR, TR можно загружать только селекторы сегментов LDT и TSS соответственно;

Взаимодействие уровней привилегий

Взаимодействие четырёх уровней между собой осуществляется посредством шлюзов. Дескриптор шлюза так же, как и дескриптор сегмента имеет поле PL. Обращение к шлюзу подчинено вышеописанным правилам, но существуют дополнительные правила, накладывающие естественные ограничения на сегмент кода/TSS, указанный в шлюзе:

  • DPL вызываемого сегмента не должен быть численно больше CPL;

  • DPL шлюза не должен быть численно меньше DPL указанного в нём сегмента;

  • В шлюзе должен быть указан только сегмент кода или TSS (если это шлюз задачи);

Если посредством шлюза происходит обращение к неподчинённому сегменту с таким же уровнем привилегий, или к подчинённому сегменту кода с таким же или численно меньшим уровнем привилегий, то происходит простой переход:

Push Flags ; Только для шлюзов прерывания и ловушки

Push CS

Push IP

Jmp FAR Gate_Address