Memory 如何使用页表将虚拟地址转换为物理地址?

Memory 如何使用页表将虚拟地址转换为物理地址?,memory,memory-management,paging,virtual-memory,memory-address,Memory,Memory Management,Paging,Virtual Memory,Memory Address,假设我有一个普通的页面表: 页面表格(页面大小=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。我想这就是我应该用多少位作为我地址的偏移量 我只是

假设我有一个普通的页面表:

页面表格(页面大小=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”的物理地址?

如果我正确理解了您的问题(我可能不理解),您希望知道如何使用页表结构从虚拟地址中查找物理地址。在这种情况下,假设你是处理器。使用地址的10个最高有效位在页面目录(顶层页面表)中查找页面表。接下来的10位是页表(较低级别页表)的索引。使用该页表条目中的地址查找物理页地址。最后十位是进入页面的字节地址


顺便说一句,在面向操作系统的网站上,你可能会发现更多的人理解这类问题,例如。在这个答案中,我无法详细说明,因为我已经多年没有做过这类事情了。

要确定给定内存地址的页面,请取第一个p位(N位)数字

p=lg2(页数)
在您的示例中,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(因为内存是0索引的,所以需要“-1”)

在这种情况下,4096*6-1=24575(因为内存是0索引的,所以需要“-1”)

现在我们所要做的就是添加偏移量,我们就有了物理内存地址:

23999+2844=26843=0x68DB

24575+2844=27419=0x6B1B

完成了

希望这(编辑)是有帮助的XD

编辑: 感谢杰尔抓住了我的错误:) 感谢user8抓住了我的另一个错误!(frameNum而不是pageNum)。

这可能有帮助:

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

    }
导入java.util.array;
导入java.util.Scanner;
公营课{
专用静态扫描仪输入=新扫描仪(System.in);
公共静态void main(字符串[]args){
System.out.println(“///COMMANDS//”);
系统输出打印项次(“快照:S(输入)r、S(输入)m、S(输入)x、S(输入)p、S(输入)d、S(输入)c”);
System.out.println(“时间:t”);
System.out.println(“终止:T#”);
System.out.println(“Kill:K#”);
System.out.println(“启动进程:A”);
System.out.println(“退出程序:退出”);
System.out.println(“删除设备:删除”);
System.out.println(“////////”;
操作系统计算机;
int硬盘、cdd、打印机、cpu、内存、页面;
硬盘驱动器=cdd=打印机=cpu=20;
mem=1;
page=1;
System.out.println(“”);
System.out.println(“| | | | | | SYS GEN | | | |”);
System.out.println(“”);
mem=0;
System.out.println(“硬盘数量:”);
而(硬盘驱动器>10){
字符串inpt=input.next();
while(Asset.isInt(inpt)=false)
inpt=input.next();
hdd=整数.parseInt(inpt);
如果(硬盘驱动器>10)
System.out.println(“尝试一些更小的(小于10)”;
}
System.out.println(“光盘驱动器的数量:”);
而(cdd>10){
字符串inpt=input.next();
while(Asset.isInt(inpt)=false)
inpt=input.next();
cdd=整数.parseInt(inpt);
如果(cdd>10)
System.out.println(“尝试一些更小的(小于10)”;
}
System.out.println(“打印机数量:”);
同时(打印机>10){
字符串inpt=input.next();
while(Asset.isInt(inpt)=false)
inpt=input.next();
打印机=整数.parseInt(inpt);
如果(打印机>10)
System.out.println(“尝试一些更小的(小于10)”;
}
System.out.println(“内存量:”);
while(mem10){
字符串inpt=input.next();
while(Asset.isInt(inpt)=false)
inpt=input.next();
cpu=整数.parseInt(inpt);
如果(cpu>10)
System.out.println(“尝试一些更小的(小于10)”;
}
myComputer=新操作系统(cpu、硬盘、cdd、打印机、内存、页面);
myComputer.Running();
}
}

下表适用于具有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 -