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

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

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


person Community    schedule 06.05.2009    source источник


Ответы (5)


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

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

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

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

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

Теперь нам нужно найти в памяти место 12-й страницы.
Глядя на таблицу фреймов, кажется, что страница 12 находится в 6-м фрейме. В системе, где вся память является страничной (то есть без отображения ввода-вывода в память), 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 за то, что поймал мою ошибку :) Спасибо user8 за то, что поймал мою другую ошибку! (frameNum вместо pageNum).

person ParoXoN    schedule 06.05.2009
comment
Означает ли ваш ответ, что длина виртуального адреса может изменяться для разных процессов? Например, если есть два процесса, один из которых имеет 16 страниц, а другой - только 1 страницу, тогда биты, используемые для обозначения номера страницы, будут разными, поэтому окончательная длина виртуального адреса будет другой. - person cheng; 14.03.2011
comment
@cheng: адреса имеют фиксированную длину для всех процессов, поэтому, если процесс имеет только одну страницу, все его адреса будут начинаться с одного и того же значения. В приведенном выше примере с 16 страницами первые четыре бита одностраничного процесса будут 0b0000. - person ParoXoN; 16.04.2015
comment
Почему вы умножаете на 4000 вместо 4096 на предпоследнем шаге? - person Jel; 25.11.2015
comment
@Jel: Хороший улов! Это должно быть 4096. Я предполагаю, что когда я первоначально прочитал вопрос, я предположил, что 4k === 4000, хотя вопрос явно упоминает 4096 более одного раза. Спасибо! - person ParoXoN; 27.11.2015
comment
в вашей формуле (entriesPerPage * pageNum) -1 pageNum должно быть frameNum - person Dimitar; 14.01.2016

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

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

person Zifre    schedule 06.05.2009

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

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

    }
person oscar    schedule 10.05.2012
comment
это в java, но это должно помочь - person oscar; 10.05.2012

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

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

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

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

person tea-addict    schedule 30.05.2015

Следующая таблица страниц предназначена для системы с 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 iv. 0x6901 v. 0x23A1 vi. 0xA999

person Anneline    schedule 04.03.2014