我将多个物理上不连续的内存缓冲区映射到单个线性用户空间地址。我使用 vm_insert_page() 和 get_page()。我需要在所有分配的页面上使用 get_page() 因为只有给定缓冲区的第一页的引用计数 > 0 并且 vm_insert_page() 需要引用计数 > 0。据说(根据网络上的一些帖子)我如果不再需要,必须通过调用 get_page() 来“释放”我增加引用计数的页面。但是,我不太确定如何“释放”这些页面。我是否需要跟踪 get_page() 返回的每个页面结构,然后在取消映射期间调用相应的 API 来释放页面?看起来操作系统不会自动为我做这件事。即用户进程存在后,
我的伪代码是这样的:
使用调用 pci_alloc_consistent() 分配多个 phys 非连续内存缓冲区 对于上面分配的所有缓冲区中的所有 4K 块 使用 virt_to_page(phys_chunk_addr) 创建一个页面结构 // 这是必需的,因为只有物理缓冲区的第一页 // 引用计数 > 0,这是 vm_insert_page() 所需要的! 通过调用 get_page() 增加页面引用计数 使用 vm_insert_page() 将页面放入 vma感谢您的任何建议/指示。担。