Сегментация памяти - Memory segmentation

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

Сегменты обычно соответствуют естественным разделам программы, таким как отдельные процедуры или таблицы данных, поэтому сегментация обычно более заметна для программиста, чем одна разбивка на страницы . Различные сегменты могут быть созданы для разных программных модулей или для разных классов использования памяти, таких как сегменты кода и данных . Некоторые сегменты могут быть разделены между программами.

Первоначально сегментация была изобретена как метод, с помощью которого системное программное обеспечение могло изолировать различные программные процессы ( задачи ) и данные, которые они используют. Это было предназначено для повышения надежности систем, одновременно выполняющих несколько процессов. В архитектуре x86-64 это считается устаревшим, и большая часть современного системного программного обеспечения на базе x86-64 не использует сегментацию памяти. Вместо этого они обрабатывают программы и их данные, используя подкачку памяти, которая также служит способом защиты памяти. Однако большинство реализаций x86-64 по-прежнему поддерживают его по причинам обратной совместимости.

Аппаратная реализация

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

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

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

Сегментация - это один из методов защиты памяти . Другой вариант - пейджинг , и их можно комбинировать. Размер сегмента памяти обычно не фиксирован и может составлять всего один байт .

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

Сегментация без разбиения на страницы

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

Реализация виртуальной памяти в системе с использованием сегментации без разбиения на страницы требует, чтобы целые сегменты переключались между основной памятью и вторичной памятью. При замене сегмента операционная система должна выделить достаточно непрерывной свободной памяти для хранения всего сегмента. Часто фрагментация памяти возникает, если непрерывной памяти недостаточно, даже если ее всего может хватить.

Сегментация с разбиением на страницы

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

Реализация виртуальной памяти в системе с использованием сегментации с разбиением на страницы обычно перемещает только отдельные страницы назад и вперед между основной памятью и вторичным хранилищем, аналогично страничной несегментированной системе. Страницы сегмента могут располагаться в любом месте основной памяти и не обязательно должны быть смежными. Обычно это приводит к уменьшению объема ввода / вывода между первичной и вторичной памятью и уменьшению фрагментации памяти.

История

Burroughs Corporation B5000 компьютер был один из первых для реализации сегментации, и «возможно, первый коммерческий компьютер , чтобы обеспечить виртуальную память» на основе сегментации. Более поздний компьютер B6500 также реализовал сегментацию; версия его архитектуры до сих пор используется на серверах Unisys ClearPath Libra.

GE-645 компьютера, модификация GE-635 с сегментации и пейджинговой поддержки добавил, был разработан в 1964 году для поддержки Multics .

Intel iAPX 432 , начался в 1975 году, пытался реализовать истинную сегментированную архитектуру с защитой памяти на микропроцессоре.

Версия 960MX процессоров Intel i960 поддерживала инструкции загрузки и сохранения с источником или получателем, являющимся «дескриптором доступа» для объекта, и смещением в объект, причем дескриптор доступа находился в 32-битном регистре и со смещением вычисляется из базового смещения в следующем регистре и из дополнительного смещения и, необязательно, индексного регистра, указанного в инструкции. Дескриптор доступа содержит биты разрешения и 26-битный индекс объекта; индекс объекта - это индекс в таблице дескрипторов объекта, дающий тип объекта, длину объекта и физический адрес для данных объекта, таблицу страниц для объекта или таблицу страниц верхнего уровня для двухуровневого таблица страниц для объекта в зависимости от типа объекта.

В компьютерах Prime , Stratus , Apollo , IBM System / 38 и IBM AS / 400 (включая IBM i ) используется сегментация памяти.

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

Сегментация памяти, используемая ранними процессорами x86 , начиная с Intel 8086 , не обеспечивает никакой защиты. Любая программа, работающая на этих процессорах, может получить доступ к любому сегменту без ограничений. Сегмент идентифицируется только по его начальному положению; нет проверки длины. Гранулярность начального адреса сегмента составляет 16 байтов, а смещение - 16 бит, поддерживая размер сегмента до 64 КиБ, поэтому сегменты могут (и часто имеют) перекрываться, и каждый физический адрес может быть обозначен 4096 различными парами сегмент-смещение (с учетом адреса офсетное обтекание).

Сегментация в Intel 80286 и более поздних версиях обеспечивает защиту: с выпуском 80286 Intel задним числом назвала единственный рабочий режим предыдущих моделей процессоров x86 « реальным режимом » и представила новый « защищенный режим » с функциями защиты. Для обратной совместимости все процессоры x86 запускаются в «реальном режиме» без защиты памяти, с фиксированными сегментами 64 КиБ и только 20-битной (1024 КиБ) адресацией. Процессор 80286 или более поздней версии должен быть переключен в другой режим с помощью программного обеспечения, чтобы использовать его полное адресное пространство и расширенные функции MMU.

Процессоры Intel 80386 и более поздних версий также поддерживают подкачку; в этих процессорах таблица сегментов вместо того, чтобы указывать на таблицу страниц для сегмента, содержит адрес сегмента в линейной памяти . Адреса в линейной памяти затем сопоставляются с физическими адресами с помощью отдельной таблицы страниц, если подкачка включена.

Архитектура x86-64 не использует сегментацию в длинном режиме (64-битный режим). В архитектуре x86-64 это считается устаревшим, и большая часть современного системного программного обеспечения на базе x86-64 не использует сегментацию памяти. Вместо этого они обрабатывают программы и их данные, используя подкачку памяти, которая также служит способом защиты памяти. Хотя большинство реализаций x86-64 по-прежнему поддерживают его по причинам обратной совместимости. Четыре из сегментных регистров: CS, SS, DS и ES принудительно устанавливаются на 0, а ограничение - на 2 64 . Сегментные регистры FS и GS могут иметь ненулевой базовый адрес. Это позволяет операционным системам использовать эти сегменты для специальных целей.

Смотрите также

использованная литература

внешние ссылки

  • IA-32 Руководство разработчика программного обеспечения для архитектуры Intel Том 3A: Руководство по системному программированию. http://www.intel.com/products/processor/manuals/index.htm .
  • Операционные системы: внутреннее устройство и принципы дизайна Уильяма Столлингса. Издатель: Prentice Hall. ISBN  0-13-147954-7 . ISBN  978-0-13-147954-8 .