- •Типы архитектур ядер операционных систем Монолитное ядро
- •Подгружаемые модули
- •Модульное ядро
- •Микроядро
- •Архитектура микроядра, основанная на программах-серверах, работающих в пользовательском режиме
- •Устройство
- •Достоинства и недостатки
- •Поколения
- •История
- •Экзоядро
- •Наноядро
- •Пикоядро
- •Гибридное ядро
- •Примеры
- •Комбинация разных подходов
- •Загружаемый модуль ядра
- •Преимущества
- •Вопросы лицензирования
- •Дело Linuxant
- •Бинарная совместимость
- •Безопасность
- •Основные принципы функционирования
- •Наиболее известные представители данного класса по
- •Идеология построения драйверов
- •Сегментирование памяти
- •Условия и принцип защиты
- •Взаимодействие уровней привилегий
- •Переключение стека
- •Страничная память
- •Механизм ключей защиты
- •Симуляция сегментации Адресация основанная на Capability
- •Режим супервизора
- •Режим гипервизора
- •Режим системного управления (smm)
- •Модель взаимодействия между цп и уровнями абстракции ос
- •Системный вызов
- •Привилегии
- •Интерфейс системных вызовов
- •Промежуточная библиотека
- •Примеры и инструменты
- •Типичные имплементации
- •Категории системных вызовов
- •Режим процессора и переключение контекста
Сегментирование памяти
Сегментирование памяти означает разбиение компьютерной памяти на фрагменты переменной длины, называемые сегментами (см Сегментная адресация памяти).
В архитектуре 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
