操作系统和内存管理(理论)

0 theory operating-system memory-management

嘿所有我有一个问题和答案,但我不能理解答案的第二部分!任何人都可以帮帮我吗?

这里是:

题;

计算机具有32位虚拟地址和4 KB页面.程序和数据一起放在最低页面(0-4095)堆栈适合最高页面.如果使用传统(一级)分页,页表中需要多少条目?两级分页需要多少页表条目,每个部分有10位?

回答;

对于一级页表,需要2 ^ 32/2 ^ 12或1M页.因此,页表必须具有1M条目.对于两级分页,主页表具有1K条目,每个条目指向第二页表.只使用其中两种.因此,总共只需要三个页表条目,一个在顶级表中,一个在每个下级表中.

我不明白粗体.例如,我无法理解这个1K是如何出现的.

谢谢你的时间,

干杯!

Ale*_*nze 6

我认为,问题第一部分的答案是错误的,因为你没有使用问题的背景:The program and data toget­her 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中,虚拟地址:

  1. 有32位(给定为A computer has 32-bit virtual addresses)
  2. 它们的12个最低有效位表示页面内的位置(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.