确定页表大小

时间:2014-10-26 19:09:38

标签: caching memory virtual-memory

我的架构类有一个关于确定页表大小的硬件问题。我看到这里有一个关于这个的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?!?!?

我们非常感谢一些帮助 - 显然我做错了。

谢谢。

1 个答案:

答案 0 :(得分:1)

您将页面与页表条目混淆:

  1. 页面表由页表条目
  2. 组成
  3. 每个页面表条目包含页面的物理内存地址
  4. 页面是16kB的内存片段
  5. 您希望将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可寻址内存

    虚拟地址大致包含:

    • 页面目录条目索引
    • 页表条目索引
    • 4kB页面中的偏移

    这意味着即使您增加单个页面的大小(从而减少所需的页表条目数),您也需要一个更大的数字来描述偏移量。