Top-office11.ru

IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Страничная адресация памяти

Организация памяти компьютера. Простейшие схемы управления памятью

Страничная память

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

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

Логический адрес в страничной системе – упорядоченная пара (p,d), где p – номер страницы в виртуальной памяти, а d – смещение в рамках страницы p, на которой размещается адресуемый элемент. Заметим, что разбиение адресного пространства на страницы осуществляется вычислительной системой незаметно для программиста. Поэтому адрес является двумерным лишь с точки зрения операционной системы, а с точки зрения программиста адресное пространство процесса остается линейным.

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

Интерпретация логического адреса показана на рис. 8.7. Если выполняемый процесс обращается к логическому адресу v = (p,d), механизм отображения ищет номер страницы p в таблице страниц и определяет, что эта страница находится в страничном кадре p’, формируя реальный адрес из p’ и d.

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

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

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

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

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

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

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

Каждый сегмент – линейная последовательность адресов, начинающаяся с 0. Максимальный размер сегмента определяется разрядностью процессора (при 32-разрядной адресации это 2 32 байт или 4 Гбайт). Размер сегмента может меняться динамически (например, сегмент стека). В элементе таблицы сегментов помимо физического адреса начала сегмента обычно содержится и длина сегмента . Если размер смещения в виртуальном адресе выходит за пределы размера сегмента , возникает исключительная ситуация .

Логический адрес – упорядоченная пара v=(s,d), номер сегмента и смещение внутри сегмента .

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

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

Хранить в памяти сегменты большого размера целиком так же неудобно, как и хранить процесс непрерывным блоком. Напрашивается идея разбиения сегментов на страницы . При сегментно-страничной организации памяти происходит двухуровневая трансляция виртуального адреса в физический. В этом случае логический адрес состоит из трех полей: номера сегмента логической памяти , номера страницы внутри сегмента и смещения внутри страницы . Соответственно, используются две таблицы отображения – таблица сегментов , связывающая номер сегмента с таблицей страниц , и отдельная таблица страниц для каждого сегмента .

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

Заключение

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

gOWNOS

Your own GNU operating system

Урок 6. Страничная адресация

В данном уроке мы собираемся настроить страничную адресацию. Она служит для двух целей: для защиты памяти и организации виртуальной памяти.

6.1. Виртуальная память (теория)

Если Вы уже знаете что такое виртуальная память — Вы можете пропустить данный раздел.

В Linux, если Вы создаете простую программу:
скомпилируете ее и затем выполните:
вы можете обнаружить что-то похожее на это:
Удивительно. Адрес начала программы 0x080482e0 , что примерно равно 128 МБ в адресном пространстве. А ведь на компьютерах с размером оперативной памяти менее 128 МБ эта программа также прекрасно работает.

Программа оперирует вдресами виртуальной памяти. Части этой памяти отображаются на физическую память, а часть — нет. Если Вы попытаетесь получить доступ к неотображенным участкам виртуальной памяти, то ЦП инициирует прерывание Page Fault. Обычно ОС обрабатывает это прерывание и посылает процессу сигнал SIGSEGV, за которым как правило следует SIGKILL.

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

Читать еще:  Если забыл адрес электронной почты

Виртуальная память такого типа должна поддерживаться оборудованием. Ее невозможно эмулировать программно. К счастью, такая поддержка в архитектуре x86 предусмотрена. Она называется MMU (memory management unit, Блок управления памятью). MMU берет на себя все заботы по отображению виртуальной памяти на физическую, выступая посредником между ЦП и физической памятью.

6.2. Виртуальная память и страничная адресация

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

При страничной адресации память разбивается на части, называемые страницами, размером 4 кБ каждая. Затем эти страницы могут быть отображены на кадры — блоки физической памяти эквивалентного размера.

6.2.1. Страничные записи

Каждый процесс обладает своим собственным набором страничных отображений. Таким образом, пространства виртуальной памяти каждого процесса независимы. В архитектуре x86 размер страниц фиксирован. Каждая страница имеет дескриптор, который содержит информацию о кадре, на который она отображается (размер дескриптора — 32 бита). Так как страницы и кадры должны быть выровнены по границе страницы (4 кБ = 4 * 0х1000 Б), последние 12 бит дескриптора всегда равны нулю. В эти биты помещается служебная информация. Дескриптор выглядит так:

Поля, представленные на рисунке, очень просты. Давайте пробежимся по ним:

P
установлен, если страница представлена в памяти

R/W
Если установлен, то страница доступна для записи. Игнорируется, если код исполняется в режиме ядра.

U/S
Если установлен, то это страница уровня пользователя. В противном случае — уровня ядра. В режиме пользователя нельзя читать или записывать в страницы уровня ядра.

A
Установлен, если к странице уже обращались.

D
Установлен, если к странице обращались для записи.

AVAIL
Эти три бита не используются и доступны для использования ядром ОС.

Page frame address
Старшие 20 бит адреса кадра в физической памяти.

6.2.2. Каталоги и таблицы страниц

Возможно вы уже прикинули на калькуляторе и выяснили, что для того, чтобы хранить таблицу отображений страниц на кадры для адрессного пространства размером 4 ГБ, необходимо выделить для нее 4 МБ.

4 МБ может казаться не очень большой ценой, если у вас есть 4 ГБ физической памяти. А если у вас 16 МБ? Эта таблица займет четверть доступного пространства. Нам необходимо, чтобы размер таблицы был пропорционален размеру физической памяти.

Intel предлагает воспользоваться двухуровневой системой: в ЦП сообщается адрес каталога страниц размером 4 кБ, каждая запись в котором содержит адрес таблицы страниц размером 4 кБ. Каждая запись таблицы страниц указывает на конкретную страницу.

Таким образом, все адресное пространство (4 ГБ) может быть представлено при помощи этой схемы. Если таблица страниц не имеет записей, то она может быть освобождена и ее флаг P (present) сброшен в каталоге страниц.

6.2.3. Включаем страничную адресацию

6.3. Page faults

Если процесс сделает что-то, что не понравится нашему MMU, будет сгенерировано прерывание номер 14 (Page fault). Это прерывание может быть сгенерировано в следующих случаях:

  • Чтение или запись в область памяти, которая не была отображена;
  • Процесс пользовательского уровня пытается записать в область памяти, предназначенную только для чтения;
  • Процесс пользовательского уровня пытается получить доступ к области памяти уровня ядра;
  • Запись в таблице страниц испорчена (значение зарезервированных битов было изменено).

Если мы обратимся к 4 уроку, то можем убедиться, что прерывание номер 14 проталкивает в стек код ошибки. Этот код может сообщить нам причины возникновения прерывания.

Бит 0
Если установлен, то прерывание произошло НЕ по причине отсутствия страницы. Если сброшен — страница не существует.

Бит 1
Если установлен, то процесс пытался записать в память, когда было сгенерировано исключение. Если сброшен — то пытался прочитать.

Бит 2
Если установлен, то процессор находился в пользовательском режиме. Если сброшен — в режиме ядра.

Бит 3
Если установлен, то причиной послужила некорректное значение зарезервированной секции.

Бит 4
Если установлен, то прерыавние вызвано программно.

Процессор также сообщает нам адрес в памяти, обращение к которому вызвало прерывание. Он помещается в регистр CR2. Будьте осторожны, т.к. если ваш обработчик 14 прерывания повторно вызовет Page fault, значение в этом регистре будет перезаписано.

6.4. От теории к практике

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

6.4.1. Простой менеджер памяти

Если вы знакомы с языком С++, то наверняка слышали об операторе ‘placement new’. Эта версия оператора не выделяет память для объекта, а только создает его в уже выделенной области памяти. Наш менеджер памяти будет очень похож на этот оператор.

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

Если мы выделяем память на ранней стадии загрузки ядра, мы можем сделать предположение о том, что нет необходимости в освобождении этой памяти. То есть нам не нужна будет функция kfree(). Это значительно упрощает нам жизнь. Нам достаточно иметь указатель (placement address) на свободную память, который мы возвращаем запрашивающей память функции, а затем просто увеличиваем значение указателя. Пример:

Этой функции достаточно. Тем не менее, у нас есть некоторые требования к этой функции. Во-первых, когда мы выделяем память для таблиц и каталогов страниц, они должны быть выравнены по границе страницы.

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

Отлично. Этих функция для нашего простейшего менеджера памяти вполне достаточно. Добавим эти функции в файл kheap.c, а в kheap.h пойдет их объявление:

6.4.2. Необходимые объявления

Файл paging.h должен включать в себя несколько специальных объявлений:

Обратите внимание на tablesPhysical и physicalAddr. physicalAddr используется только в случае клонирования каталога страниц. Учтите, что с этого момента новый каталог будет иметь адрес в виртуальной памяти, который не равен адресу в физической памяти. А для загрузки в регистр нам нужен именно физический адрес каталога страниц. Для этого мы его и храним, на случай если решим сменить каталог. Аналогичная роль отведена и массиву tablesPhysical.

Перед нами стоит проблема: Как нам получить доступ к таблицам страниц? На первый взгляд все просто, но помните, что в каталоге страниц содержаться физические адреса таблиц, не виртуальные. А единственный возможный способ записи/чтения — это использование виртуальных адресов.

Первое решение, которое приходит на ум — это отобразить первую страницу таблицы на кадр, содержащий саму таблицу. Таким образом вы получите доступ к записям таблицы как к обычным целочисленным значениям. Но этот метод немного нелогичен и требует некоторого количества памяти (256 МБ). Поэтому мы пойдем другим путем.

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

6.4.3. Выделение кадра

Если мы захотим отобразить страницу на кадр, нам необходим способ поиска свободного кадра. Конечно, мы можем просто определить массив целочисленных значений в который будем помещать 0 или 1 в зависимости от занятости кадра. Но это несколько нелепо использовать 32 бита для значения, которое может поместиться в одном. Так что самым разумным решением будет использовать bitmap.

Нам понадобятся четыре функции:

Читать еще:  Основы ip адресации

Надеюсь, что этот код не вызывает вопросов. Это просто функции для работы с bitmap. Теперь напишем функции выделения и освобождения кадра:

Макрос PANIC просто вызывает глобальную функцию panic(), которая принимает в качестве аргументов сообщение, __FILE__ и __LINE__ где произошел вызов. Функция panic() выводит все это на экран и уходит в бесконечный цикл, останавливая выполнения кода ядра.

Определим пока что для него заглушку:

6.4.4. Последнее, но не в последнюю очередь

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

get_page() возвращает указатель на запись в таблице страниц для заданного адреса. Если задан аргумент make, и таблица страниц, в которой должна располагаться запись, не существует — то такая таблица создается. Если же таблица существует, то функция просто возвращает запись из этой таблицы.

Функция get_page() использует kmalloc_ap() для выделения блока памяти, выравненного по границе страницы. Физический адрес таблицы помещается в tablesPhysical (после добавления нескольких служебных бит, сообщающих ЦП, что данный блок памяти существует, доступен для записи, и доступен для доступа из пользовательского режима); виртуальный адрес записывается в массив tables.

initialise_paging() создает bitmap и устанавливает значение всех битов в нем в 0. Затем она выделяет память для каталога страниц. После этого, она выделяет кадры таким образом, чтобы адрес в виртуальной памяти отображался на тот же адрес в физической памяти. Это делается для маленькой секции адресного пространства, так что код ядра может продолжать выполняться в штатном режиме. Затем функция регистрирует обработчик 14 прерывания и включает страничную адресацию.

6.4.5. Обработчик page fault

Этот обработчик выводит замечательное сообщение об ошибке на экран. Он берет адрес который вызвал ошибку из регистра CR2 и анализирует код ошибки, возвращаемый ЦП.

6.4.6. Тестируем
Добавим строки в файл main.c:

А теперь соберем и запустим нашу ОС. На экране должно отобразиться следующее:

Ура. Теперь наше ядро поддерживает страничную адресацию. А также может обрабатывать ошибки доступа к памяти. Это очень хорошо.

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

Страничная адресация памяти

Режимы работы микропроцессора.

1. Режимы работы микропроцессора

2. Организация памяти

· Модели использования оперативной памяти (сегментированная, страничная)

· Понятие о сегментированной модели памяти

· Понятие о страничной модели памяти

· Сегментно-страничный способ распределения памяти

3. Плоская модель памяти

Режимы работы микропроцессора

Это режим работы первых 16-битовых микропроцессоров . Наличие его обусловлено тем, что необходимо обеспечить в новых моделях микропроцессоров функционирование программ, разработанных для старых моделей.

Защищенный режим ( protected mode)

Означает, что параллельные вычисления могут быть защищены программно-аппаратным путем.

Позволяет полностью использовать все возможности, предоставляемые микропроцессором. Все современные многозадачные ОС работают в этом режиме.

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

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

Режим виртуального 8086

Переход в этот режим возможен, если микропроцессор уже находится в защищенном режиме. Возможна одновременная работа нескольких программ разработанных для i 8086. Возможно работа программ реального режима. Физический адрес формируется по правилам реального режима.

Физическая память, к которой микропроцессов имеет доступ по шине адреса, называется оперативной памятью ( или оперативным запоминающим устройством — ОЗУ).

ОП организована как последовательность байтов.

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

Диапазон значений адресов зависит от разрядности шины адреса микропроцессора.

Для i486 и Pentium он находится в диапазоне от 0 до 2**32-1 — 4 Гбайт (32-разрядная шина адреса).

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

Микропроцессор аппаратно поддерживает несколько моделей использования оперативной памяти:

Понятие о сегментированной модели памяти

Память для программы делится на непрерывные области памяти, называемые сегментами.

Сегменты — это логические элементы программы.

Сама программа может обращаться только к данным, которые находятся в этих сегментах.

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

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

Замечание. Программист может либо самостоятельно разбивать программу на фрагменты (сегменты), либо автоматизировать этот процесс и возложить его на систему программирования.

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

Операционная система (! а не сама программа) размещает сегменты программы в ОП по определенным физическим адресам, а значения этих адресов записывает в определенные места, в зависимости от режима работы микропроцессора:

· в реальном режиме адреса помещаются непосредственно в сегментные регистры ( cs, ds, ss, es, gs, fs) ;

· в защищенном режиме — в специальную системную дескрипторную таблицу (Элементом дескрипторной таблицы является дескриптор сегмента. Каждый сегмент имеет дескриптор сегмента -8 байт. Существует три дескрипторные таблицы. Адрес каждой таблицы записывается в специальный системный регистр).

Для доступа к данным внутри сегмента обращение производится относительно начала сегмента линейно, т.е. начиная с 0 и заканчивая адресом, равным размеру сегмента. Этот адрес называется смещением (offset ) .

Таким образом, для обращения к конкретному физическому адресу ОП необходимо определить адрес начала сегмента и смещение внутри сегмента.

Физический адрес принято записывать парой этих значений, разделенных двоеточием

Например, 0040:001Ch; 0000:041Ch; 0020:021Ch; 0041:000Ch .

Каждый сегмент описывается дескриптором сегмента.

ОС строит для каждого исполняемого процесса соответствующую таблицу дескрипторов сегментов и при размещении каждого из сегментов в ОП или внешней памяти в дескрипторе отмечает его текущее местоположение (бит присутствия).

Дескриптор содержит поле адреса, с которого сегмент начинается и поле длины сегмента. Благодаря этому можно осуществлять контроль

1) размещения сегментов без наложения друг на друга

2) обращается ли код исполняющейся задачи за пределы текущего сегмента.

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

1) общий объем виртуальной памяти превосходит объем физической памяти

2) возможность размещать в памяти как можно больше задач (до определенного предела) Þ увеличивает загрузку системы и более эффективно используются ресурсы системы

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

3) потери памяти на размещение дескрипторных таблиц

4) потери процессорного времени на обработку дескрипторных таблиц.

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

Понятие о страничной модели памяти

Это надстройка над сегментной моделью.

ОП делится на блоки фиксированного размера 4 Кб (должно быть число, кратное степени двойки, чтобы операции сложения можно было бы заменить на операции конкатенации).

Каждый такой блок называется страницей.

Их число 1.048.576 Þ 4 Гб адресуемой памяти.

Основное применение этой модели связано с организацией виртуальной памяти.

Для того, чтобы использовать для работы программ пространство памяти большее, чем объем физической памяти используется механизм виртуальной памяти.

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

Читать еще:  Емайл адрес примеры

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

В настоящее время файл подкачки может динамически изменять свой размер в зависимости от потребностей системы.

Для i486 и Pentium размер возможной виртуальной памяти может достигать 4 Тб (терабайт).

Обратим внимание на то, что программа также разбивается на фрагменты — страницы. Все фрагменты программы одинаковой длины, кроме последней страницы.

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

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

Для каждой текущей задачи создается таблица страниц.

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

Если он = 1, это означает, что данная страница сейчас размещена в ОП.

Если он = 0, то страница расположена во внешней памяти.

Защита страничной памяти основана на контроле уровня доступа к каждой странице.

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

Страничная модель памяти поддерживается только в защищенном режиме работы микропроцессора.

Основное достоинство страничного способа распределения памяти —

минимально возможная фрагментация (эффективное распределение памяти).

1) потери памяти на размещение таблиц страниц

2) потери процессорного времени на обработку таблиц страниц (диспетчер памяти).

3) Программы разбиваются на страницы случайно, без учета логических взаимосвязей, имеющихся в коде Þ межстраничные переходы осуществляются чаще, чем межсегментные + трудности в организации разделения программных модулей между выполняющими процессами

Чтобы избежать недостатка №3 был предложен сегментно-страничный способ распределения памяти.

Сегментно-страничный способ распределения памяти

Программа разбивается на сегменты.

Адрес, по-прежнему, состоит из двух частей — сегмент + смещение.

Но смещение относительно начала сегмента может состоять из двух полей: виртуальной страницы и индекса.

Для доступа к памяти необходимо:

1) вычислить адрес дескриптора сегмента и причитать его;

2) вычислить адрес элемента таблицы страниц этого сегмента и извлечь из памяти необходимый элемент;

3) к номеру (адресу) физической страницы приписать номер (адрес) ячейки в странице.

Þ Задержка в доступе к памяти (в три раза больше, чем при прямой адресации).

Чтобы избежать этого вводится кэширование (кэш строится по ассоциативному принципу). Мы будем это изучать позже.

Плоская модель памяти

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

Это подход называется плоской памятью.

· При использовании плоской модели памяти упрощается создание и ОС, и систем программирования.

· уменьшаются расходы памяти на поддержку системных информационных структур

В абсолютном большинстве современных 32-разрядных ОС (для микропроцессоров Intel ) используется плоская модель памяти.

Адресация и многозадачность: Страничный механизм

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

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

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

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

Рис. 2.4. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36

Расширение физического адреса (PAE)

В процессорах начиная с Pentium Pro возможна реализация специального механизма расширения физического адреса (управляется битом CR4.PAE). При этом процессор может адресовать физическую память объемом до 2 36 байт (64 Гб). Для поддержки работы данного расширения некоторые изменения вводятся и в механизм страничных преобразований. Заметим, что изменения касаются только страничного механизма, формирование линейного адреса происходит обычным образом независимо от текущего значения CR4.PAE и линейный адрес всегда остается 32-битным. Но поскольку для каждой задачи может быть задан свой протокол отображения линейного адреса на физический, в многозадачной среде становится возможным использование физической памяти объемом больше, чем общий объем линейного адресного пространства, доступного каждой конкретной задаче (2 32 байт).

Когда расширение физического адреса включено (CR4.PAE = 1) страничный механизм поддерживает страницы размером 4 Кб и 2 Мб, а в иерархию таблиц страничных преобразований вводится еще одна таблица — таблица указателей на каталоги страниц (рис. 2.5.).

Рис. 2.5. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса

36-битное расширение размера страниц (PSE-36)

Еще одно расширение страничного механизма может вводится в процессоры поддерживающие 36-разрядную адресацию физической памяти (Pentium Pro …). PSE‑36 (36-bit Page Size Extension) — 36-битное расширение размера страниц. Это расширение не является управляемым, т.е. не может включаться/выключаться специальными битами в управляющих регистрах, оно либо поддерживается процессором, либо нет (определяется командой CPUID).

Расширение PSE-36 позволяет организовать отображение 4 Мб страниц на 36-битное физическое адресное пространство. Характерно, что осуществляется это небольшой модификацией режима 32-битного физического адреса (CR4.PAE = 0, CR4.PSE = 1). В режиме 36-битного адреса (CR4.PAE = 1) PSE-36 не оказывает никакого влияния на работу процессора, так как структура таблиц страничных преобразований изменена и уже предполагает 36-битную адресацию.

Поддержка PSE-36 означает, что в элементе каталога страниц для 4 Мб страницы вместо 10 бит базового адреса страницы поддерживается 14 бит. Старшие 4 бита располагаются в поле ранее считавшемся зарезервированным и заполнявшемся нулями. Такое решение позволяет программному обеспечению, написанному для более ранних моделей процессоров, которые не поддерживают PSE-36, без изменений работать на всех современных моделях (если только ПО как-либо не использовало зарезервированные биты или не записывало в них единицы). Программы же, написанные для процессоров с поддержкой PSE-36 и использующие это расширение, не смогут нормально функционировать на процессорах без PSE-36.

Таблица 2.2. Размерность физического адреса в различных режимах работы процессора: Pentium Pro …

CR0.PG

CR4.PAE

CR4.PSE

Поле PS в элементе каталога страниц

Размер страниц

Размер физического адреса с PSE-36 / без PSE-36

Ссылка на основную публикацию
Adblock
detector