Как использовать таблицу страниц для преобразования виртуального адреса в физический?
Предположим, что у меня есть обычная таблица страниц:
Таблица страниц (размер страницы = 4k)
Page #: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Page Frame #: 3 x 1 x 0 x 2 x 5 x 7 4 6 x x x
Как преобразовать произвольный логический адрес, например 51996, в адрес физической памяти?
Если я беру базу данных 2 (4096), я получаю 12. Я думаю, что это то, сколько бит я использую для смещения моего адреса.
Я просто не уверен. 51996/4096 = 12,69. Значит ли это, что он лежит на странице №12 с определенным смещением?
Как мне превратить это в физический адрес "51996"?
Ответы
Ответ 1
Чтобы определить страницу заданного адреса памяти, возьмите первые P бит (из N бит).
P = lg2 (numberOfPages)
В вашем примере P = lg2 (16) = 4
Итак, первые 4 бита заданного адреса памяти скажут нам страницу. Это означает, что остальное должно быть смещением от начала этой страницы.
Ваш примерный адрес, 51996, имеет номер 1100101100011100 в двоичном формате. То есть [1100: 101100011100].
1100 (12 в десятичной системе) - номер страницы
101100011100 (2844 в десятичной форме) является смещением
Теперь нам нужно найти, где находится страница 12.
Посмотрев на таблицу фреймов, похоже, что страница 12 находится в 6-м кадре. В системе, где вся память является доступной для страницы (то есть без отображения IO памяти), кадр 6-й страницы будет находиться в (entriesPerPage * frameNum) -1
В этом случае 4000 * 6-1 = 23999 (требуется "-1", так как память 0-индексируется.)
В этом случае 4096 * 6-1 = 24575 (требуется "-1", так как память 0-индексируется.)
Теперь все, что нам нужно сделать, это добавить смещение, и у нас есть адрес физической памяти:
23999 + 2844 = 26843 = 0x68DB
24575 + 2844 = 27419 = 0x6B1B
Готово!
Надеюсь, что это (редактировать) было полезно XD
Изменить:
Спасибо Jel за то, что он поймал мою ошибку:)
Спасибо пользователю8 за то, что он поймал мою другую ошибку! (frameNum вместо pageNum).
Ответ 2
Если я правильно понимаю ваш вопрос (возможно, нет), вы хотите узнать, как найти физический адрес с виртуального адреса, используя структуры таблицы страниц. В этом случае сделайте вид, что вы являетесь процессором. Используйте 10 наиболее значимых бит адреса, чтобы найти таблицу страниц в каталоге страниц (таблица страниц верхнего уровня). Следующие 10 бит - это индекс в таблице страниц (таблица страниц нижнего уровня). Используйте адрес в этой таблице таблицы, чтобы найти адрес физической страницы. Последние десять бит - это адрес байта на странице.
Кстати, вы, вероятно, найдете гораздо больше людей, которые понимали бы этот тип вопроса на ориентированном на ОС сайте, таком как OSDev. В этом ответе я не мог вдаваться в подробности, потому что за эти годы я не делал этого типа.
Ответ 3
Это может помочь:
import java.util.Arrays;
import java.util.Scanner;
public class Run {
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("////////// COMMANDS //////////");
System.out.println("Snapshot: S(enter)r, S(enter)m, S(enter)x, S(enter)p, S(enter)d, S(enter)c");
System.out.println("time: t");
System.out.println("Terminate: T#");
System.out.println("Kill: K#");
System.out.println("Start process: A");
System.out.println("Quit program: quit");
System.out.println("Deletes device: delete");
System.out.println ("//////////////////////////////");
OS myComputer;
int hdd, cdd, printer, cpu, mem, page;
hdd = cdd = printer = cpu = 20;
mem = 1;
page = 1;
System.out.println("");
System.out.println("|||| SYS GEN ||||");
System.out.println("");
mem = 0;
System.out.println("Number of Hard-Drives:");
while (hdd > 10) {
String inpt = input.next();
while (Asset.isInt(inpt) == false)
inpt = input.next();
hdd = Integer.parseInt(inpt);
if (hdd > 10)
System.out.println("Try something smaller (less than 10)");
}
System.out.println("Number of CD-Drives: ");
while (cdd > 10) {
String inpt = input.next();
while (Asset.isInt(inpt) == false)
inpt = input.next();
cdd = Integer.parseInt(inpt);
if (cdd > 10)
System.out.println("Try something smaller (less than 10)");
}
System.out.println("Number of Printers:");
while (printer > 10) {
String inpt = input.next();
while (Asset.isInt(inpt) == false)
inpt = input.next();
printer = Integer.parseInt(inpt);
if (printer > 10)
System.out.println("Try something smaller (less than 10)");
}
System.out.println("Amount of Memory:");
while (mem <= 0) {
String inpt = input.next();
if (Asset.isInt(inpt))
mem = Integer.parseInt(inpt);
if (mem<=0)
System.out.println("The memory size must be greater than zero.");
else
break;
}
Integer[] factors = Asset.factors(mem);
System.out.println("Enter a page size: "+Arrays.toString(factors));
while (true) {
String inpt = input.next();
while (Asset.isInt(inpt) == false)
inpt = input.next();
if (Asset.inArray(factors, Integer.parseInt(inpt))) {
page = Integer.parseInt(inpt);
break;
} else {
System.out.println("Page size must be one of these -> "+Arrays.toString(factors));
}
}
System.out.println("Number of CPUs (max10):");
while (cpu > 10) {
String inpt = input.next();
while (Asset.isInt(inpt) == false)
inpt = input.next();
cpu = Integer.parseInt(inpt);
if (cpu > 10)
System.out.println("Try something smaller (less than 10)");
}
myComputer = new OS(cpu, hdd, cdd, printer, mem, page);
myComputer.Running();
}
}
Ответ 4
первый шаг: 51996/4000 = 12 → p, оставаться = 3996 → d (смещение).
теперь посмотрим на таблицу p (12) = 6
второй шаг: (6 * 4000) + 3996: 27996
физический адрес - 27996.
Ответ 5
Следующая таблица страниц предназначена для системы с 16-разрядными виртуальными и физическими адресами и с 4096-байтными страницами. Контрольный бит устанавливается в 1, когда страница ссылается. Периодически, поток обнуляет все значения эталонного бита. Черточка для рамки страницы указывает, что страница не находится в памяти. Алгоритм замены страниц локализован LRU, и все числа представлены в десятичной форме.
Ссылка на фрейм страницы страницы
0 9 0
1 1 0
2 14 0
3 10 0
4 - 0
5 13 0
6 8 0
7 15 0
8 0 0
9 - 0
10 5 0
11 4 0
12 - 0
13 3 0
14 - 0
15 2 0
а. Преобразуйте следующие виртуальные адреса (в шестнадцатеричном виде) в эквивалентные физические адреса (укажите ответы в шестнадцатеричном и десятичном). Также установите контрольный бит для соответствующей записи в таблице страниц. (3)
я. 0xBC2C
II. 0x00ED
III. 0xEA14
внутривенно 0x6901
v. 0x23A1
VI. 0xA999
Ответ 6
помогите мне: как насчет: первый шаг: 1052/2048 = 0-> p, оставаться = 1052-> d (смещение).
теперь посмотрим на таблицу p (0) = 3
второй шаг: (3 * 2048) + 1052: 7196
физический адрес 7196. это право?