Сегментно-страничная организация памяти
Сегментно-страничная организация памяти — это способ управления виртуальной памятью компьютера, сочетающий в себе принципы сегментации и страничного распределения. Данный метод позволяет объединить преимущества обоих подходов: логическую структуризацию адресного пространства программы (характерную для сегментации) и эффективное управление физической памятью без внешней фрагментации (свойственное страничной организации). Сегментно-страничная организация широко применялась в операционных системах, таких как OS/2, MULTICS и ранние версии Windows (до Windows 95), а также в некоторых современных архитектурах (например, x86-64 в режиме совместимости).
История и предпосылки
Проблемы сегментации и страничной организации
В 1960-х годах, с развитием мультипрограммирования, возникла необходимость в эффективном управлении памятью. Сегментация (разделение памяти на логические блоки — сегменты) обеспечивала удобство для программистов, позволяя разделять код, данные и стек, но приводила к внешней фрагментации — появлению неиспользуемых участков памяти между сегментами. Страничная организация (деление памяти на фиксированные блоки — страницы) решала проблему фрагментации, но нарушала логическую целостность программы, так как страницы не соответствовали смысловым единицам (например, функциям или массивам).
Разработка гибридного подхода
Первой системой, реализовавшей сегментно-страничную организацию, стала MULTICS (1965–1969), разработанная Массачусетским технологическим институтом (MIT), Bell Labs и General Electric. В MULTICS адресное пространство делилось на сегменты, каждый из которых, в свою очередь, разбивался на страницы. Этот подход позволил сочетать защиту памяти на уровне сегментов с динамическим управлением страницами. Впоследствии идея была адаптирована для архитектуры x86 в процессорах Intel 80286 и 80386, где сегментно-страничная организация стала основой защищённого режима.
Принцип работы
Структура адреса
В сегментно-страничной организации виртуальный адрес состоит из трёх частей:
- Номер сегмента (или селектор сегмента) — указывает на логический блок памяти (например, сегмент кода, данных или стека).
- Номер страницы — определяет конкретную страницу внутри сегмента.
- Смещение — задаёт точное положение внутри страницы.
Например, в архитектуре x86 (32-битный защищённый режим) виртуальный адрес формируется из 16-битного селектора сегмента и 32-битного смещения, которое затем интерпретируется как номер страницы (10–20 бит) и смещение внутри страницы (12 бит).
Преобразование адресов
Процесс преобразования виртуального адреса в физический включает два этапа:
- Сегментное преобразование: Селектор сегмента используется для поиска дескриптора сегмента в таблице дескрипторов (GDT — глобальная таблица дескрипторов, или LDT — локальная таблица дескрипторов). Дескриптор содержит базовый адрес сегмента в линейном адресном пространстве, его размер и права доступа.
- Страничное преобразование: Полученный линейный адрес (сумма базового адреса сегмента и смещения) разбивается на номер страницы и смещение. Номер страницы используется для поиска записи в таблице страниц (Page Table), которая указывает на физический адрес страницы в оперативной памяти или на диске (в случае подкачки).
Таблицы и аппаратная поддержка
Для реализации сегментно-страничной организации необходимы:
- Таблица дескрипторов сегментов (GDT/LDT) — хранит информацию о сегментах (базовый адрес, лимит, атрибуты).
- Таблица страниц (Page Table) — содержит записи, связывающие виртуальные страницы с физическими кадрами (Page Frames).
- Блок управления памятью (MMU) — аппаратный модуль процессора, выполняющий преобразование адресов.
В процессорах x86 сегментное преобразование выполняется блоком сегментации, а страничное — блоком страничной адресации. В современных 64-битных системах (x86-64) сегментация упрощена (используется плоская модель памяти), но страничная организация остаётся ключевой.
Преимущества и недостатки
Преимущества
- Логическая структуризация: Программы могут быть разделены на логические сегменты (код, данные, стек), что упрощает их разработку и отладку.
- Защита памяти: Каждый сегмент имеет атрибуты доступа (чтение, запись, выполнение), что предотвращает несанкционированный доступ.
- Эффективное использование памяти: Страничная организация позволяет загружать в память только необходимые страницы, а не весь сегмент целиком, что уменьшает фрагментацию и ускоряет подкачку.
- Поддержка разделения: Несколько процессов могут использовать один и тот же сегмент (например, общие библиотеки), что экономит память.
Недостатки
- Сложность реализации: Требуется двухуровневое преобразование адресов, что увеличивает задержки доступа к памяти (особенно при отсутствии кэша TLB — Translation Lookaside Buffer).
- Накладные расходы: Для поддержки сегментов и страниц требуется дополнительная память для таблиц (GDT, LDT, таблицы страниц).
- Ограничения сегментации: В некоторых архитектурах (например, x86) сегменты имеют фиксированный размер до 4 ГБ, что может быть неудобно для больших адресных пространств.
Применение
Операционные системы
Сегментно-страничная организация использовалась в:
- OS/2 (IBM, 1987) — для поддержки 16-битных и 32-битных приложений.
- Windows 3.x и Windows 9x — в режиме стандартного и расширенного режимов.
- Linux — в ранних версиях (до 2.6) использовалась сегментация для изоляции ядра и пользовательского пространства, хотя в современных версиях она сведена к минимуму.
Процессоры
Архитектура x86 (Intel 80386 и выше) поддерживает сегментно-страничную организацию в защищённом режиме. В 64-битном режиме (x86-64) сегментация отключена для большинства регистров, но страничная организация остаётся обязательной.
Сравнение с другими подходами
- Чистая сегментация (например, в Intel 8086) — проще, но приводит к внешней фрагментации.
- Чистая страничная организация (например, в современных Linux и Windows) — эффективнее, но не поддерживает логическую структуризацию.
- Сегментно-страничная организация — компромисс, который редко используется в современных системах из-за сложности, но остаётся важным для понимания эволюции управления памятью.
Реализация в архитектуре x86
Защищённый режим
В процессорах Intel 80386 и выше (32-битный защищённый режим) сегментно-страничная организация реализуется следующим образом:
- Сегментация: Каждый сегмент описывается дескриптором в GDT или LDT. Дескриптор содержит 32-битный базовый адрес, 20-битный лимит и атрибуты (например, уровень привилегий).
- Страничная адресация: Линейный адрес (32 бита) делится на:
- 10 бит — индекс в каталоге страниц (Page Directory).
- 10 бит — индекс в таблице страниц (Page Table).
- 12 бит — смещение внутри страницы (размер страницы — 4 КБ).
- Поддержка больших страниц: В процессорах с поддержкой PSE (Page Size Extension) возможны страницы размером 4 МБ.
64-битный режим
В архитектуре x86-64 сегментация упрощена: сегменты кода и данных имеют базовый адрес 0 и лимит 2^64, что эквивалентно плоской модели памяти. Страничная организация использует 4 уровня таблиц (PML4, PDPT, PD, PT) для поддержки 48-битного виртуального адресного пространства.
Интересные факты
- В системе MULTICS сегментно-страничная организация позволяла процессам иметь до 2^18 сегментов, каждый размером до 256 КБ.
- В Windows 95 сегментно-страничная организация использовалась для совместимости с 16-битными приложениями, но вызывала проблемы с производительностью из-за частых переключений между сегментами.
- В процессорах Intel 80286 (1982) сегментация была обязательной, а страничная адресация отсутствовала; она была добавлена только в 80386.
Критика
Сегментно-страничная организация критикуется за избыточную сложность, особенно в современных системах с большими объёмами памяти. Двухуровневое преобразование адресов увеличивает задержки, а поддержка сегментов требует дополнительных аппаратных ресурсов. В результате большинство современных операционных систем (Linux, Windows, macOS) используют плоскую модель памяти с чистой страничной организацией, отказавшись от сегментации.
Источники
- Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание), 2015.
- Intel Corporation. «Intel 64 and IA-32 Architectures Software Developer’s Manual», Volume 3A: System Programming Guide, 2023.
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. «Алгоритмы: построение и анализ» (3-е издание), 2013.
- Документация по архитектуре MULTICS (MIT, 1969).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →