Подтвердить что ты не робот

Как использовать таблицу страниц для преобразования виртуального адреса в физический?

Предположим, что у меня есть обычная таблица страниц:

Таблица страниц (размер страницы = 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"?

4b9b3361

Ответ 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. это право?