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