0 theory operating-system memory-management
嘿所有我有一个问题和答案,但我不能理解答案的第二部分!任何人都可以帮帮我吗?
这里是:
题;
计算机具有32位虚拟地址和4 KB页面.程序和数据一起放在最低页面(0-4095)堆栈适合最高页面.如果使用传统(一级)分页,页表中需要多少条目?两级分页需要多少页表条目,每个部分有10位?
回答;
对于一级页表,需要2 ^ 32/2 ^ 12或1M页.因此,页表必须具有1M条目.对于两级分页,主页表具有1K条目,每个条目指向第二页表.只使用其中两种.因此,总共只需要三个页表条目,一个在顶级表中,一个在每个下级表中.
我不明白粗体.例如,我无法理解这个1K是如何出现的.
谢谢你的时间,
干杯!
我认为,问题第一部分的答案是错误的,因为你没有使用问题的背景:The program and data together fit in the lowest page (0-4095) The stack fits in the highest page.因此,虽然页表条目的总数是1048576,但是那些只使用2个条目的那些,对于这2个页面中的每一个都是一个(在代码/数据页面处输入0点,在堆栈页面处输入1048575点).
对于问题的第二部分,你给出了一个非常有用的提示:two-level paging, with 10 bits in each part.但首先,让我们回到上面更简单的案例......
在具有一个页表的情况1中,虚拟地址:
A computer has 32-bit virtual addresses)A computer has ... 4-K.B pages也称为fit in the lowest page (0-4095))其余20个最重要的位显然选择页表中的条目.选定的页表条目包含页面的物理地址.
所以,虚拟地址看起来像这样:
most significant bits least significant bits
| 20 bits = index into the page table | 12 bits = index into the page |
Run Code Online (Sandbox Code Playgroud)
因此,CPU使用此公式来访问内存:
PhysicalAddress = PageTable[VirtualAddress / 4096] + VirtualAddress modulo 4096
Run Code Online (Sandbox Code Playgroud)
现在,让我们回到案例2.
您仍然有12个LSB位来选择页面中的一个字节.
但有什么新东西?是的two-level paging, with 10 bits in each part.
这10位是页表索引的长度,现在你有两个.
有了这个,我们得出虚拟地址的以下细分:
most significant bits least significant bits
| 10 bits = PT index | 10 bits = PT index | 12 bits = page index |
Run Code Online (Sandbox Code Playgroud)
而地址翻译公式自然是:
PhysAddr = PageTable[VirtAddr / (1024*4096)][(VirtAddr / 4096) modulo 1024] + VirtAddr modulo 4096
Run Code Online (Sandbox Code Playgroud)
现在,我们仍然拥有占用2页的相同程序.
指向代码/数据页面的虚拟地址是(二进制):
0000000000|0000000000|xxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
指向堆栈页面的虚拟地址(也是二进制):
1111111111|1111111111|xxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
通过此,您可以看到您在级别1使用了2个不同的页表条目(由索引0000000000和1111111111选择),同样在级别2使用了2个不同的页表条目.
因此,在情况2中,总计是2 + 2 =程序运行所需的4个页表条目.
PS如果你不记得了:2 10 = 1024,2 12 = 4096,2 20 = 1048576.