Ale*_*lex 5 c posix mmap linux-device-driver linux-kernel
我想使用 .map 将设备内存(NIC)映射到内核空间内存区域ioremap_wc()。然后我想从内核空间到用户空间的重新映射内存区域,我可以使用2个功能是:vm_insert_page()与remap_pfn_range()
POSIXmmap(3)通常使用第二种:remap_pfn_range()
vm_insert_page()和之间有什么区别remap_pfn_range(),我什么时候需要使用vm_insert_page()而不是remap_pfn_range()?
顾名思义,vm_insert_page()映射单个页面,而映射连续的内核内存remap_pfn_range()块。检查原型和注释vm_insert_page , remap_pfn_range
例如,您可以使用vm_insert_page来映射vmallocaree
do {
page = vmalloc_to_page(vaddr);
vm_insert_page(vma, uaddr, page);
vaddr += PAGE_SIZE;
} while(/* there is something to map */);
Run Code Online (Sandbox Code Playgroud)
它是不可能使用的,remap_pfn_range因为它只映射内核内存的连续块。
另一个区别是,remap_pfn_range您不仅可以映射 RAM 缓冲区,还可以映射其他范围。您vm_inser_page可以仅映射 RAM 缓冲区
Linus的解释