Linux 内存管理单元(MMU)如何通知操作系统页面表已更新?
我正在探索Linux操作系统中的内存管理 据我所知,MMU是集成在现代CPU中处理地址转换的硬件。如果TLB中没有虚拟地址,则 MMU将首先通过页表基址寄存器(PTBR)获取进程页表的地址,然后从物理内存中的页表中检索物理地址 我的问题是:当操作系统负责页面替换时,MMU如何通知操作系统物理页面已被访问或修改?我在Linux/mm/swap.c中看到了一个函数。但我不确定是否每次更新页表时都调用此函数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) {
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李>
- 使用进程的页表获取物理地址李>
- 如果页面未显示在物理内存中,则触发页面错误并执行页面交换。访问物理页面李>
- 更新页面标志,如页面->标志中的脏位或引用位
我读了一些关于Linux内存管理的相关书籍。我认为基本步骤包括:
- 进程希望访问虚拟地址李>
- 处理器检查TLB是否存在从虚拟地址到物理地址的缓存映射;如果找到缓存的映射,则跳到步骤4李>
- 使用进程的页表获取物理地址李>
- 如果页面未显示在物理内存中,则触发页面错误并执行页面交换。访问物理页面李>
- 更新页面标志,如页面->标志中的脏位或引用位