На рисунке 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.