![Linux 如何将物理地址转换为(可能是多个)虚拟地址?](https://linux22.com/image/165340/Linux%20%E5%A6%82%E4%BD%95%E5%B0%86%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2%E4%B8%BA%EF%BC%88%E5%8F%AF%E8%83%BD%E6%98%AF%E5%A4%9A%E4%B8%AA%EF%BC%89%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
根据我的理解,当Linux将物理页帧交换进/出RAM时,它需要为映射到该物理页的所有虚拟页设置有效位。将虚拟页映射到物理页框似乎在教科书中解释得很好,但是内核如何从物理页框找到所有虚拟页呢?如果能在 Linux 源代码中实际实现,我们将不胜感激。
答案1
内存的每个物理页都在内核中使用以下命令进行跟踪结构页。这允许内核描述每个页面是如何使用的;特别是,对于匿名和文件支持的映射,映射字段指向address_space
用于描述映射对象的结构。
对于需要使用给定物理页查找虚拟映射的代码,内核提供了一组反向映射函数。这些允许遍历匿名映射和文件支持映射的反向映射。例如,try_to_unmap
遍历映射查找给定物理页面的任何使用情况,以便可以取消映射。shrink_page_list
来电try_to_unmap
当它决定需要取消映射映射到进程的页面时。