Вопросы по переводу адресов - PullRequest
0 голосов
/ 06 октября 2019

На рисунке 3.9 мы видим таблицу страниц, состоящую из 3 страниц: физических страниц 00000 (корневой каталог), 00001 и 00003.

Отображаются две страницы данных: 00002 и 00004.

Предполагается, что любые записи, которые не показаны, равны нулю, т. Е. Текущий бит установлен на 0.

В качестве примера мы используем эту таблицу страниц для перевода чтения с виртуального адреса 0x0040102C. Рисунок 3.9: Пример двухуровневой таблицы страниц

Для перевода этого адреса необходимо выполнить следующие шаги: 1) Разделить адрес на номер страницы и смещение 2) Разделить номер страницы на верхнюю и нижнюю10 бит, давая 0x001 и 0x001. (на рисунке ниже верхний ряд является шестнадцатеричным, средние два ряда - двоичными, а нижний - шестнадцатеричным.)

Шаг 2 на рисунке

3) Читатьзапись [001] из каталога страниц верхнего уровня (физическая страница 00000) (размер примечания (запись) составляет 4 байта):

address = start [00000000] + index [001] * sizeof(entry)

read 4 bytes from physical address 00000004 (page 00000, offset 004)

result = [p=1, pgnum = 00001]

Вопрос 1

В верхних кодах легко получить физический адрес 00000004. Однако как получить результат = [p = 1, pgnum = 00001] ??

p = 1 означает, что эта запись таблицы страниц действительна? Могу ли я понять это, так как это p равно 1, потому что в таблице страниц есть запись [001]?

А почему pgnum здесь - 000001, а не 00000? Имеет ли это отношение pgnum к записи [001]?


4) Читать запись [001] из таблицы страниц на физической странице 00001:

address = 00001000 + 001*4 = 00001004

read 4 bytes from physical address 00001004

:result = [p=1, pgnum = 00002]

Вопрос 2 В верхнем коде почему pgnum = 000002 ? Как это получить?


Это означает, что переведенный номер физической страницы равен 00002. Смещение в исходном виртуальном адресе равно 02C, поэтому, объединяя их, мы получаем конечный физический адрес 0000202C.

...