Как я могу использовать таблицу страниц для преобразования виртуального адреса в физический? - PullRequest
13 голосов
/ 07 мая 2009

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

Таблица страниц (размер страницы = 4 КБ)

      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"?

Ответы [ 5 ]

21 голосов
/ 07 мая 2009

Чтобы определить страницу данного адреса памяти, возьмите первые цифры P бит (из N бит).

P = lg2 (numberOfPages)
В вашем примере P = lg2 (16) = 4

Таким образом, первые 4 бита данного адреса памяти сообщат нам страницу. Это означает, что остальное должно быть смещением от начала этой страницы.

Ваш примерный адрес, 51996, это 1100101100011100 в двоичном формате. То есть [1100: 101100011100].

1100 (12 в десятичном виде) - номер страницы
101100011100 (2844 в десятичном виде) это смещение

Теперь нам нужно найти, где находится страница 12.
Глядя на таблицу фреймов, кажется, что страница 12 находится в 6-м фрейме. В системе, где вся память является постраничной (т. Е. Нет ввода-вывода в памяти), 6-й фрейм страницы будет иметь значение (recordsPerPage * frameNum) -1

В этом случае 4000 * 6-1 = 23999 («-1» необходимо, поскольку память индексируется 0).

В этом случае 4096 * 6-1 = 24575 («-1» необходимо, поскольку память индексируется 0).

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

23999 + 2844 = 26843 = 0x68DB

24575 + 2844 = 27419 = 0x6B1B

Готово!

Надеюсь, что это (изменить) было полезно XD

Edit: Спасибо Джелю за то, что он поймал мою ошибку :) Спасибо user8 за то, что поймал мою вторую ошибку! (frameNum вместо pageNum).

1 голос
/ 30 мая 2015

первый шаг : 51996/4000 = 12 -> p, остаются = 3996 -> d (смещение).

Теперь посмотрите на таблицу p (12) = 6

.

второй шаг : (6 * 4000) + 3996: 27996

физический адрес 27996.

1 голос
/ 10 мая 2012

Это может помочь:

    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();
        }

    }
1 голос
/ 07 мая 2009

Если я правильно понимаю ваш вопрос (вероятно, нет), вы хотите знать, как найти физический адрес по виртуальному адресу, используя структуры таблицы страниц. В этом случае представьте, что вы процессор. Используйте 10 самых значимых битов адреса, чтобы найти таблицу страниц в каталоге страниц (таблица страниц верхнего уровня). Следующие 10 бит - это индекс в таблице страниц (таблица страниц нижнего уровня). Используйте адрес в этой записи таблицы страниц, чтобы найти физический адрес страницы. Последние десять бит - это байтовый адрес страницы.

Кстати, вы, вероятно, найдете гораздо больше людей, которые понимают этот тип вопросов на сайте, ориентированном на ОС, например, OSDev . Я не мог вдаваться в подробности этого ответа, потому что я не делал такого рода вещи годами.

0 голосов
/ 04 марта 2014

Следующая таблица страниц предназначена для системы с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...