2014-02-21 2 views
1

Я читаю Modern Operating Systems 3rd Edition от A.S Tanenbaum, и я пришел к главе по управлению виртуальной памятью. Некоторое время я застрял на части, и я не могу обойти ее. Либо это опечатка в книге, либо я что-то неправильно понял.Преобразование виртуального адреса в запись в таблицу страниц

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

Поля для таблиц страниц и смещение

10 | 10 | 12 

означает, что мы имеем верхнюю таблицу страниц уровня с 1024 записей, и размер страницы 4096 байт или 4 КБ. Запись 0 таблицы страниц верхнего уровня указывает на таблицу страниц текстового сегмента, запись 1 в сегменте данных и запись 1023 в таблицу страниц стека.

Это цитата из книги:

В качестве примера рассмотрим 32-разрядный виртуальный адрес 0x00403004 (4206596 десятичное), который является 12,292 байт в данных. Этот виртуальный адрес соответствует PT 1 = 1, PT2 = 2 и Offset = 4. MMU сначала использует PT1 для индексации в таблице страниц верхнего уровня и получения записи 1, что соответствует адресам от 4M до 8M , Затем он использует РТ2 к индексу в таблицу страниц второго уровня только что нашли и извлекаемую запись , который соответствует адресам 12288 до 16383 в пределах его фрагмента оГО (то есть абсолютные адреса 4,206,592 к 4,210,687).

Когда я перевести адрес в двоичный, я получаю 0000000001|0000000011|000000000100 что для меня соответствует PT1 = 1, PT2 = 3, Offset = 4.

  1. Могу ли я что-то отсутствует, или это опечатка в книге о том, PT2 = 2, когда он на самом деле должно быть PT2 = 3? Поскольку текст позже говорит, то MMU использует индекс PT2 для извлечения 3. Стажер
  2. Где из базы данных «12 292 байта»? Как это происходит от виртуального адреса? Я понимаю, что это связано со смещением, но я не могу понять, как это делается. Насколько я понял, физический адрес выводится как комбинация номера кадра из второй таблицы страниц и смещения. Я вижу, что 12 292 - результат 3*4096+4 (PT2 entry * page size + offset). Это верно?

ответ

1

1) Я думаю, что это опечатка действительно, как 0000000001 | 0000000011 | 000000000100 двоичная = 4206596 десятичного

2) Отклик в предыдущем абзаце книги:

Входа 0 таблицы верхнего уровня указывает на таблицу страниц для текста программы, запись 1 указывает на таблицу страниц для данных, а запись 1023 указывает на таблицу страниц для стека

Поэтому он просто говорит, что 0000000001 | 0000000011 | 000000000100 соответствует 0000000011 | 000000000100 в данные. Действительно, 0000000001 соответствует данным в таблице страниц верхнего уровня, а 0000000011 | 000000000100 двоичный = 12 292 десятичных.

Смежные вопросы