vm_insert_page() 和 remap_pfn_range() 有什么区别?

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()

Fed*_*ico 4

顾名思义,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解释