页表如何初始化?

时间:2015-02-17 00:43:21

标签: linux operating-system

我最近一直在学习虚拟内存,并提出了一些问题 - 特别是关于所有结构的初始化。 假设x86架构,linux 2.4(=> 2级分页)。

  1. 一开始,PGD的条目包含什么,如果它们不指向任何已分配的页面表?
  2. 页面表的相同问题 - 如何初始化条目?
  3. 当进程为虚拟地址100-200创建新的内存区域时,是否还创建(如果需要)并初始化与这些地址对应的页表?或者等到有特定地址的访问权限?
  4. 当页表项需要初始化为物理地址时(比如写访问) - 操作系统如何选择它?
  5. 提前感谢。

1 个答案:

答案 0 :(得分:0)

  1. 条目具有有效位。因此,如果页目录中没有分配页表,则理论上所有条目的有效位都关闭,条目中的其他内容无关紧要。

  2. 同上,但我认为如果创建了一个页表,这意味着该范围内的一个页已被访问,因此在页表初始化时至少有一个条目将被设置为有效。否则,根本没有理由创建一个空页表并占用内存。

  3. 我将您的“创建新内存区域”解释为使用 malloc() 调用。 Malloc 是一种向操作系统请求内存并将该内存映射到您的虚拟地址空间的方法。该内存来自您的堆虚拟内存范围,我认为您不能保证操作系统使用的特定地址,只能保证大小。如果您使用 mmap,我认为您确实可以要求使用特定地址,但通常您只想在共享内存等特定情况下执行此操作。

    至于页表,我想当操作系统在 malloc 调用期间获取您的内存时,它将使用新映射为您更新页表。如果它在 malloc 期间没有发生,那么当您尝试访问内存并导致页面错误时它会发生。

  4. 在 Linux 中,操作系统通常会跟踪一个空闲的页面列表,以便它可以轻松地获取内存而不必担心其他人使用它。我的猜测是空闲列表是在启动时通过与主内存控制器/位图通信来初始化的,以了解哪些物理内存点正在使用中,但也许硬件人员可以支持这一点。