我正在探索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标志。但操作系统不会只知道操作系统是否会进行页面表行走,对吧?页面替换是在物理页面上执行的,物理页面上是否还有一些标志?我必须遗漏一些非常重要的东西..
由于
答案 0 :(得分:0)
我读了一些关于Linux内存管理的相关书籍。我认为基本步骤包括:
操作系统使active_list包含最近引用的物理页面,以及包含回收候选项的inactive_list。页面替换的策略在swap.c文件中实现。
对于active_list中的页面,如果它到达列表的底部,则会检查引用的标志。如果已设置,页面将移回列表顶部,并检查下一页;否则,页面将移至inactive_list。
总之,我猜,我的问题的答案
内存管理单元(MMU)如何通知操作系统页表已更新?
就是那个
MMU没有通知操作系统页面表是直接更新的。它更新物理页面的标志(struct page中的标志)。当操作系统执行页面替换时,如果物理页面到达active_list或inactive_list的尾部,则检查页面标志以确定页面是否需要替换或移动到两个列表的头部。