【问题标题】:Determining Page Table Size确定页表大小
【发布时间】:2014-10-26 19:09:37
【问题描述】:

我的架构类有一个关于确定页表大小的硬件问题。我看到这里已经有一个关于这个的 SO 条目:

Determine page table size for virtual memory

但我无法将其应用于我的问题。

我知道一般等式是:

(总页数)x(页面大小)

但是当我做数学时,这些数字没有意义。有人可以帮我看看我做错了什么吗?

字节可寻址存储器, 48位虚拟空间, 16 kB 页面大小(14 位表示),
4 GB 物理内存(22 位表示),& 每页的有效、脏、引用位

一个应用程序的表大小是多少?

总页数 = 2^48 / 2^14 = 2^34

页面大小 = 16 kB

总页面大小 =(总 # 页)x(页面大小)= 2^34 x 16 kB = 274877906944 kB ?!?!?

我们将不胜感激 - 显然我做错了什么。

谢谢。

【问题讨论】:

  • 1) 这是单级页表吗? 2) 进程的虚拟页数限制是虚拟地址空间的最大值吗?页表项是 32 位还是 64 位?

标签: caching memory virtual-memory


【解决方案1】:

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

  1. 页表由页表条目组成
  2. 每个页表条目都包含一个的物理内存地址
  3. 页面是一个 16kB 的内存片

您希望将 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 页面中的偏移量

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2011-02-27
    • 2023-03-22
    • 2020-04-19
    • 2018-03-26
    • 1970-01-01
    • 2014-03-25
    • 2010-11-10
    相关资源
    最近更新 更多