Что такое пейджинг? - PullRequest
5 голосов
/ 12 мая 2011

Пейджинг объяснен здесь, слайд № 6:

http://www.cs.ucc.ie/~grigoras/CS2506/Lecture_6.pdf

в моих лекционных заметках, но я не могу понять, насколько я понимаю. Я знаю, что это способ преобразования виртуальных адресов в физические адреса. Таким образом, виртуальные адреса, которые находятся на дисках, делятся на куски по 2 ^ k. Я действительно запутался после этого. Может кто-нибудь объяснить мне это простыми словами?

Ответы [ 2 ]

11 голосов
/ 12 мая 2011

Пейджинг, как вы заметили, тип виртуальной памяти. Чтобы ответить на вопрос, заданный @John Curtsy: он покрывается отдельно от виртуальной памяти в целом, потому что * это другие типы виртуальной памяти, хотя в настоящее время (на сегодняшний день) наиболее распространена подкачка.

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

Тогда у вас есть адресация. Вы начинаете, разбивая каждый адрес на две части. Одним из них является смещение на странице. Обычно вы используете наименее значимые биты для этой части. Если вы используете, скажем, 4K-страницы, вам нужно 12 бит для смещения. С (скажем) 32-битным адресным пространством, что оставляет еще 20 битов.

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

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

Теперь мы переходим к той части, где мы получаем «настоящую» виртуальную память. Когда программы используют больше памяти, чем фактически доступно, ОС берет данные для некоторых из этих дескрипторов и записывает их на диск. Затем очищает бит «Present» для этой страницы памяти. Физическая страница памяти теперь свободна для других целей.

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

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

Конечно, я сильно упрощаю - довольно много полных (и часто довольно больших) книг были написаны о виртуальной памяти. Существует также значительное количество вариаций среди машин с добавлением различных украшений, незначительными изменениями параметров (например, размер страницы 4К или 8К) и т. Д. Тем не менее, это, по крайней мере, общее представление о том, что происходит (и все еще на достаточно высоком уровне, чтобы применять около в равной степени к ARM, x86, MIPS, SPARC и т. Д.)

2 голосов
/ 12 мая 2011

Проще говоря, это способ хранить гораздо больше данных, чем обычно позволяет ваше адресное пространство.То есть, если у вас есть 32-разрядное адресное пространство и 4-разрядный виртуальный адрес, вы можете хранить (2 ^ 32) ^ (2 ^ 4) адресов (гораздо больше, чем 32-разрядное адресное пространство).

...