【发布时间】:2017-06-28 11:47:20
【问题描述】:
Arch=x86_64
我正在按照这个问题中概述的过程通过 DMA 解决方案, Direct Memory Access in Linux
我对@987654322@ 的调用成功返回一个地址,pt。
在我对remap_pfn_range 的调用中,我使用virt_to_phys(pt) >> PAGE_SHIFT 来指定ioremap 调用生成的区域的pfn。
当使用mmap 的用户空间应用程序执行并调用remap_pfn_range 时,机器崩溃。我假设映射已关闭,并且我正在强制系统使用已分配的内存(退出前的屏幕故障),但是我不清楚发生不匹配的位置。系统有 4 Gigs 的 Ram,我使用内核引导选项 mem=2048M 保留了 2Gigs。
我使用BUFFER_SIZE=1024u*1024u*1024u 和BUFFER_OFFSET=2u*1024u*1024u*1024u。
将这些放入pt=ioremap(BUFFER_SIZE,BUFFER_OFFSET) 我相信 pt 应该等于位于 2GB 边界到 3GB 边界的物理内存的虚拟地址。这个假设准确吗?
当我执行我的内核模块,但我将remap_pfn_range 更改为使用vma->vm_pgoff>>PAGE_SHIFT 作为目标pfn 时,代码执行没有错误,我可以读取和写入内存。但是,这并没有使用我想要的保留物理内存。
由于使用vma->vm_pgoff>>PAGE_SHIFT 时一切正常,我相信我的罪魁祸首在我的ioremap 和remap_pfn_range 之间
感谢您的任何建议!
使用此内核模块的动机是需要为来自 PCI 设备的 DMA 提供大的连续缓冲区。在这个应用程序中,重新编译内核不是一个选项,所以我尝试使用模块 + 硬件来完成它。
【问题讨论】:
标签: c linux memory-management linux-kernel