Linux 如何将物理地址转换为(可能是多个)虚拟地址?

Linux 如何将物理地址转换为(可能是多个)虚拟地址?

根据我的理解,当Linux将物理页帧交换进/出RAM时,它需要为映射到该物理页的所有虚拟页设置有效位。将虚拟页映射到物理页框似乎在教科书中解释得很好,但是内核如何从物理页框找到所有虚拟页呢?如果能在 Linux 源代码中实际实现,我们将不胜感激。

答案1

内存的每个物理页都在内核中使用以下命令进行跟踪结构页。这允许内核描述每个页面是如何使用的;特别是,对于匿名和文件支持的映射,映射字段指向address_space用于描述映射对象的结构。

对于需要使用给定物理页查找虚拟映射的代码,内核提供了一组反向映射函数。这些允许遍历匿名映射和文件支持映射的反向映射。例如,try_to_unmap遍历映射查找给定物理页面的任何使用情况,以便可以取消映射。shrink_page_list 来电try_to_unmap当它决定需要取消映射映射到进程的页面时。

相关内容