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
来映射vmalloc
aree
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的解释