Открыть сервис

Сегментно-страничная организация памяти

Сегментно-страничная организация памяти — это способ управления виртуальной памятью компьютера, сочетающий в себе принципы сегментации и страничного распределения. Данный метод позволяет объединить преимущества обоих подходов: логическую структуризацию адресного пространства программы (характерную для сегментации) и эффективное управление физической памятью без внешней фрагментации (свойственное страничной организации). Сегментно-страничная организация широко применялась в операционных системах, таких как OS/2, MULTICS и ранние версии Windows (до Windows 95), а также в некоторых современных архитектурах (например, x86-64 в режиме совместимости).

История и предпосылки

Проблемы сегментации и страничной организации

В 1960-х годах, с развитием мультипрограммирования, возникла необходимость в эффективном управлении памятью. Сегментация (разделение памяти на логические блоки — сегменты) обеспечивала удобство для программистов, позволяя разделять код, данные и стек, но приводила к внешней фрагментации — появлению неиспользуемых участков памяти между сегментами. Страничная организация (деление памяти на фиксированные блоки — страницы) решала проблему фрагментации, но нарушала логическую целостность программы, так как страницы не соответствовали смысловым единицам (например, функциям или массивам).

Разработка гибридного подхода

Первой системой, реализовавшей сегментно-страничную организацию, стала MULTICS (1965–1969), разработанная Массачусетским технологическим институтом (MIT), Bell Labs и General Electric. В MULTICS адресное пространство делилось на сегменты, каждый из которых, в свою очередь, разбивался на страницы. Этот подход позволил сочетать защиту памяти на уровне сегментов с динамическим управлением страницами. Впоследствии идея была адаптирована для архитектуры x86 в процессорах Intel 80286 и 80386, где сегментно-страничная организация стала основой защищённого режима.

Принцип работы

Структура адреса

В сегментно-страничной организации виртуальный адрес состоит из трёх частей:

  1. Номер сегмента (или селектор сегмента) — указывает на логический блок памяти (например, сегмент кода, данных или стека).
  2. Номер страницы — определяет конкретную страницу внутри сегмента.
  3. Смещение — задаёт точное положение внутри страницы.

Например, в архитектуре x86 (32-битный защищённый режим) виртуальный адрес формируется из 16-битного селектора сегмента и 32-битного смещения, которое затем интерпретируется как номер страницы (10–20 бит) и смещение внутри страницы (12 бит).

Преобразование адресов

Процесс преобразования виртуального адреса в физический включает два этапа:

  1. Сегментное преобразование: Селектор сегмента используется для поиска дескриптора сегмента в таблице дескрипторов (GDT — глобальная таблица дескрипторов, или LDT — локальная таблица дескрипторов). Дескриптор содержит базовый адрес сегмента в линейном адресном пространстве, его размер и права доступа.
  2. Страничное преобразование: Полученный линейный адрес (сумма базового адреса сегмента и смещения) разбивается на номер страницы и смещение. Номер страницы используется для поиска записи в таблице страниц (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 →