перевести виртуальный адрес на физический адрес
следующая таблица страниц для системы с 16-битными виртуальными и физическими адресами и с 4096-байтовых страниц. Бит ссылки установлен в 1, когда на страницу была сделана ссылка. Периодически поток обнуляет все значения опорного бита.Все числа представлены в десятичном формате.
Я хочу преобразовать следующие виртуальные адреса (в шестнадцатеричном виде) в эквивалентные физические адреса. Также я хочу установить ссылку на соответствующий запись в таблице страниц.
• 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
виртуальные страницы. Каждая запись в таблице страниц хранит соответствующий фрейм, вмещающий страницу. Для пример:
теперь давайте переведем!
прежде всего для удобства работы позволяет конвертировать 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.
чтобы помочь вам решить этот вопрос, нам нужно получить наши данные правильно:
- 16 бит виртуального адресного пространства = 2^16 = 65,536 адресное пространство
- 16 бит физическое адресное пространство = 2^16 = 65,536 адресное пространство
- 4096 байт размер страницы определяет смещение, которое является Log (4096) / Log (2) = 12 бит. Это означает, 2^12 для размера страницы
- согласно @Akash Mahapatra, смещение от виртуального адреса напрямую сопоставляется со смещением на физическое адрес
таким образом, теперь у нас есть:
- 2^16 (16bit) для виртуального адреса - 2^12 (12bit) для смещения = 4-бит для страниц, или, скорее, общее количество доступных страниц.
- Я не буду повторять расчет для физических, так как это те же цифры.
- 2^4 (4bit) для страниц = 16, что коррелирует с количеством записей таблицы выше!
мы работаем над этим... будьте терпеливы! :)
Адрес В Памяти Известно также, что 0xE12C в шестнадцатеричной нотации содержит 16-бит адреса. (Поскольку это указано в вопросе.)
давайте разделаем адрес Сейчас...
сначала мы удаляем '0x' из информации.
мы можем преобразовать E12C в двоичную нотацию, такую как @Tony Tannous, но я собираюсь применить немного короткий путь.
Я просто использую соотношение. Ну, адрес обозначен 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
надеюсь, это объяснение поможет вам и другим, как я! :)