- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 ioremap_wc()
将设备内存 (NIC) 映射到内核空间内存区域。然后我想将内存区域从内核空间重新映射到用户空间,为此我可以使用 2 个函数:vm_insert_page()
和 remap_pfn_range()
POSIX mmap(3)
通常使用第二种:remap_pfn_range()
vm_insert_page()
和 remap_pfn_range()
有什么区别,我什么时候需要使用 vm_insert_page()
而不是 remap_pfn_range()
?
最佳答案
顾名思义vm_insert_page()
映射一个单页,而remap_pfn_range()
映射一个连续的内核内存 block 。查看原型(prototype)和评论 vm_insert_page , remap_pfn_range
例如,您可以使用 vm_insert_page
到 map vmalloc
区域
do {
page = vmalloc_to_page(vaddr);
vm_insert_page(vma, uaddr, page);
vaddr += PAGE_SIZE;
} while(/* there is something to map */);
不可能使用remap_pfn_range
因为它只映射一个连续的内核内存块。
另一个区别是 remap_pfn_range
您不仅可以映射 RAM 缓冲区,还可以映射其他范围。与 vm_inser_page
你可以只映射 RAM 缓冲区
安explanation来自莱纳斯
关于c - vm_insert_page() 和 remap_pfn_range() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27468083/
Arch=x86_64 我正在按照这个问题中概述的流程完成 DMA 解决方案, Direct Memory Access in Linux 我对 ioremap 的调用成功返回了地址 pt。 在调用
我正在使用 ARM 上的内核 3.18。我正在从正在为其编写驱动程序的相机读取数据。我使用以下设置内存: cpu_handle = dma_alloc_coherent(NULL, dma_size,
我想使用 ioremap_wc() 将设备内存 (NIC) 映射到内核空间内存区域。然后我想将内存区域从内核空间重新映射到用户空间,为此我可以使用 2 个函数:vm_insert_page() 和 r
目前,我正在使用 example driver从中学习,并从中建立了自己的自定义驱动程序。 mmap 代码几乎完全相同,除了我允许用户管理他们自己请求的大小并以此为基础进行内存分配,以及我在/dev
我准备了一个在 ARM Intel Cyclone V SoC 上运行的应用程序。我需要将 DMA 相干内存缓冲区映射到用户空间。缓冲区在设备驱动程序中分配: buf_addr = dmam_allo
我是一名优秀的程序员,十分优秀!