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

Сегментная модель памяти

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

История

Концепция сегментации памяти возникла в 1960-х годах как развитие идей виртуальной памяти и защиты процессов. Первые реализации появились в мейнфреймах, таких как IBM System/360 (1964 год), где сегментация использовалась для изоляции задач в многозадачной среде. В 1970-х годах сегментная модель была внедрена в процессоры Intel 8086 и 80286, где она стала основой для адресации памяти в реальном и защищённом режимах.

В операционных системах, таких как Multics (1965 год) и ранние версии Unix, сегментация применялась для управления памятью в многопользовательских системах. Однако с развитием страничной модели (например, в процессорах Intel 80386) сегментация утратила доминирующее положение, уступив место гибридным подходам, где сегментация используется для управления привилегиями и защитой, а страничная организация — для управления физической памятью.

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

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

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

Логический адрес в сегментной модели состоит из двух частей:

  • Номер сегмента — указывает на запись в таблице сегментов.
  • Смещение — задаёт положение внутри сегмента (от 0 до длины сегмента).

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

Таблица сегментов

Таблица сегментов — это структура данных, хранящаяся в оперативной памяти или в специальных регистрах процессора. Каждая запись таблицы содержит:

  • Базовый адрес — начальный физический адрес сегмента.
  • Лимитмаксимальный размер сегмента (обычно в байтах).
  • Атрибуты доступа — биты, определяющие, разрешены ли чтение, запись, выполнение, а также уровень привилегий (кольцо защиты).

Классификация сегментов

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

По назначению

  • Кодовые сегменты — содержат исполняемый код программы. Обычно доступны только для чтения и выполнения.
  • Сегменты данных — хранят глобальные и статические переменные. Доступны для чтения и записи.
  • Стековые сегменты — используются для хранения локальных переменных, адресов возврата и параметров функций. Обычно имеют динамический размер.
  • Сегменты кучи — выделяются для динамического распределения памяти (например, через malloc в C).

По способу размещения

  • Фиксированные сегменты — имеют постоянный размер, заданный при компиляции или загрузке программы.
  • Динамические сегменты — могут изменять свой размер во время выполнения (например, стек и куча).

По уровню привилегий

В архитектурах, поддерживающих кольца защиты (например, x86), сегменты могут быть привязаны к определённым уровням привилегий (Ring 0 — ядро, Ring 3 — пользовательские приложения). Это ограничивает доступ к критическим данным и коду.

Применение

Сегментная модель памяти используется в различных контекстах, от операционных систем до встраиваемых систем.

В операционных системах

  • Изоляция процессов — каждый процесс имеет собственное адресное пространство, разделённое на сегменты, что предотвращает взаимное влияние.
  • Управление памятьюоперационная система может загружать и выгружать сегменты из физической памяти, используя подкачку (swapping) или сегментную подкачку.
  • Защита доступа — атрибуты сегментов позволяют контролировать, какие операции (чтение, запись, выполнение) разрешены для конкретных сегментов.

В архитектуре x86

В процессорах Intel x86 сегментация используется в защищённом режиме (Protected Mode) для управления памятью и привилегиями. Сегментные регистры (CS, DS, SS, ES, FS, GS) хранят селекторы сегментов, которые указывают на записи в глобальной таблице дескрипторов (GDT) или локальной таблице дескрипторов (LDT). В 64-битном режиме (Long Mode) сегментация упрощена: большинство сегментов имеют фиксированные базовые адреса и лимиты, а основная роль отводится страничной организации.

В операционных системах реального времени

В системах с жёсткими требованиями к времени отклика (например, в авионике или промышленных контроллерах) сегментация позволяет изолировать критически важные задачи от остальных, обеспечивая предсказуемость доступа к памяти.

Преимущества и недостатки

Преимущества

  • Логическая организация — сегменты соответствуют структуре программы (код, данные, стек), что упрощает разработку и отладку.
  • Гибкость — размер сегментов может быть произвольным, что позволяет эффективно использовать память для данных переменного размера.
  • Защита — атрибуты доступа и привилегий предотвращают несанкционированный доступ к памяти.

Недостатки

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

Примеры реализации

Intel 8086 (реальный режим)

В процессоре Intel 8086 сегментация использовалась в реальном режиме для адресации до 1 МБ памяти. Физический адрес вычислялся как (сегмент << 4) + смещение, где сегмент — 16-битное значение, хранящееся в сегментном регистре. Это позволяло адресовать память, превышающую 16-битное адресное пространство (64 КБ), но приводило к перекрытию сегментов и сложностям с защитой.

Multics

Операционная система Multics (1965 год) использовала сегментную модель для изоляции процессов и управления памятью. Каждый сегмент имел уникальный идентификатор и мог быть разделён между несколькими процессами, что обеспечивало совместное использование кода и данных.

Современные операционные системы (Linux, Windows)

В современных ядрах, таких как Linux и Windows, сегментация используется в основном для поддержки совместимости с архитектурой x86. В 64-битном режиме сегментация упрощена, а основная роль в управлении памятью отводится страничной организации. Однако сегментные регистры (например, FS и GS) применяются для хранения указателей на локальные данные потока (TLS — Thread Local Storage).

Интересные факты

  • В архитектуре x86 сегментация может быть отключена (Flat Memory Model), когда все сегменты имеют одинаковый базовый адрес (0) и максимальный лимит, что упрощает адресацию.
  • Ошибка сегментации (Segmentation fault) — это исключение, возникающее при попытке доступа к памяти за пределами сегмента или с нарушением атрибутов доступа.
  • В некоторых встраиваемых системах сегментация используется для защиты памяти от повреждения из-за ошибок программного обеспечения.

Источники

  • Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide.
  • Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание).
  • Silberschatz A., Galvin P. B., Gagne G. «Operating System Concepts» (10th edition).
  • Документация по архитектуре Multics (MIT Project MAC).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →