Московский физико-технический институт
Опубликован: 12.12.2007 | Доступ: свободный | Студентов: 5489 / 1826 | Оценка: 4.34 / 4.14 | Длительность: 13:57:00
ISBN: 978-5-94774-827-7
Лекция 9:

Введение. Виртуальное адресное пространство процесса

< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Аннотация: Система управления памятью является одной из наиболее важных в составе ОС. Традиционная схема предполагает связывание виртуального и физического адресов на стадии исполнения программы. Для управления виртуальным адресным пространством в нем принято организовывать сегменты (регионы), для описания которых используются структуры данных VAD (Virtual Address Descriptors). Для создания региона и передачи ему физической памяти можно использовать функцию VirtualAlloc. Описана техника использования таких регионов, как куча процесса, стек потока и регион файла, отображаемого в память
Ключевые слова: фон-Неймановская архитектура, управление памятью, менеджер, память, информация, процессор, ПО, время доступа, k-упорядоченный массив, адрес, операции, запись, физическая память, логическая память, абстракция, программа, стек, права доступа, байт, логический, трансляция, Windows, виртуальная память, интерфейс, отображение, страничная виртуальная память, представление, функция, кадр, page fault, страничная модель, поддержка, таблица страниц, пространство, VAD, virtual address, адресное пространство процесса, виртуальная страница, PFN, page frame, код программы, деятельность, виртуальное, быстродействие, производительность, монитор, множества, утилита, диапазон, API, адресное пространство, разделяемая память, контроль, объект, section, Object, PCB, гранулярность, heap manager, создание процесса, Задача синхронизации, guard, системная область, диск, анализ, связывание, сегменты, куча

Введение

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

Для описания системы управления памятью активно используются понятия физической и логической (виртуальной) памяти.

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

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

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

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

Расположение сегментов процессов в памяти компьютера

Рис. 9.1. Расположение сегментов процессов в памяти компьютера

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

Связывание адресов

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

Формирование логического адреса и связывание логического адреса с физическим

Рис. 9.2. Формирование логического адреса и связывание логического адреса с физическим

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

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

Общее описание виртуальной сегментно-страничной памяти ОС Windows

Размер пользовательского процесса ограничен объемом логического адресного пространства. Характерный размер логической памяти определяется разрядностью архитектуры и составляет для современных систем 232 (в недалеком будущем 264) байт. Эта величина обычно существенно превышает объем оперативной памяти, поэтому часть пользовательского процесса прозрачным образом может быть размещена во внешней памяти. Поэтому у пользователя создается иллюзия того, что он имеет дело с виртуальной памятью, отличной от реальной, размер которой потенциально больше, чем размер оперативной памяти. В дальнейшем наряду с термином "логическая память" будет употребляться термин "виртуальная память".

Для определения схемы виртуальной памяти, реализованной в ОС Windows, лучше всего подходит термин "сегментно-страничная виртуальная память". Подробное описание сегментно-страничной модели можно найти в [ Карпов ] . Для нее характерно представление адресного пространства процесса в виде набора сегментов переменного размера, содержащих однородную информацию (данные, текст программы, стек, сегмент разделяемой памяти и др.). Для удобства отображения на физическую память каждый сегмент делится на страницы - блоки фиксированного размера, при этом физическая память делится на блоки того же размера - страничные кадры (фреймы). Функция связывания логического адреса с физическим возлагается на таблицу страниц, которая каждой логической странице сегмента ставит в соответствие страничный кадр. В тех случаях, когда для нужной страницы не находится места в оперативной памяти (page fault), она подкачивается с диска. Заметим, что в каноническом виде данной схемы каждый сегмент процесса находится в отдельном логическом адресном пространстве и использует свою собственную таблицу страниц. Последнее обстоятельство, в силу сложной организации и большого объема таблицы страниц, имеет следствием тот факт, что реальные системы редко придерживаются канонической формы.

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

Одна из задач, которая решается при этом, - избежать появления в системе большого количества таблиц страниц за счет организации неперекрывающихся регионов в одном виртуальном пространстве, для описания которого хватает одной таблицы страниц. Таким образом, одна таблица страниц будет отводиться для всех сегментов памяти процесса. То, как это делается можно увидеть на рис. 9.3. Задействовано всего четыре аппаратных сегмента с номерами селекторов 08, 10, 1b и 23. Первый используется для адресации кода ОС и имеет атрибуты RE, второй с атрибутами RW - для данных и стека ОС, третий с атрибутами RE - для кода пользовательского процесса, а четвертый с атрибутами RW - для данных и стека пользовательского процесса. Первые два сегмента недоступны для непривилегированного режима работы процессора.

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

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

Рис. 9.3. Образование неперекрывающихся регионов (программных сегментов) в линейном виртуальном адресном пространстве процесса

Любопытно, что наличие у аппаратного сегмента атрибута не является препятствием для нецелевого использования хранимой в сегменте информации. Например, код процесса, находящийся в сегменте 1b, может быть доступен через 23-й сегмент с атрибутами RW. Собственно защита регионов организована на уровне их описателей, которые хранятся в таблице описателей VAD (virtual address descriptors) в адресном пространстве процесса. Таким образом, аппаратная поддержка сегментации обеспечивает лишь минимальную защиту - невозможность доступа к данным ОС из непривилегированного режима. Можно сказать, что в ОС Windows осуществляется программная поддержка сегментации (в данном случае регионов). Между прочим, многие другие ОС (например, Linux) ведут себя аналогично. Программная поддержка сегментов более универсальна и способствует большей переносимости кода. В дальнейшем для обозначения непрерывного фрагмента виртуального адресного пространства, содержащего однородную информацию, будет использоваться термин "регион".

Таблица страниц ставит в соответствие виртуальной странице номер страничного кадра в оперативной памяти. Для описания совокупности занятых и свободных страничных кадров ОС Windows использует базу данных PFN (page frame number). В силу несоответствия размеров виртуальной и оперативной памяти достаточно типичной является ситуация отсутствия нужной страницы в оперативной памяти (page fault). К счастью, копии всех задействованных виртуальных страниц хранятся на диске (так называемые теневые страницы). В случае обращения к отсутствующей странице ОС должна разыскать соответствующую теневую страницу и организовать ее подкачку с диска.

< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Ирина Оленина
Ирина Оленина
Николай Сергеев
Николай Сергеев

Здравствуйте! Интересует следующий момент. Как осуществляется контроль доступа по тому или иному адресу с точки зрения обработки процессом кода процесса. Насколько я понял, есть два способа: задание через атрибуты сегмента (чтение, запись, исполнение), либо через атрибуты PDE/PTE (чтение, запись). Но как следует из многочисленных источников, эти механизмы в ОС Windows почти не задействованы. Там ключевую роль играет менеджер памяти, задающий регионы, назначающий им атрибуты (PAGE_READWRITE, PAGE_READONLY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_NOACCESS, PAGE_GUARD: их гораздо больше, чем можно было бы задать для сегмента памяти) и контролирующий доступ к этим регионам. Непонятно, на каком этапе может включаться в работу этот менеджер памяти? Поскольку процессор может встретить инструкцию: записать такие данные по такому адресу (даже, если этот адрес относится к региону, выделенному менеджером памяти с атрибутом, например, PAGE_READONLY) и ничего не мешает ему это выполнить. Таким образом, менеджер памяти остается в стороне не участвует в процессе...