从用户空间缓冲区复制到内核空间缓冲区与将用户空间缓冲区映射到内核空间缓冲区然后将内核空间缓冲区复制到另一个内核数据结构有什么区别?
我想说的是:
第一种方法是
copy_from_user()
函数。第二种方法是说,一个用户空间缓冲区映射到内核空间,内核传递物理地址(比如 using
/proc/self/pagemap
),然后内核空间调用phys_to_virt()
传递的物理地址以获取它对应的内核虚拟地址。然后内核将数据从其数据结构之一复制skb_buff
到它从调用中获得的内核虚拟地址phys_to_virt()
。注意:向传递的物理地址
phys_to_virt()
添加偏移量0xc0000000
以获得内核虚拟地址,对吗?
第二种方法描述了 DPDK 中 KNI 模块的功能,他们在文档中说它消除了从用户空间复制到内核空间的开销。请解释我如何。