Remkomplekty.ru

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

Трансляция адресов в памяти

Динамическая трансляция виртуального адреса в реальный

Рис.2. Преобразование виртуального адреса

Рассмотрим систему переадресации с сегментацией памяти (рис2.).
В глобальной таблице компьютера хранятся сведения о нахождении таблицы сегментов каждой задачи. Адрес таблицы сегментов для выполняемой задачи загружается в управляющий регистр. По адресу таблицы и номеру сегмента виртуального адреса определяется адрес таблицы страниц. По адресу таблицы страниц и номеру страницы виртуального адреса определяется адрес страницы в таблице страниц (виртуальный адрес, который преобразуется в реальный в буфере быстрой переадресации). Из буфера быстрой переадресации считывается реальный адрес страницы. Полный реальный адрес равен реальному адресу страницы плюс номер ячейки памяти (смещение в странице).
Если разбиение на сегменты не используется, то для трансляции логического адреса используется двухуровневая таблица страниц. Виртуальный адрес интерпретируется как совокупность 3 элементов: указателя каталога страниц, указателя таблицы страниц и указателя слова на странице.
У каждого процесса (каждой задачи) есть один каталог страниц, который содержит адреса всех таблиц страниц для данного процесса. Указатель каталога страниц применяется для поиска каталога, из каталога определяется указатель таблицы страниц для данного процесса, по указателю таблицы страниц находится нужная таблица, из которой читается адрес, содержащий указатель для требуемой страницы (ее физический адрес). Остается определить реальный адрес данных, расположенных на этой странице. Указатель слова позволяет найти конкретный адрес на физической странице.
Но что делать, если количество страниц во всех линейных адресных пространствах выполняемых процессов превышает объем оперативной памяти и поэтому невозможно поставить в соответствие каждой из них свою страницу реальной памяти? Для решения этой проблемы дополнительно ведется учет присутствия страницы в физической памяти (вводится дескриптор страницы где предусмотрен флаг (бит) реального присутствия страницы в оперативной памяти). Наличие такого бита позволяет отметить часть страниц, непомещающихся в физической памяти, как временно отсутствующие.
Если происходит обращение к такой странице, то процессор формирует прерывание. Получив прерывание по отсутствию страницы, операционная система может записать одну из присутствующих в памяти страниц на диск и отметить ее как временно отсутствующую во всех адресных пространствах, в которых она была видна. На освободившееся место с диска считывается та страница, из-за которой произошло прерывание. Заполняются все таблицы, по которым ведется поиск данной страницы и в дескрипторе страницы устанавливается флажок ее реального присутствия в оперативной памяти.
После возврата из программы — обработчика прерывания процессор повторит попытку доступа к памяти, но теперь нужная страница уже отмечена как присутствующая и прерывания не произойдет. Если вновь потребуется та страница, которая была записана на диск, то снова произойдет прерывание, ведь эту страницу пометили как временно отсутствующую в памяти. В ответ на это прерывание на диск будет перемещена еще какая-нибудь страница, а на ее место с диска будет загружена требуемая.
Этот процесс называется страничным обменом или свопингом (paging или swapping). Страницы, помещаемые на диск хранятся в специальном файле, файле подкачки (swap-файле). Взаимодействие с файлом подкачки происходит значительно медленнее, чем с оперативной памятью компьютера, поэтому оптимизация работы с этим файлом зачастую дает возможность увеличить скорость работы системы памяти. Теоретически, наиболее оптимальным считается объем файла подкачки, превышающий объем установленной на компьютере оперативной памяти примерно в два раза.
Если страница не изменялась с момента последнего считывания с диска, то при ее замене другой страницей нет необходимости повторно записывать ее на диск. Можно просто пометить ее как отсутствующую. Для слежения за изменением страницы современные процессоры поддерживают еще один флаг в дескрипторе страницы. Другой важный флаг, который поддерживается аппаратурой процессора — это флаг обращения. Он устанавливается всегда, когда происходит обращение к странице на чтение или запись. Операционная система может время от времени просматривать страничные таблицы, проверять и сбрасывать этот бит, выявляя те страницы, которые часто используются программами.

Для того, чтобы уменьшить количество дисковых операций, операционная система использует ту или иную стратегию страничного обмена. Оптимальная стратегия состоит в том, чтобы возвращать на диск ту страницу, которая дольше всего не понадобиться программам. Одной из лучших стратегий страничного обмена является LRU (Least Recently Used). Алгоритм LRU предполагает, что на диск надо переносить ту страницу, которая дольше всего не использовалась. Существуют и более сложные алгоритмы, но обычно они базируются на LRU.
В некоторых случаях операционная система заранее знает, что определенные страницы, которые сейчас находятся на диске, понадобятся ей (или прикладным программам) в ближайшее время. Тогда она может заранее перенести их в оперативную память, не дожидаясь прерываний по отсутствию страницы. Такая операция называется страничной предвыборкой (page prefetch). Аналогичный прием может быть использован и для записи на диск пассивных страниц раньше, чем будет затребовано место, занимаемое этой страницей.

Трансляция адресов;

Управление памятью

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

· выделять память в два этапа;

· выполнять чтение/запись из/в виртуальной памяти;

· фиксировать виртуальные страницы в физической памяти;

· получать информацию о виртуальных страницах;

· защищать виртуальные страницы;

· сбрасывать содержимое виртуальных страниц на диск.

Читать еще:  Айпи адрес от чего зависит

Диспетчер виртуальной памяти выделяет память в два этапа:

· резервирование;

· передача.

Зарезервированная память (reserved memory) – это набор виртуальных адресов, которые диспетчер виртуальной памяти зарезервировал для использования процессом. Это быстрая и дешевая операция. Переданной памятью (committed memory) называется память, для которой диспетчер виртуальной памяти выделил место в файле подкачки (paging file) – файле на диске, в который он записывает виртуальные страницы, когда их надо удалить из памяти. Поток может либо сразу зарезервировать и передать виртуальную память, либо вначале лишь зарезервировать ее, а передавать по мере необходимости.

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

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

Рассмотрим, как Windows увязывает виртуальные адресные пространства процессов со страницами физической памяти.

Приложения используют 32-разрядные виртуальные адреса. С помощью структур данных создаваемых и поддерживаемых диспетчером памяти, происходит трансляция этих виртуальных адресов в физические. Каждый виртуальный адрес сопоставляется со структурой системного пространства, которая называется элементом таблицы страниц (page table entry, PTE). Она и содержит физический адрес, соответствующий виртуальному (см.Рис. 3 Концептуальная схема таблицы страниц).

Рис. 3. Концептуальная схема таблицы страниц

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

Рис. 4. Структура таблицы страниц

Индекс каталога страниц (page directory index) применяется для поиска таблицы страниц, содержащий PTE для данного виртуального адреса. С помощью индекса таблицы страниц (page table index) осуществляется поиск PTE, который содержит физический адрес, по которому проецируется виртуальная страница. Индекс байта (byte index) позволяет найти конкретный адрес на физической странице. У каждого процесса есть один каталог страниц (page directory), который представляет собой страницу с адресами всех таблиц страниц для данного процесса.

При трансляции виртуального адреса происходит следующее:

· Определяется адрес каталога страниц текущего процесса. При переключении контекста процесса операционная система заносит этот адрес в специальный регистр процессора;

· Индекс каталога страниц используется для поиска элемента каталога страниц (page directory entry, PDE). Он указывает на ту таблицу страниц, которая нужна для трансляции виртуального адреса. PDE содержит номер фрема страницы (page frame number, PFN) таблицы страниц (если она находится в памяти, таблица может быть выгружена в страничный файл);

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

· Если PTE указывает на действительную страницу, для поиска нужных данных используется индекс байта.

Управление памятью

Трансляция адресов

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

Из рис.11.1 видно, что информация о соответствии виртуальных адресов физическим хранится в таблицах страниц. В системе для каждого процесса поддерживается множество записей о страницах: если размер страницы 4 КБ, то чтобы хранить информацию обо всех виртуальных страницах в 32 разрядной системе требуется более миллиона записей (4 ГБ / 4 КБ = 1 048 576). Эти записи о страницах сгруппированы в таблицы страниц ( Page Table ), запись называется PTE ( Page Table Entry ). В каждой таблице содержится 1024 записи, таким образом, максимальное количество таблиц страниц для процесса – 1024 (1 048 576 / 1024 = 1024). Половина от общего количества – 512 таблиц – отвечают за пользовательское ВАП, другая половина – за системное ВАП.

Таблицы страниц хранятся в виртуальной памяти (см. рис.11.2). Информация о расположении каждой из таблиц страниц находится в каталоге страниц (Page Directory ), единственном для процесса. Записи этого каталога называются PDE (Page Directory Entry ). Таким образом, процесс трансляции является двухступенчатым: сначала по виртуальному адресу определяется запись PDE в каталоге страниц, затем по этой записи находится соответствующая таблица страниц , запись PTE которой указывает на требуемую страницу в физической памяти.

Откуда процесс знает, где в памяти хранится каталог страниц? За это отвечает поле DirectoryTableBase структуры KPROCESS ( файл basentosincke.h, строка 958, первый элемент массива). Схема трансляции адресов показана на рис.11.3.

Записи PDE и PTE представлены структурой MMPTE_HARDWARE (basentosmmi386mi386.h, строка 2508), содержащей следующие основные поля:

  • флаг (однобитовое поле) Valid : если виртуальная страница расположена в физической памяти, Valid = 1 ;
  • флаг Accessed : если к странице были обращения для чтения, Accessed = 1 ;
  • флаг Dirty : если содержимое страницы было изменено (была произведена операция записи), Dirty = 1 ;
  • флаг LargePage : если страница является большой (4 МБ), LargePage = 1 ;
  • флаг Owner : если страница доступна из пользовательского режима, Owner = 1 ;
  • 20 битовое поле PageFrameNumber : указывает номер страничного фрейма (PFN, Page Frame Number).
Читать еще:  Как посмотреть мак адрес сетевой

В поле PageFrameNumber хранится номер записи в базе данных PFN – системной структуре, отвечающей за информацию о страницах физической памяти. Запись PFN представлена структурой MMPFN ( файл basentosmmmi.h, строка 1710) и подробно описана в [5, стр. 502].

Ошибки страниц

Страница может находиться либо в физической памяти ( ОЗУ ), либо на диске в файле подкачки.

Если в записи PTE флаг Valid = 1, то страница находится в физической памяти и к ней можно обращаться. Иначе ( Valid = 0) – страница недоступна процессу. При попытке доступа к такой странице возникает страничная ошибка ( page fault ) и вызывается функция MmAccessFault ( файл basentosmmmmfault.c, строка 101).

Причин страничных ошибок существует множество (см. [Руссинович и др., 2008, стр. 463]), мы рассмотрим только одну – страница выгружена в страничный файл ( файл подкачки). В этом случае запись PTE имеет тип MMPTE_SOFTWARE ( файл basentosmmi386mi386.h, строка 2446) и вместо поля PageFrameNumber имеет 20 разрядное поле PageFileHigh , отвечающее за расположение страницы в страничном файле.

Страничные файлы описываются структурой MMPAGING_FILE (basentosmmmi.h, строка 4239), имеющей следующие поля:

  • Size – текущий размер файла (в страницах);
  • MaximumSize, MinimumSize – максимальный и минимальный размеры файла (в страницах);
  • FreeSpace, CurrentUsage – число свободных и занятых страниц;
  • PageFileName – имя файла;
  • PageFileNumber – номер файла;
  • FileHandle – дескриптор файла.

В 32 разрядных Windows поддерживается до 16 файлов подкачки размером до 4095 МБ каждый. Список файлов подкачки находится в ключе реестра HKLMSYSTEMCurrentControlSetControlSession Manager Memory ManagementPagingFiles. Соответствующий системный массив MmPagingFile[MAX_PAGE_FILES] типа PMMPAGING_FILE описывается в файле basentosmmmi.h (строка 8045).

Пределы памяти

В таблицах 8.1, 8.2 и 8.3 приведены ограничения на виртуальную и физическую память в 32 разрядных и 64 разрядных операционных системах Windows .

Концепция виртуальной памяти и трансляция виртуальных адресов

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

Виртуальная память — это совокупность программно-аппаратных средств, позволяющих пользователям писать программы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи:

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

Методы распределения памяти с использованием дискового пространства

Страничное распределение

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

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

Размер страницы обычно выбирается равным степени двойки: 512, 1024 и т.д., это позволяет упростить механизм преобразования адресов.

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

Виртуальный адрес при страничном распределении может быть представлен в виде пары (p, s), где p — номер виртуальной страницы процесса (нумерация страниц начинается с 0), а s — смещение в пределах виртуальной страницы. Учитывая, что размер страницы равен 2 в степени к, смещение s может быть получено простым отделением k младших разрядов в двоичной записи виртуального адреса. Оставшиеся старшие разряды представляют собой двоичную запись номера страницы p.

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

Сегментное распределение

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

Читать еще:  Где взять адрес сервера для vpn

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

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

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

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

Трансляция адресов в памяти

Книга: 2.Внутреннее устройство Windows (гл. 5-7)

Трансляция виртуальных адресов на платформе x86

Трансляция виртуальных адресов на платформе x86

C помощью структур данных (таблиц страниц), создаваемых и поддерживаемых диспетчером памяти, процессор транслирует виртуальные адреса в физические. Каждый виртуальный адрес сопоставлен со структурой системного пространства, которая называется элементом таблицы страниц (page table entry, PTE) и содержит физический адрес, соответствующий виртуальному. Например, на рис. 7-15 показаны три последовательно расположенные виртуальные страницы, проецируемые на три разрозненные физические страницы (платформа x86).

Пунктирные линии на рис. 7-15 соединяют виртуальные страницы с РТЕ, представляя косвенные связи между виртуальными и физическими страницами.

ПРИМЕЧАНИЕ Код режима ядра (например, драйверов устройств) может ссылаться на физические адреса, транслируя их в виртуальные. Подробнее об этом см. описание функций поддержки списка дескрипторов памяти (memory descriptor list, MDL) в DDK.

По умолчанию в х86-системе Windows для трансляции виртуальных адресов в физические использует двухуровневую таблицу страниц (х86-систе-мы, работающие с РАЕ-версией ядра, используют трехуровневую таблицу страниц, но они в этом разделе не рассматриваются). 32-разрядный виртуальный адрес интерпретируется как совокупность трех элементов: индекса каталога страниц, индекса таблицы страниц и индекса байта. Они применяются в качестве указателей в структурах, описывающих проекции страниц (рис. 7-l6). Размеры страницы и PTE определяет размеры каталога страниц и полей индекса таблицы страниц. Так, в х86-системах длина индекса байта составляет 12 битов, поскольку размер страницы равен 4096 байтов (т. е. 2 12 ).

Индекс каталога страниц (page directory index) применяется для поиска таблицы страниц, содержащей PTE для данного виртуального адреса. C помощью индекса таблицы страниц (page table index) осуществляется поиск РТЕ, который, как уже говорилось, содержит физический адрес, по которому проецируется виртуальная страница. Индекс байта (byte index) позволяет найти конкретный адрес на физической странице. Взаимосвязи этих трех величин и их использование для трансляции виртуальных адресов в физические показаны на рис. 7-17.

При трансляции виртуального адреса выполняются следующие операции.

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

2. Индекс каталога страниц используется как указатель для поиска элемента каталога страниц (page directory entry, PDE), который определяет местонахождение таблицы страниц, нужной для трансляции виртуального адреса. PDE содержит номер фрейма страницы (page frame number, PFN) таблицы страниц (если она находится в памяти; однако такие таблицы могут выгружаться в страничный файл).

3. Индекс таблицы страниц используется как указатель для поиска PTE5 который определяет местонахождение требуемой виртуальной страницы.

4. Ha основе PTE отыскивается страница. Если она действительна, то содержит PFN соответствующей страницы физической памяти. Если PTE сообщает, что страница недействительна, обработчик ошибок подсистемы управления памятью пытается найти страницу и сделать ее действительной (см. раздел по обработке ошибок страниц далее в этой главе). Если сделать страницу действительной не удалось (например, из-за ошибки защиты), обработчик ошибок генерирует нарушение доступа или вызывает переход в состояние отладки.

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

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