Linux 是否可以将现有页面插入另一个VMA结构?

Linux 是否可以将现有页面插入另一个VMA结构?,linux,memory-management,linux-kernel,kernel,Linux,Memory Management,Linux Kernel,Kernel,我一直在通过一些实验学习linux内核。最近我想知道,通过将一个进程的页面插入到另一个进程的vma结构中,是否有可能在两个用户空间进程之间共享页面,在后者调用mmap并通过netlink将addr发送回内核之后。插入将在驱动程序模块中完成。进行此测试的原因是,这两个进程可能不会直接相互通信,并且考虑到效率和冗余,只读内存的重复页可能是一个错误的选择 经过一些研究,我发现了vm_insert_page函数和传统的remap_pfn_范围。然而,它在lxr中说: /** 2020*vm_插入_页面-

我一直在通过一些实验学习linux内核。最近我想知道,通过将一个进程的页面插入到另一个进程的vma结构中,是否有可能在两个用户空间进程之间共享页面,在后者调用mmap并通过netlink将addr发送回内核之后。插入将在驱动程序模块中完成。进行此测试的原因是,这两个进程可能不会直接相互通信,并且考虑到效率和冗余,只读内存的重复页可能是一个错误的选择

经过一些研究,我发现了vm_insert_page函数和传统的remap_pfn_范围。然而,它在lxr中说:

/** 2020*vm_插入_页面-将单个页面插入用户vma

2021*@vma:要映射到的用户vma

2022*@addr:此页面的目标用户地址

2023*@页:源内核页

2024年*

2025*这允许驱动程序插入他们分配的单个页面

2026*进入用户vma

2027年*

2028*页面必须是一个干净的单独内核分配


这是否意味着无法将现有页面插入到另一个vma中?该函数只能用新创建的页面调用?我一直认为页面可以与引用计数共享。

我认为Linux内核中没有任何函数可以完全满足您的要求。但是内核中的do_mmap_pgoff函数首先通过遍历与文件相关的地址空间来搜索是否已经存在一个页面缓存,如果存在,它将共享当前进程vma结构中的页面缓存。所以,如果你想做类似的功能,你可以遵循do_mmap_pgoff函数的方法。@tian_yufeng,谢谢你,我来看看;