страничная адресация подразумевает что
Вопрос № 8 Сегментная и страничная адресация памяти
Сегментация при работе с ПЭВМ в защищенном режиме реализует функции защиты памяти, а в сочетании со страничным механизмом, по существу, представляет собой средство организации виртуальной памяти. Средства управления памятью в ПЭВМ разделены на две части: механизм сегментации и страничный механизм.
Сегментация обеспечивает изоляцию отдельных модулей программ, данных и стека так, что несколько программ (или задач), могут выполняться на одном и том же процессоре без влияния друг на друга.
Страничный механизм обеспечивает реализацию традиционной виртуальной системы памяти со страничными запросами, при котором исполнительное окружение программы отображается на физическую память. Страничный механизм также может использоваться и для изоляции различных задач.
При работе в защищенном режиме сегментация обязательно используется, так как нет средств для ее отключения. Страничный механизм, напротив, не является обязательным. Два этих механизма можно сконфигурировать для поддержки простых однопрограммных (или однозадачных) систем, многозадачных систем или многопроцессорных систем, разделяющих общую память.
Особенностью архитектуры процессоров INTEL 8086, 80286, 80386, 80486 является использование механизма сегментации адресного пространства.
Однако быстро растущие потребности программ в оперативной памяти привели к необходимости расширения адресного пространства. Следующий микропроцессор 8086 имел уже 20 адресных линий, что позволило непосредственно адресовать до мегабайта оперативной памяти. Архитектурное решение этого микропроцессора позволило легко адаптировать накопленное в большом количестве программное обеспечение для микропроцессора 8080.
Микропроцессор 8086 является шестнадцатиразрядным, поэтому использование двадцатиразрядного адреса в 16-разрядных командах неэффективно. Вместо указания в командах полного 20-разрядного адреса используется двухкомпонентная адресация, причем каждая компонента использует только 16 разрядов.
Эти компоненты называются сегментной компонентой адреса и компонентой смещения. Логический 20-разрядный адрес получается сложением двух компонент, причем сегментный адрес перед сложением умножается на 16 (сдвигается влево на 4 разряда). Сложение и сдвиг выполняется аппаратно, поэтому на формирование 20-разрядного адреса дополнительно время не затрачивается.
На рисунке показано, как в процессоре 8086 происходит формирование 20-разрядного адреса из адреса сегмента и смещения:
¦ Сегментный адрес ¦ 0 0 0 0 ¦
¦ Полный 20-разрядный адрес ¦
Адрес сегмента сдвигается влево на 4 бита с заполнением младших битов нулями, смещение расширяется до 20 битов и складывается со сдвинутым адресом сегмента. Например, если адрес сегмента равен 1234h, а смещение равно 1116h, то полный 20-разрядный адрес будет 12340h + 01116h = 13456h.
Таким образом, оперируя 16-разрядными адресами сегмента и смещением, процессор может адресовать мегабайт памяти. Для хранения сегментных адресов и смещений процессор имеет специальные регистры.
Каждая выполняющаяся программа в любой момент времени может адресоваться сразу к четырем сегментам памяти. Это сегмент кода, сегмент данных, дополнительный сегмент данных, сегмент стека. Сегмент кода содержит выполняющиеся машинные команды, сегменты данных и дополнительных данных используются для размещения используемых программой переменных, массивов и других структур данных, сегмент стека используется при вызове подпрограмм.
Сегменты могут перекрываться или не перекрываться.
Для хранения сегментных адресов процессор имеет 4 сегментных регистра: CS, DS, ES, SS. Эти регистры содержат соответственно адреса сегментов кода, данных, дополнительных данных и стека.
При адресации выполняющегося кода вместе с регистром CS используется регистр смещения IP. Пара регистровCS:IP всегда указывает на текущую выполняющуюся команду.
Адресация данных возможна относительно любого сегментного регистра. При этом смещение может указываться как непосредственно в команде, так и с помощью регистров. Программа должна сама следить за правильной загрузкой и использованием сегментных регистров.
Основное применение страничного преобразования адреса – организация виртуальной памяти. Виртуальная память позволяет использовать программам больший объем памяти, чем установленный на компьютере физический объем памяти. Остальная информация может быть сброшена на внешний носитель.
Управление страничным разбиением памяти обычно возлагается на специальную микросхему MMU (Memory Management Unit – устройство управления памятью). В микропроцессоре i80486 и выше это устройство встроено в процессор.
Страничное управление (Paging) является средством организации виртуальной памяти с подкачкой страниц по запросу (Demand-Paged Virtual Memory). В отличие от сегментации, которая организует программы и данные в модули различного размера, страничная организация оперирует с памятью, как с набором страниц одинакового размера. В момент обращения страница может присутствовать в физической оперативной памяти, а может быть выгруженной на внешнюю (дисковую) память. При обращении к выгруженной странице памяти процессор вырабатывает исключение #PF – отказ страницы, а программный обработчик исключения (часть ОС) получит необходимую информацию для свопинга – «подкачки» отсутствующей страницы с диска.
При разрешенном страничном преобразовании физическая память компьютера разбивается на страницы. Иногда страницы называют страничными кадрами – page frame – размером 4 Кбайт. Поскольку часть страниц находится вне физической памяти, предусмотрен механизм замены страниц по требованию. Это позволяет программам использовать для своих нужд все линейное адресное пространство, не заботясь о том, занята ли физическая память другими процессами.
Границы сегментов и страниц могут не совпадать. Однако желательно, для повышения производительности системы, выравнивать границы сегментов на границы страничного кадра.
В отличие от сегмента, для страниц есть только два уровня привилегий:
— пользовательский (User) – системный программный уровень 3
— супервизора (Supervisor) – системный программный уровень 0,1,2
ФОРМИРОВАНИЕ АДРЕСА ПРИ СТРАНИЧНОМ ПРЕОБРАЗОВАНИИ.
Для уменьшения размера таблицы страниц предусмотрена двухуровневая схема преобразования адреса. Основой страничного преобразования служит регистр управления CR3, содержащий 20-ти битный физический базовый адрес каталога страниц текущей задачи. Предполагается, что каталог выровнен по границе страничного кадра, постоянно находится в памяти и не участвует в свопинге.
Механизм имеет три части:
— каталог страниц (Page Directory) – корневая страница, которая содержит 1024 32-х битных дескриптора, называемых элементами каталога страниц – PDE (Page Directory Entry). Каждый из них адресует подчиненную таблицу страниц.
— таблицы страниц (Page Table) – каждая из этих таблиц содержит 1024 32-х битных дескриптора, называемых элементами таблицы страниц – PTE (Page Directory Entry). Каждый PTE содержит адрес страничного кадра в физической памяти.
— Страницы (Page Frame).
Механизм включается установкой бита PG=1 в регистре CR0. Регистр CR2 хранит линейный адрес отказа (Page Fault Linear Address) – адрес памяти, по которому был обнаружен последний отказ страницы. Регистр CR3 хранит физический адрес каталога страниц (Page Directory Physical Base Address). Его младшие 12 бит всегда нулевые, т.к. каталог выравнивается по границе страницы.
Каталог страниц, размером 4 Кбайт содержит 1024 32-х битных строки PDE. Каждая строка PDE (см.рис.) содержит 20 старших бит адреса таблицы следующего уровня (младшие биты этого адреса всегда нулевые) и признаки (атрибуты) этой таблицы. Индексом поиска в каталоге страниц являются 10 старших бит линейного адреса (А22-А31)
|
Каждая таблица страниц также имеет 1024 строки PTE аналогичного формата (см.рис.), но эти строки содержат базовый физический адрес (Page Frame Address) и атрибуты самих страниц. Индексом поиска в таблице являются биты А12-А21 линейного адреса.
Физический адрес получается из адреса страницы, взятого из таблицы, и младших 12 бит линейного адреса.
Строки каталога и таблиц имеют следующие биты атрибутов:
P (Present) – бит присутствия.Разрешает использования таблицы страниц или кадра страницы при P=1. Если же P=0, то обращение к соответствующему разделу или странице запрещено и попытка их использования вызовет прерывание типа 14 (отсутствие доступа к странице). Отметим, что при P=0 остальные биты доступны операционной системе и могут использоваться для получения информации о местонахождении данной таблицы.
R/W – бит чтения/записи и U/S – бит пользователя/супервизора.Эти биты определяют права доступа к соответствующему разделу или странице для программ пользователя, имеющих минимальные уровни привилегий (системный программный уровень 3). Если осуществляется запрос с уровнем привилегий 3 (программы пользователя), то при значении U/S=0 ему запрещается доступ к соответствующему разделу или кадру страницы. Если U/S=1, то при значении R/W=0 разрешается только чтение раздела или страницы, а при R/W=1 – и чтение, и запись. При запросах с бОльшими привилегиями (системные программные уровни 0,1,2) допускается запись и чтение разделов и страниц при любых значения U/S, R/W.
PWT и PCD –эти биты используются для управления работой кэш-памяти при страничной адресации. (Эти биты отсутствуют в указателях, используемых микропроцессором 80386).
A (Accessed) – бит доступа.Автоматически устанавливается микропроцессором в состояние А=1 при обращении к данному разделу или странице для записи или чтения информации.
D (Dirty) – бит модификации.Этот бит в указателе кадра страницы устанавливается в состояние D=1 при записи на данную страницу. Таким образом, помечается использованная, «грязная» страница, которую в случае замещения необходимо выгрузить на диск.
PS (Page Size) –задает размер страницы (только в POE (Power Over Ethernet) – технология, позволяющая передавать сетевую информацию и одновременно обеспечивать питание Ethernet устройств). При PS=0 имеет размер 4 Кбайт, PS=1 используется в расширениях PAE* и PSE*.
OS Reserved – доступно. Зарезервированы для операционной системы, которая может использовать их для размещения информации о времени последнего обращения к данному разделу или странице. Эта информация используется для определения разделов и страниц, подлежащих замене из внешней памяти.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Страничная память (Операционные Системы)
Страничная память — способ организации виртуальной памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размера (т. н. страница). [1] Типичный размер страницы — 4096 байт, для некоторых архитектур — до 128 КБ.
Поддержка такого режима присутствует в большинстве 32-битных и 64-битных процессоров. Такой режим является классическим для почти всех современных ОС, в том числе Windows и семейства UNIX. Широкое использование такого режима началось с процессора VAX и ОС VMS с конца 70-х годов (по некоторым сведениям, первая реализация). В семействе x86 поддержка появилась с поколения 386, оно же первое 32-битное поколение.
Содержание
Решаемые задачи
Механизм работы
В самом простом и наиболее распространенном случае страничной организации памяти (или paging) как логическое адресное пространство, так и физическое представляются состоящими из наборов блоков или страниц одинакового размера. При этом образуются логические страницы(page), а соответствующие единицы в физической памяти называют физическими страницами или страничными кадрами (page frames).Страницы (и страничные кадры) имеют фиксированную длину, обычно являющуюся степенью числа 2, и не могут перекрываться. Каждый кадр содержит одну страницу данных. При такой организации внешняя фрагментация отсутствует, а потери из-за внутренней фрагментации, поскольку процесс занимает целое число страниц, ограничены частью последней страницы процесса.
Описываемая схема позволяет загрузить процесс, даже если нет непрерывной области кадров, достаточной для размещения процесса целиком.
Число записей в одной таблице ограничено и зависит от размера записи и размера страницы. Используется многоуровневая организация таблиц, часто 2 или 3 уровня, иногда 4 уровня (для 64-разрядных архитектур).
Как и сегментация, страничная организация памяти связана с преобразованием виртуального адреса (в данном случае линейного) в физический. В страничном преобразовании базовым объектом памяти является блок фиксированного размера, называемый страницей (page).
Для уменьшения размера таблицы страниц в микропроцессорах x86 предусмотрена двухуровневая схема преобразования адреса. Основой страничного преобразования служит регистр управления CR3, содержащий 20-ти битный физический базовый адрес каталога страниц текущей задачи. Предполагается, что каталог выровнен по границе страничного кадра, постоянно находится в памяти и не участвует в свопинге. Корневая страница, называемая каталогом страниц, содержит 1024 32-х битных дескриптора, называемых элементами каталога страниц PDE (Page Directory Entry). Каждый из них адресует подчиненную таблицу страниц. Каждая из этих таблиц содержит 1024 32-х битных дескриптора, называемая элементами таблицы страниц. PTE (Page Table Entry). Каждый PTE содержит адрес страничного кадра в физической памяти. Собственно преобразование линейных адресов в физические состоит из следующих действий:
Этот базовый адрес из элемента PTE объединяется с младшими 12-ю битами линейного адреса, образуя 32-х битный физический адрес.
Страничная память x86
Исторически x86 использует 32-битные PTE, 32-битные виртуальные адреса, 4KB-страницы, 1024 записи в таблице, двухуровневые таблицы. Старшие 10 бит виртуального адреса — номер записи в директории, следующие 10 — номер записи в таблице, младшие 12 — адрес внутри страницы. [2]
Начиная с Pentium Pro, процессор поддерживает страницы размером 4Мб. Однако, чтобы система и программы, запущенные в ней, могли использовать страницы такого размера, технология 4-х Мб страниц (hugepages) должна быть соответствующим образом активирована, а приложение настроено на использование страниц такого размера. Процессор x86 в режиме PAE (Physical Address Extension) и в режиме x86_64 (long mode) использует 64-битные PTE (из них реально задействованы не все биты физического адреса, от 36 в PAE до 48 в некоторых x86_64), 32-битные виртуальные адреса, 4KB-страницы, 512 записей в таблице, трехуровневые таблицы с четыремя директориями и четыремя записями в супер-директории. Старшие 2 бита виртуального адреса — номер записи в супер-директории, следующие 9 — в директории, следующие 9 — в таблице. Физический адрес директории или же супер-директории загружен в один из управляющих регистров процессора.
При использовании PAE вместо 4МБ больших страниц используются двухмегзбайтные. В архитектуре x86_64 возможно использовать страницы размером 4 килобайта (4096 байт), 2 мегабайта, и (в некоторых AMD64) 1 гигабайт.
Страничное прерывание
Некоторые процессоры (MIPS) не имеют обращающегося к таблице микрокода, и генерируют отказ страницы сразу после неудачи поиска в TLB, обращение к таблице и её интерпретация возлагаются уже на обработчик отказа страницы. Это лишает таблицы страниц требования соответствовать жёстко заданному на уровне аппаратуры формату.
Причины отказа страницы (page fault):
Алгоритм работы страничного прерывания:
Обработчик отказов в ядре может загрузить нужную страницу из файла или же из области подкачки, может создать доступную на запись копию страницы «только для чтения», а может и возбудить исключительную ситуацию (в терминах UNIX — сигнал SIGSEGV) в данном процессе.
Таблицы страниц
Если страница не присутствует в памяти (бит P=0), то процессор не использует все остальные биты элемента PTE и программа может их использовать по своему усмотрению.
Таблицы страниц процессов
Каждый процесс имеет свой собственный набор таблиц страниц. Регистр «директория страниц» перегружается при каждом переключении контекста процесса. Также необходимо очистить ту часть TLB, которая относится к этому процессу.
В большинстве случаев ядро ОС помещается в то же адресное пространство, что и процессы, для него резервируется верхние 1-2 гигабайта 32-битного адресного пространства каждого процесса. Целью этих действий является предотвращение переключению таблиц страниц при входе в ядро на выходе из него. Страницы ядра помечаются как недоступные для кода режима пользователя.
Память региона ядра часто одинакова для всех процессов, но некоторые подрегионы ядра (например, регион, где находится подсистема графики и видео-драйвер) могут быть различным для разных групп процессов.
Потому что память ядра одинакова для всех процессов, соответствующие к ней записи в TLB не нужно перезагружать после переключения процесса. Для этой оптимизации архитектура x86 поддерживает флажок «глобальный» в PTE.
Работа менеджера памяти Windows
Для управления виртуальной памятью в операционной системе Windows предусмотрен специальный менеджер Virtual Memory Manager (VMM). Он является составной частью ядра операционной системы и представляет собой отдельный процесс, постоянно находящийся в оперативной памяти. Основная задача VMM заключается в управлении страницами виртуальной памяти. [4]
Каждому процессу VMM выделяет часть физической памяти, которая называется рабочим набором (Working Set). Кроме того, VMM создает базу состояния страниц (page-frame database), которая организована как шесть списков страниц одного типа. Выделяют следующие типы страниц:
Свободные страницы могут применяться, однако прежде они подлежат процедуре обнуления (заполнения нулями). Процедурой обнуления страниц занимается специальная подпрограмма менеджера памяти Zero Page Thread;
Как уже отмечалось, если какой-нибудь процесс обращается к странице, которой нет в рабочем наборе (в списке Valid), то возникает ошибка обращения к странице. В этом случае задача VMM заключается в том, чтобы разрешить данную ситуацию и выделить странице свободной физической памяти для хранения данных, к которым обратился процесс. Существует два варианта развития событий:
В идеале замещению должна подлежать та страница, к которой в будущем не будет обращений, или страница, которая не будет использоваться дольше других. Однако достоверного способа определить, какая именно страница отвечает перечисленным критериям, нет. Поэтому менеджер памяти применяет следующий алгоритм. Он периодически просматривает список рабочих страниц (Valid) и помечает их как отсутствующие (P = 0). Однако данные страницы не удаляются из рабочего процесса — они остаются на месте и просто переводятся из категории Valid в категорию модифицированных (Modified) или резервных (Standby) страниц ( никаких изменений в содержимом этих страниц не производится). Если измененная таким образом страница требуется какому-нибудь процессу, то происходит обращение к ней и возникает ошибка обращения к странице. Но поскольку в действительности страница находится в физической памяти и ее содержимое не подвергалось изменению, то менеджеру памяти достаточно перевести данную страницу обратно в категорию Valid, сделав ее доступной для процесса. Если же страница не используется в течение длительного времени процессами и обращений к ней не происходит, она со временем переводится в категорию свободных (Free) страниц, а затем обнуляется и переводится в категорию пустых (Zeroed) страниц.
Таким образом, менеджер памяти автоматически забирает страницы из рабочих наборов неактивных процессов, то есть процессы, не проявляющие активности в течение длительного времени и автоматически освобождает всю физическую память.
Отображаемые в память файлы
Обработчик отказа страницы в ядре способен прочитать данную страницу из файла.
Это приводит к возможности легкой реализации отображенных в память файлов. Концептуально это то же, что выделение памяти и чтение в неё отрезка файла, с той разницей, что чтение осуществляется неявно «по требованию», выраженному отказом страницы при попытке обращения к ней.
Вторым преимуществом такого подхода является — в случае отображения «только для чтения» — разделение одной и той же физической памяти между всеми процессами, отображающими данный файл (выделенная же память своя у каждого процесса).
Третьим преимуществом является возможность «забывания» (discard) некоторых отображенных страниц без выгрузки их в область подкачки, обязательной для выделенной памяти. В случае повторной потребности в странице она может быть быстро загружена из файла снова.
Четвертым преимуществом является не-использование дискового кэша в этом режиме, что означает экономию на копировании данных из кэша в запрошенный регион. Преимущества дискового кэша, оптимизирующего операции небольшого размера, а также повторное чтение одних и тех же данных, полностью исчезают при чтениях целых страниц и тем более их групп, недостаток же в виде обязательного лишнего копирования — сохраняется.
Отображаемые в память файлы используется в ОС Windows, а также ОС семейства UNIX, для загрузки исполняемых модулей и динамических библиотек. Они же используются утилитой GNU grep для чтения входящего файла, а также для загрузки шрифтов в ряде графических подсистем.
Сегментно-страничная виртуальная память
Существуют две другие схемы организации управления памятью: сегментная и сегментно-страничная. [5] Сегменты, в отличие от страниц, могут иметь переменный размер. При сегментной организации виртуальный адрес является двумерным как для программиста, так и для операционной системы, и состоит из двух полей – номера сегмента и смещения внутри сегмента. Главное отличие сегментной организации от страничной в том, что в последней линейный адрес преобразован в двумерный операционной системой для удобства отображения, а сегментной двумерность адреса является следствием представления пользователя о процессе не в виде линейного массива байтов, а как набор сегментов переменного размера.
Логическое адресное пространство – набор сегментов. Каждый сегмент имеет имя, размер и другие параметры (уровень привилегий, разрешенные виды обращений, флаги присутствия). В отличие от страничной схемы, где пользователь задает только один адрес, в сегментной схеме пользователь специфицирует каждый адрес двумя величинами: именем сегмента и смещением.
Каждый сегмент – линейная последовательность адресов, начинающаяся с 0. Максимальный размер сегмента определяется разрядностью процессора (при 32-разрядной адресации это 232 байт или 4 Гбайт). Размер сегмента может меняться динамически (например, сегмент стека). В элементе таблицы сегментов помимо физического адреса начала сегмента обычно содержится и длина сегмента. Если размер смещения в виртуальном адресе выходит за пределы размера сегмента, возникает исключительная ситуация.
Логический адрес – упорядоченная пара v=(s,d), номер сегмента и смещение внутри сегмента.
В системах, где сегменты поддерживаются аппаратно, эти параметры обычно хранятся в таблице дескрипторов сегментов, а программа обращается к этим дескрипторам по номерам-селекторам. При этом в контекст каждого процесса входит набор сегментных регистров, содержащих селекторы текущих сегментов кода, стека, данных и т. д. и определяющих, какие сегменты будут использоваться при разных видах обращений к памяти. Это позволяет процессору уже на аппаратном уровне определять допустимость обращений к памяти, упрощая реализацию защиты информации от повреждения и несанкционированного доступа.
Хранить в памяти сегменты большого размера целиком так же неудобно, как и хранить процесс непрерывным блоком. Отсюда получается идея разбиения сегментов на страницы. При сегментно-страничной организации памяти происходит двухуровневая трансляция виртуального адреса в физический. В этом случае логический адрес состоит из трех полей: номера сегмента логической памяти, номера страницы внутри сегмента и смещения внутри страницы. Соответственно, используются две таблицы отображения – таблица сегментов, связывающая номер сегмента с таблицей страниц, и отдельная таблица страниц для каждого сегмента.
Огромным достоинством страничной виртуальной памяти по сравнению с сегментной является отсутствие «ближних» и «дальних» указателей. Наличие таких концепций в программировании уменьшает применимость арифметики указателей, и приводит к огромным проблемам с переносимостью кода с/на такие архитектуры. Так, например, значительная часть ПО с открытым кодом изначально разрабатывалась для бессегментных 32-битных платформ со страничной памятью и не может быть перенесена на сегментные архитектуры без серьёзной переработки.