2016-07-21 93 views
1

我正在探索Linux操作系统中的内存管理。内存管理单元(MMU)如何通知操作系统页表已更新?

据我所知,MMU是一个集成在现代CPU中的硬件来处理地址转换。如果虚拟地址不在TLB中,则MMO将首先通过页表基址寄存器(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

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

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

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

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

最后,我想,回答我的问题

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

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