我的架构类有一个关于确定页表大小的硬件问题。我看到这里有一个关于这个的SO条目:
Determine page table size for virtual memory
但我无法将其应用于我的问题。
我知道一般等式是:
(总#页数)x(页面大小)
但是当我进行数学计算时,这些数字没有意义。有人可以帮我看看我做错了什么吗?
字节可寻址内存,
48位虚拟空间,
16 kB页面大小(14位代表),
4 GB物理内存(22位代表),&
每页有效,脏的参考位
一个应用程序的表大小是多少?
总#pages = 2 ^ 48/2 ^ 14 = 2 ^ 34
页面大小= 16 kB
总页面大小=(总#page)x(页面大小)= 2 ^ 34 x 16 kB = 274877906944 kB?!?!?
我们非常感谢一些帮助 - 显然我做错了。
谢谢。
答案 0 :(得分:1)
您将页面与页表条目混淆:
您希望将4GB的物理内存映射到16kB的页面上。
所以你需要(4 * 10 ^ 6/16 * 10 ^ 3)= 250页(地址)
每个地址都保存在页表条目中,这是一个32位整数,由页面的物理内存中的地址和一些修饰符/信息位组成关于那个页面。
每个进程至少需要一个页面表。这里包含250个页表条目。每个页表条目大小都是一个32位(4B)数字(无论你想要什么,都可以调用它)
因此,一个流程所需的总大小为:
250 * 4B = 1000 B = 1kB
为什么不根据x86 MMU使用的分页模型使用此方法:
您描述的单一级别分页机制的问题是每个(无论多小)进程都需要:
4GB / 16kb = 4 * 10 ^ 6 B / 16 * 10 ^ 3 B = 0,25 * 1000 = 250页表条目
250 * 4字节(每个条目32位)= 每个进程1 kB
看起来似乎并不多,但在这里您使用了16 kB页面(例如,大多数x86系统使用4kb页面,因此每个进程需要 1MB )
这就是x86使用两级分页过程的原因,其中每个进程有1024个页面目录条目,每个条目都包含页面表的地址(它包含1024个页表条目)。因此,进程的最小分配内存变为: 4个字节(页面目录条目)+ 1024 * 4个字节(1024个32位页面表条目) 每个页表项都指向内存中的4kB物理页。
1024页目录条目*每个目录1024页表条目* 4kB页= 4GB可寻址内存
虚拟地址大致包含:
这意味着即使您增加单个页面的大小(从而减少所需的页表条目数),您也需要一个更大的数字来描述偏移量。