内存管理单元(MMU)如何通知操作系统页表已更新?

时间:2016-07-21 13:34:20

标签: linux linux-kernel

我正在探索Linux操作系统中的内存管理。

据我所知,MMU是一个集成在现代CPU中的硬件来处理地址转换。如果TLB中没有虚拟地址,则 MMU将首先通过页表基址寄存器(PTBR)获取进程页表的地址,然后从位于物理内存中的页表中检索物理地址。

我的问题是:MMU如何通知操作系统物理页面已被访问或修改,因为操作系统负责页面替换?我在Linux / mm / swap.c中看到了一个函数。但我不确定每次更新页表时是否调用此函数。

void mark_page_accessed(struct page *page)
{
    if (!PageActive(page) && !PageUnevictable(page) && PageReferenced(page)) {
        /*
        * If the page is on the LRU, queue it for activation via
        * activate_page_pvecs. Otherwise, assume the page is on a
        * pagevec, mark it active and it'll be moved to the active
        * LRU on the next drain.
        */
        if (PageLRU(page))
            activate_page(page);
        else
            __lru_cache_activate_page(page);
        ClearPageReferenced(page);
        if (page_is_file_cache(page))
            workingset_activation(page);
    } else if (!PageReferenced(page)) {
        SetPageReferenced(page);
    }
}

我认为MMU可能会修改页面表的PTE标志。但操作系统不会只知道操作系统是否会进行页面表行走,对吧?页面替换是在物理页面上执行的,物理页面上是否还有一些标志?我必须遗漏一些非常重要的东西..

由于

1 个答案:

答案 0 :(得分:0)

我读了一些关于Linux内存管理的相关书籍。我认为基本步骤包括:

  • 该过程想要访问虚拟地址;
  • 处理器检查TLB是否存在从虚拟地址到物理地址的缓存映射;如果找到缓存的地图,请跳至步骤4;
  • 使用流程的页面表获取实际地址;
  • 如果页面未显示在物理内存中,则触发页面错误并执行页面交换。访问物理页面;
  • 更新页面标志,例如page-> flags中的脏位或引用位。

操作系统使active_list包含最近引用的物理页面,以及包含回收候选项的inactive_list。页面替换的策略在swap.c文件中实现。

对于active_list中的页面,如果它到达列表的底部,则会检查引用的标志。如果已设置,页面将移回列表顶部,并检查下一页;否则,页面将移至inactive_list。

总之,我猜,我的问题的答案

  

内存管理单元(MMU)如何通知操作系统页表已更新?

就是那个

  

MMU没有通知操作系统页面表是直接更新的。它更新物理页面的标志(struct page中的标志)。当操作系统执行页面替换时,如果物理页面到达active_list或inactive_list的尾部,则检查页面标志以确定页面是否需要替换或移动到两个列表的头部。