【问题标题】:How does the MMU/Kernel knows that a PTE is valid?MMU/内核如何知道 PTE 是有效的?
【发布时间】:2017-04-18 11:42:17
【问题描述】:

假设一个两级页表,假设程序被分配了 2 页 (8KB)

  GPD      PD1     PD2      PD3 
+-----+ +------+ +------+ +------+
+  1  + +  22  + +------+ +------+
+  0  + +  62  + +------+ +------+
+  0  + +  0   + +------+ +------+
+-----+ +------+ +------+ +------+

MMU/内核如何知道程序何时尝试访问 PD1 的第三个条目或类似 GPD 的 2,3 条目? 它是否用一些值初始化未使用的 PTE 以区分未使用的 PTE? (比如用 0 什么的)

我已阅读here,但 pte 标志中没有有效位或其他内容

【问题讨论】:

    标签: memory-management linux-kernel mmu


    【解决方案1】:

    有一个名为pte_none 的函数。它可以测试PTE是否为空。如果 PTE 无效,则其值为零,函数 pte_none 将返回 TRUE。

    如果页表项为零,则present bit 也为零,因此从虚拟地址到物理地址的映射不存在。如果一个程序想要访问这个无效的虚拟地址,MMU 将检查present bit 并引发一个称为页面错误的异常,然后CPU 将执行一个由Interrupt Descriptor Table(IDT) 注册的异常处理程序。处理程序将做什么取决于此异常的类型。结果可能是加载所需的页面或终止程序。

    【讨论】:

    • 我明白了,谢谢。最后一个问题,这个检查可以在内核端进行,MMU怎么知道它是一个无效页面?更简单,当程序尝试访问无效页面时的控制流程是什么?
    • @AntonisParagas 嗨,我在答案中添加了一些细节。
    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2012-07-31
    • 2011-07-10
    • 2016-05-25
    • 2012-02-12
    • 2012-07-30
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多