Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 内存管理单元(MMU)如何通知操作系统页面表已更新?_Linux_Linux Kernel - Fatal编程技术网

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

Linux 内存管理单元(MMU)如何通知操作系统页面表已更新?,linux,linux-kernel,Linux,Linux Kernel,我正在探索Linux操作系统中的内存管理 据我所知,MMU是集成在现代CPU中处理地址转换的硬件。如果TLB中没有虚拟地址,则 MMU将首先通过页表基址寄存器(PTBR)获取进程页表的地址,然后从物理内存中的页表中检索物理地址 我的问题是:当操作系统负责页面替换时,MMU如何通知操作系统物理页面已被访问或修改?我在Linux/mm/swap.c中看到了一个函数。但我不确定是否每次更新页表时都调用此函数 void mark_page_accessed(struct page *page) {

我正在探索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可能会修改page表的PTE标志。但操作系统不会只知道操作系统是否执行页表遍历,对吗?页面替换是在物理页面上执行的,物理页面上是否也有一些标志?我一定错过了一些非常重要的事情


谢谢

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

  • 进程希望访问虚拟地址
  • 处理器检查TLB是否存在从虚拟地址到物理地址的缓存映射;如果找到缓存的映射,则跳到步骤4
  • 使用进程的页表获取物理地址
  • 如果页面未显示在物理内存中,则触发页面错误并执行页面交换。访问物理页面
  • 更新页面标志,如页面->标志中的脏位或引用位
操作系统保留一个活动的_列表以包含最近引用的物理页面,以及一个非活动的_列表以包含回收候选页面。页面替换策略在swap.c文件中实现

对于活动_列表中的页面,如果它到达列表的底部,则选中引用标志。如果设置了,则该页将移回列表顶部,并检查下一页;否则,页面将移动到非活动列表

最后,我想,我的问题的答案是

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

是吗

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


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

  • 进程希望访问虚拟地址
  • 处理器检查TLB是否存在从虚拟地址到物理地址的缓存映射;如果找到缓存的映射,则跳到步骤4
  • 使用进程的页表获取物理地址
  • 如果页面未显示在物理内存中,则触发页面错误并执行页面交换。访问物理页面
  • 更新页面标志,如页面->标志中的脏位或引用位
操作系统保留一个活动的_列表以包含最近引用的物理页面,以及一个非活动的_列表以包含回收候选页面。页面替换策略在swap.c文件中实现

对于活动_列表中的页面,如果它到达列表的底部,则选中引用标志。如果设置了,则该页将移回列表顶部,并检查下一页;否则,页面将移动到非活动列表

最后,我想,我的问题的答案是

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

是吗

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