перевести виртуальный адрес на физический адрес

следующая таблица страниц для системы с 16-битными виртуальными и физическими адресами и с 4096-байтовых страниц. Бит ссылки установлен в 1, когда на страницу была сделана ссылка. Периодически поток обнуляет все значения опорного бита.Все числа представлены в десятичном формате. enter image description here

Я хочу преобразовать следующие виртуальные адреса (в шестнадцатеричном виде) в эквивалентные физические адреса. Также я хочу установить ссылку на соответствующий запись в таблице страниц.

0xE12C

0x3A9D

0xA9D9

0x7001

0xACA1

Я знаю, что ответы, но я хочу знать, как я могу достичь этих ответов:

0xE12C → 0x312C
0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

Я нашел и попробовал этой

3 ответов


учитывая, что виртуальный адрес имеет длину 16 бит.
следовательно, есть 2^16 адресов в виртуальном адресном пространстве.
Размер страницы задается равным 4 КБ (на странице есть 4K (4 * (2 ^ 10) )адресов), поэтому количество страниц будет ( 2^16 ) / ( 2 ^ 12 ) = 2 ^ 4.
для обращения к каждой странице требуется 4 бита.
Наиболее значимые 4 бита в виртуальном адресе будут обозначать номер страницы, на которую ссылаются, а остальные 12 бит будут страницей сдвиг.

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

чтобы получить адрес кадра в основной памяти, просто используйте первые 4 бита.
Пример: рассмотрим виртуальный адрес 0xACA1
Здесь а в ACA1 обозначает номер страницы (10 ), а соответствующий кадр no - 5 ( 0101), следовательно, результирующий физический адрес будет → 0x5CA1.


перевести виртуальный адрес a физическая адрес, нам нужно знать 3 вещи:

  • размер физической памяти (для этого примера это не важно.. посмотри [1]
  • Размер Страницы
  • количество бит для виртуального адреса

в этом примере: 16-битной системе, 4KB размер страницы и размер физической памяти is 64KB.

прежде всего нам нужно определить количество необходимых битов, чтобы действовать как смещение внутри страницы.
log2(Page-Size) = log2(4096) = 12 биты для смещение

из 16 бит для виртуального адреса 12 предназначены для смещения, что означает, что каждый процесс имеет 2^4 = 16 виртуальные страницы. Каждая запись в таблице страниц хранит соответствующий фрейм, вмещающий страницу. Для пример:

enter image description here

теперь давайте переведем!

прежде всего для удобства работы позволяет конвертировать 0xE12C to binary.

0xE12C = (1110 0001 0010 1100) in base 2
1110 = 14 in decimal
Entry 14 in P.T => Page frame 3.

позволяет объединить его с 12 смещенными битами

Answer: (0011 0001 0010 1100) = 0x312C

еще пример: 0x3A9D

0x3A9D = 0011 1010 1001 1101
0011 = 3
PageTable[3] = 10
10 in decimal = 1010 in binary
1010 1010 1001 1101 in binary = 0xAA9D

[1] если бы записи таблицы страниц содержали больше информации, нам нужно было бы знать количество битов, необходимых для ссылки на каждый кадр. В нашем дело это log2(64KB/4KB) = log2(16) = 4 бит. то есть, если запись в таблице содержит 6 бит, мы знаем, что только 4 из них для номера кадра, а остальные для флагов.

например:

| page | page frame |
|-------------------|
|  5   |  100101    |

Page 5 is mapped to frame number 1001 = frame number 9.

чтобы помочь вам решить этот вопрос, нам нужно получить наши данные правильно:

  1. 16 бит виртуального адресного пространства = 2^16 = 65,536 адресное пространство
  2. 16 бит физическое адресное пространство = 2^16 = 65,536 адресное пространство
  3. 4096 байт размер страницы определяет смещение, которое является Log (4096) / Log (2) = 12 бит. Это означает, 2^12 для размера страницы
  4. согласно @Akash Mahapatra, смещение от виртуального адреса напрямую сопоставляется со смещением на физическое адрес

таким образом, теперь у нас есть:

  • 2^16 (16bit) для виртуального адреса - 2^12 (12bit) для смещения = 4-бит для страниц, или, скорее, общее количество доступных страниц.
  • Я не буду повторять расчет для физических, так как это те же цифры.
  • 2^4 (4bit) для страниц = 16, что коррелирует с количеством записей таблицы выше!

мы работаем над этим... будьте терпеливы! :)

Адрес В Памяти Известно также, что 0xE12C в шестнадцатеричной нотации содержит 16-бит адреса. (Поскольку это указано в вопросе.)

давайте разделаем адрес Сейчас...

сначала мы удаляем '0x' из информации.

мы можем преобразовать E12C в двоичную нотацию, такую как @Tony Tannous, но я собираюсь применить немного короткий путь.

Mapping of the Address and Offset

Я просто использую соотношение. Ну, адрес обозначен 4 символами выше, и так как 16/4 = 4, я могу определите первую букву как виртуальный адрес, в то время как другие 3 являются смещенным адресом.

С информацией, 'E' в шестнадцатеричном формате, мне нужно преобразовать в Decimal = 14. Затем я смотрю на ваш стол, и я нашел рамку страницы "3". Рамка страницы 3 отмечена в десятичном формате, который затем необходимо преобразовать обратно в шестнадцатеричный формат... Да!... что на 3!

Итак, физическое сопоставление адресов расположения виртуальной памяти 0xE12C можно найти в 0x312C на физическая память.

затем вы вернетесь к таблице и обратитесь к столбцу ссылочного бита и поместите " 1 " в строку 14.

применить ту же концепцию для этих -

0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

Если вы заметили, последние 3 цифры одинаковы (что определяет смещение). И 1-я из 4-х цифр отображается в соответствии с таблицей:

table entry 3 -> page frame 10 -> hex notation A
table entry A (10) -> page frame 5 -> hex notation 5
table entry 7 -> page frame 15 -> hex notation F
table entry A (10) -> page frame 5 -> hex notation 5

надеюсь, это объяснение поможет вам и другим, как я! :)