我一直在通过一些实验学习linux内核。最近我想知道是否可以通过将一个进程的页面插入另一个进程的vma结构来在两个用户空间进程之间共享页面,后者调用mmap和通过 netlink 将地址发送回内核。插入将在驱动程序模块中完成。此测试的原因是两个进程可能不直接相互通信,并且只读内存的重复页面可能是考虑到效率和冗余的错误选择。
经过一番研究,我发现了 vm_insert_page 函数和传统的 remap_pfn_range。但是它在 lxr 中说:
/** 2020 * vm_insert_page - 将单页插入用户 vma
2021 * @vma:要映射到的用户 vma
2022 * @addr: 本页目标用户地址
2023 * @page:源内核页面
2024 *
2025 * 这允许驱动程序插入他们分配的单个页面
2026 * 进入用户 vma。
2027 *
2028 *该页面必须是一个干净整洁的单独内核分配。”
这是否意味着不可能将现有页面插入另一个 vma?该函数只能与新创建的页面一起调用?我一直认为页面可以与引用计数共享。