Что такое сегментация памяти
Сегментная организация памяти
Презентацию к данной лекции Вы можете скачать здесь.
Введение
Принципы сегментной организации памяти
рис. 17.1 иллюстрирует данную точку зрения на программу как на набор сегментов в памяти.
Архитектура сегментной организации памяти
Многие принципы архитектуры сегментной организации схожи с принципами страничной организации (см. «Страничная организация памяти» ), однако во всех случаях приходится учитывать, что длина сегмента переменна, и хранить ее в явном виде в таблицах.
Перемещение ( relocation ) программ и данных при сегментной организации динамическое, т.е. выполняется во время исполнения программы с помощью таблицы сегментов.
Возможен общий доступ (sharing) нескольких процессов к одному и тому же сегменту, т.е. поддерживается концепция разделяемых сегментов. При этом логический номер общего сегмента для разных процессов будет одним и тем же.
Стратегии распределения памяти при сегментной организации: метод первого подходящего или метод наиболее подходящего (см. «Страничная организация памяти» ). Метод наименее подходящего при сегментной организации смысла не имеет, так как он не улучшает ситуацию с фрагментацией (ввиду переменной длины сегментов). Соответственно, при сегментной организации возможна внешняя фрагментация, для борьбы с которой применяется компактировка (см. «Страничная организация памяти» ).
Например, если сегмент является сегментом данных, то система устанавливает в таблице сегментов бит защиты от исполнения равным 0. Если это сегмент кода, то целесообразна установка в 0 битов защиты от чтения и от записи.
Биты защиты связываются с сегментами. Совместный доступ к коду осуществляется на уровне сегментов.
В системе «Эльбрус» к стандартному набору признаков защиты был добавлен еще один: защита от записи в сегмент адресной информации (данный признак целесообразен, если, например, сегмент предназначен для записи в файл ).
Поскольку сегменты различаются по длине, распределение памяти в виде сегментов – это общая задача динамического распределения памяти (см. «Страничная организация памяти» ).
Операционные системы копия 1
8.1 Основные понятия сегментации
Рассмотрим пример, когда программа использует одно адресное пространство.
программа использует одно адресное пространство
Недостатки такой системы:
Один участок может полностью заполниться, но при этом останутся свободные участки. Можно конечно перемещать участки, но это очень сложно.
Эти проблемы можно решить, если дать каждому участку независимое адресное пространство, называемое сегментом.
Рассмотрим то же пример с использованием сегментов:
Каждый сегмент может расти или уменьшаться независимо от других.
В этом случае адрес имеет две части:
Сегменты не мешают друг другу.
Начальный адрес процедуры всегда начинается с (n,0). Что упрощает программирование.
Облегчает совместное использование процедур и данных.
Раздельная защита каждого сегмента (чтение, запись).
8.2 Реализация сегментации
Если страницы имеют фиксированный размер, то сегменты нет.
У сегментов так же, как и у страниц, существует проблема фрагментации.
Т.к. памяти часто не хватает, стали использовать страничную организацию сегментов. При которой в памяти может находиться только часть сегмента.
8.2.1 Сегментация с использованием страниц: MULTICS
Каждая программа обеспечивалась до 2^18 сегментов (более 250 000), каждый из которых мог быть до 65 536 (36-разрядных) слов длиной.
Т.к. записей в таблице более 250 000, она сама разбита на страницы.
Сама таблица является отдельным сегментом.
Сегмент с таблицей дескрипторов указывающих на таблицы страниц для каждого сегмента
Нормальный размер страницы равен 1024 словам. Если сегмент меньше 1024, то он либо не разбит на страницы, либо разбит на страницы по 64 слова.
Когда происходит обращение к памяти, выполняется следующий алгоритм:
По номеру сегмента находится дескриптор сегмента.
Проверяется, находиться ли таблица страницы в памяти. Если в памяти, определяется ее расположение. Если нет, вызывается сегментное прерывание.
Проверяется, находиться ли страница в памяти. Если в памяти, определяется ее расположение в памяти. Если нет в памяти, вызывается страничное прерывание.
К адресу начала страницы прибавляется смещение, в результате получаем адрес нужного слова в оперативной памяти.
Происходит запись или чтение.
Преобразование адреса в системе MULTICS
Так как такой алгоритм будет работать достаточно медленно. Аппаратура системы MULTICS содержит высокоскоростной буфер быстрого преобразования адреса (TLB) размером в 16 слов. Адреса 16 наиболее часто использующихся страниц хранятся в буфере.
8.2.2 Сегментация с использованием страниц: Intel Pentium
Каждая программа обеспечивается до 16К сегментов, каждый из которых может быть до 1 млдр 36-разрядных слов длиной.
Основа виртуальной памяти системы Pentium состоит из двух таблиц:
Каждый селектор (указывает на дескриптор) представляет собой 16-разрядный номер.
Селектор в системе Pentium
13 битов определяют номер записи в таблице дескрипторов, поэтому эти таблицы ограничены, каждая содержит 8К (2^13) сегментных дескрипторов.
1 бит указывает тип используемой таблицы дескрипторов LDT или GDT.
Уровни привилегированности в системе Pentium
Уровни привилегированности запрещают выполняемому коду обратиться к более низкому уровню.
Дескриптор программного (не данных) сегмента в системе Pentium (всего 8 байт (64 бита)).
Если размер сегмента указан в страницах, он может достигать 2^32 байтов (2^20 * 4Кбайт (2^12) (размер страницы в Pentium)).
Алгоритм получение физического адреса:
Селектор загружается в регистр (для сегмента команд в CS, для сегмента данных в DS).
Определяется глобальный или локальный сегмент (LDT или GDT).
Дескриптор извлекается из LDT или GDT, и сохраняется в микропрограммных регистрах.
Если дескриптор в памяти и смещение не выходит за пределы сегмента, программа может продолжить работу, если нет, происходит прерывание.
Система Pentium прибавляет базовый адрес к смещению, и получает линейный адрес,
— если страничная организация памяти не используется, то он является физическим адресом (адрес получен),
— если страничная организация памяти используется, то он является виртуальным адресом.
В случае, если используется страничная организация памяти, линейный адрес переводится в физический с помощью таблицы страниц.
Преобразование пары (селектора, смещение) в физический адрес
При 32-разрядном (2^32=4Гбайт) адресе и 4Кбатной странице, сегмент может содержать 1 млн страниц (4Гбайт/4Кбайта). Поэтому используется двухуровневое отображение (создана таблица (страничный каталог) содержащая список из 1024 таблиц страниц), благодаря чему можно снизить количество записей в таблице страниц до 1024.
В этом случае сегмент в 4 Мбайта (1024 записи по 4 Кбайта страницы), будет иметь страничный каталог только с одной записью (и 1024 в таблице страниц), вместо 1 млн в одной таблице.
Отображение линейного адреса на физический адрес
В системе Pentium также есть буфер быстрого преобразования адреса (TLB), в котором хранятся наиболее часто используемые комбинации Каталог-Страница на физический адрес страничного блока. Только если комбинация в TLB отсутствует, выполняется это алгоритм.
8.3 Особенности реализации в UNIX
В LUNIX системе на 32-разрядной машине каждый процесс получает 3Гбайта виртуального пространства для себя, и 1Гбайт для страничных таблиц и других данных ядра.
На компьютерах Pentium, используется двухуровневые таблицы страниц, и размер страниц фиксирован 4Кбайта
На компьютерах Alpha, используется трехуровневые таблицы страниц, и размер страниц фиксирован 8Кбайт
Для каждой программы выделяется 3 сегмента:
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Сегментная адресация памяти
Содержание
Аппаратная реализация
В системе, использующей сегментацию, адреса памяти компьютера состоят из идентификатора сегмента и смещения в сегменте. Аппаратный блок управления памятью (MMU) ответственен за перевод сегмента и смещения в адрес физической памяти, и за выполнение проверок, чтобы удостовериться, что перевод может быть произведен и что ссылка на сегмент и смещение разрешены.
У каждого сегмента есть длина и связанный с ним набор полномочий (например, чтение, запись, выполнение). Процессу позволяют сделать ссылку в сегмент в том случае, если тип ссылки разрешен полномочиями, и если смещение в сегменте находится в диапазоне, определенном длиной сегмента. Иначе возникает ошибка сегментации.
Сегменты могут также использоваться, чтобы реализовать виртуальную память. В этом случае у каждого сегмента есть связанный флаг, указывающий, присутствует ли сегмент в оперативной памяти или нет. Если сегмент, к которому получают доступ, не присутствует в оперативной памяти, выбрасывается исключение, и операционная система считает сегмент в память из внешнего хранилища.
Сегментация была реализована несколькими различными способами на различных аппаратных средствах, с или без разбивки на страницы. Сегментация памяти Intel x86 не соответствует ни одной модели и обсуждена отдельно ниже.
Сегментация без разбиения на страницы
Связанная с каждым сегментом информация, которая указывает, где сегмент расположен в памяти— база сегмента. Когда программа ссылается на ячейку памяти, смещение добавляется к базе, чтобы генерировать адрес физической памяти.
Реализация виртуальной памяти в системе, используя сегментацию без разбивки на страницы требует, чтобы все сегменты перемещались между оперативной памятью и внешней памятью. Когда сегмент загружен, операционная система должна выделить достаточное количество непрерывной свободной памяти, чтобы содержать весь сегмент. Часто результатом фрагментации является невозможность выделить именно непрерывный участок заданной памяти.
Сегментация с разбиением на страницы
Вместо фактической ячейки памяти информация о сегменте включает адрес таблицы страниц для сегмента. Когда программа ссылается на ячейку памяти, смещение переводится в адрес памяти, используя таблицу страниц. Сегмент может быть расширен, просто выделением другой страницы памяти и добавлением ее к таблице страниц сегмента.
Реализация виртуальной памяти в системе, используя сегментацию с разбивкой на страницы обычно только перемещает отдельные страницы назад и вперед между оперативной памятью и внешней памятью, подобно простой страничной реализации адресации памяти. Страницы сегмента могут быть расположены где угодно в оперативной памяти и не должны быть непрерывными. Обыкновенно это приводит к уменьшению ввода/вывода между основной и внешней памятью, а также к уменьшению фрагментации памяти.
Совместное использование сегментов
Сегментирование физической памяти не только не позволяет виртуальной памяти отъедать физическую, но также даёт возможность совместного использования физических сегментов с помощью виртуальных адресных пространств разных процессов.
Если дважды запустить задачу А, то кодовый сегмент у них будет один и тот же: в обеих задачах выполняются одинаковые машинные инструкции. В то же время у каждой задачи будут свои стек и куча, поскольку они оперируют разными наборами данных.
При этом оба процесса не подозревают, что делят с кем-то свою память. Такой подход стал возможен благодаря внедрению битов защиты сегмента (segment protection bits).
Для каждого создаваемого физического сегмента ОС регистрирует значение bounds, которое используется MMU для последующей переадресации. Но в то же время регистрируется и так называемый флаг разрешения (permission flag). Поскольку сам код нельзя модифицировать, то все кодовые сегменты создаются с флагами RX. Это значит, что процесс может загружать эту область памяти для последующего выполнения, но в неё никто не может записывать. Другие два сегмента — куча и стек — имеют флаги RW, то есть процесс может считывать и записывать в эти свои два сегмента, однако код из них выполнять нельзя. Это сделано для обеспечения безопасности, чтобы злоумышленник не мог повредить кучу или стек, внедрив в них свой код для получения root-прав. Так было не всегда, и для высокой эффективности этого решения требуется аппаратная поддержка. В процессорах Intel это называется “NX bit”.
Флаги могут быть изменены в процессе выполнения программы, для этого используется mprotect().
Под Linux все эти сегменты памяти можно посмотреть с помощью утилит /proc/
Здесь есть все необходимые подробности относительно распределения памяти. Адреса виртуальные, отображаются разрешения для каждой области памяти. Каждый совместно используемый объект (.so) размещён в адресном пространстве в виде нескольких частей (обычно код и данные). Кодовые сегменты являются исполняемыми и совместно используются в физической памяти всеми процессами, которые разместили подобный совместно используемый объект в своём адресном пространстве.
Shared Objects — это одно из крупнейших преимуществ Unix- и Linux-систем, обеспечивающее экономию памяти.
Также с помощью системного вызова mmap() можно создавать совместно используемую область, которая преобразуется в совместно используемый физический сегмент. Тогда у каждой области появится индекс s, означающий shared.
Ограничения сегментации
Итак, сегментация позволила решить проблему неиспользуемой виртуальной памяти. Если она не используется, то и не размещается в физической памяти благодаря использованию сегментов, соответствующих именно объёму используемой памяти.
Но это не совсем верно.
Допустим, процесс запросил у кучи 16 Кб. Скорее всего, ОС создаст в физической памяти сегмент соответствующего размера. Если пользователь потом освободит из них 2 Кб, тогда ОС придётся уменьшить размер сегмента до 14 Кб. Но вдруг потом программист запросит у кучи ещё 30 Кб? Тогда предыдущий сегмент нужно увеличить более чем в два раза, а возможно ли это будет сделать? Может быть, его уже окружают другие сегменты, не позволяющие ему увеличиться. Тогда ОС придётся искать свободное место на 30 Кб и перераспределять сегмент.
Главный недостаток сегментов заключается в том, что из-за них физическая память сильно фрагментируется, поскольку сегменты увеличиваются и уменьшаются по мере того, как пользовательские процессы запрашивают и освобождают память. А ОС приходится поддерживать список свободных участков и управлять ими.
Фрагментация может привести к тому, что какой-нибудь процесс запросит такой объём памяти, который будет больше любого из свободных участков. И в этом случае ОС придётся отказать процессу в выделении памяти, даже если суммарный объём свободных областей будет существенно больше.
ОС может попытаться разместить данные компактнее, объединяя все свободные области в один большой чанк, который в дальнейшем можно использовать для нужд новых процессов и перераспределения.
Но подобные алгоритмы оптимизации сильно нагружают процессор, а ведь его мощности нужны для выполнения пользовательских процессов. Если ОС начинает реорганизовывать физическую память, то система становится недоступной.
Так что сегментация памяти влечёт за собой немало проблем, связанных с управлением памятью и многозадачностью.Нужно как-то улучшить возможности сегментации и исправить недостатки. Это достигается с помощью ещё одного подхода — страниц виртуальной памяти.
Управление памятью. Методы, алгоритмы и средства
6.6. Сегментная организация виртуальной памяти
При страничной организации виртуальное адресное пространство делится на равные части механически без учета смыслового значения данных. Для многих задач наличие двух и более отдельных виртуальных адресных пространств может оказаться намного лучше, чем одно.
Например, у компилятора есть много таблиц, которые формируются по мере трансляции, включая в себя [10]:
Во время компиляции каждая из первых четырех таблиц непрерывно растет. Последняя таблица при компиляции непредсказуемо увеличивается или уменьшается. В одномерной памяти эти пять таблиц должны размещаться в смежных частях виртуального адресного пространства, как показано на рис. 6.18. В одномерном адресном пространстве при росте таблиц одна может «упереться» в другую. Можно было бы программным путем забирать памяти у одних таблиц и передавать другим. Но такая работа аналогична управлению собственными оверлеями, что представляет собой неудобство и большую скучную (возможно, неоплачиваемую) работу.
Необходим метод, освобождающий программиста от управления расширяющимися и сокращающимися таблицами тем же самым способом, которым виртуальная память устраняет беспокойство организации оверлейных программ. Простое и предельно общее решение заключается в том, чтобы обеспечить машину множеством полностью независимых адресных пространств, называемых сегментами.
Помимо простоты управления увеличивающимися или сокращающимися структурами данных, сегментированная память обладает и другими преимуществами.
Сравнение страничной организации памяти и сегментации приведено ниже.
Вопрос | Страничная | Сегментация |
---|---|---|
Нужно ли программисту знать о том, что используется эта техника? | Нет | Да |
Сколько в системе линейных адресных пространств? | Одно | Много |
Может ли суммарное адресное пространство превышать размеры физической памяти? | Да | Да |
Возможно ли разделение процедур и данных, а также раздельная защита для них? | Нет | Да |
Легко ли размещаются таблицы с непостоянными размерами? | Нет | Да |
Облегчен ли совместный доступ пользователей к процедурам? | Нет | Да |
Зачем была придумана эта техника? | Чтобы получить большое линейное адресное пространство без затрат на физическую память | Для разбиения программ и данных на независимые адресные пространства, облегчения защиты и совместного доступа |
На этапе создания процесса во время загрузки его образа в оперативную память ОС создает таблицу сегментов процесса, аналогичную таблице страниц, в которой для каждого сегмента указывается:
Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Обычно программы в этих сегментах являются рентабельными ( reentrant able ), т.е. обладают свойством повторной входимости кода. Код таких программ не изменяется процессом.
Механизм преобразования виртуального адреса при сегментной организации очень схож с преобразованием виртуального адреса при страничной организации. Однако факт произвольного размера сегментов приводит к тому, что нельзя обойтись конкатенацией номера сегмента и смещения. В данном случае физический адрес получается сложением базового адреса сегмента, который определяется по номеру сегмента n из таблицы сегментов, и смещения S. Схема преобразования виртуального адреса при сегментной организации памяти приведена на рис. 6.19.
Сегментация памяти
Первоначально сегментация была изобретена как метод, с помощью которого системное программное обеспечение могло изолировать различные программные процессы ( задачи ) и данные, которые они используют. Это было предназначено для повышения надежности систем, одновременно выполняющих несколько процессов. [4] В архитектуре x86-64 это считается устаревшим, и большая часть современного системного программного обеспечения на базе x86-64 не использует сегментацию памяти. Вместо этого они обрабатывают программы и их данные, используя подкачку памяти, которая также служит способом защиты памяти. Однако большинство реализаций x86-64 по-прежнему поддерживают его по причинам обратной совместимости. [4]
В системе, использующей сегментацию, адреса памяти компьютера состоят из идентификатора сегмента и смещения внутри сегмента. [3] Блок управления аппаратной памятью (MMU) отвечает за преобразование сегмента и смещения в физический адрес и за выполнение проверок, чтобы убедиться, что преобразование может быть выполнено, и что ссылка на этот сегмент и смещение разрешены.
Сегментация была реализована несколькими способами на разном оборудовании, с подкачкой или без нее. Сегментация памяти Intel x86 не подходит ни для одной из моделей и обсуждается отдельно ниже, а также более подробно в отдельной статье.
Сегментация без разбиения на страницы
Реализация виртуальной памяти в системе с использованием сегментации без разбиения на страницы требует, чтобы целые сегменты переключались между основной памятью и вторичной памятью. При замене сегмента операционная система должна выделить достаточно непрерывной свободной памяти для хранения всего сегмента. Часто фрагментация памяти возникает, если непрерывной памяти недостаточно, даже если ее всего может хватить.
Сегментация с разбиением на страницы
Вместо фактического места в памяти информация о сегменте включает в себя адрес таблицы страниц для сегмента. Когда программа ссылается на ячейку памяти, смещение преобразуется в адрес памяти с использованием таблицы страниц. Сегмент можно расширить, просто выделив другую страницу памяти и добавив ее в таблицу страниц сегмента.
Реализация виртуальной памяти в системе с использованием сегментации с разбиением на страницы обычно перемещает только отдельные страницы назад и вперед между основной памятью и вторичным хранилищем, аналогично страничной несегментированной системе. Страницы сегмента могут располагаться в любом месте основной памяти и не обязательно должны быть смежными. Обычно это приводит к уменьшению объема ввода / вывода между первичной и вторичной памятью и уменьшению фрагментации памяти.
Сегментация в Intel 80286 и более поздних версиях обеспечивает защиту: с выпуском 80286 Intel задним числом назвала единственный рабочий режим предыдущих моделей процессоров x86 « реальным режимом » и представила новый « защищенный режим » с функциями защиты. Для обратной совместимости все процессоры x86 запускаются в «реальном режиме» без защиты памяти, с фиксированными сегментами 64 КиБ и только 20-разрядной (1024 КиБ) адресацией. Процессор 80286 или более поздней версии должен быть переключен в другой режим с помощью программного обеспечения, чтобы использовать его полное адресное пространство и расширенные функции MMU.