目前,我正在使用一个示例驱动程序来学习,并从中我自己的自定义驱动程序.mmap代码几乎完全相同,除了我允许用户管理他们自己的请求大小并围绕它进行内存分配以及我在/ dev中自动创建char设备这一事实.
为了解释上下文,对于我的用例,我想缩小我遇到的问题.dma_mmap_coherent
在使用kmalloc内存时可以正常工作,但是当我有一个保留的物理地址区域时,我想使用remap_pfn_range,它可以安静地工作,而dmesg不会报告任何错误,但是当我去阅读时,无论如何我写在那里它总是返回0xff字节.无论我在ioremap内存之后使用iowrite和ioread在内核中使用还是尝试使用小型mmap'ing用户态测试在userland中编写,都是如此.
我已经做了尽可能多的关于这个主题的研究.我能找到的有关remap_pfn_range的文档的是kernel.org页面,而一些内核gmain邮件列表存档在remap_pfn_range上,取代了remap_page_range.至于dma_mmap_coherent,我能够找到更多,包括来自linux档案的演示文稿.
最终必须有所不同; 似乎有很多不同的方法将内核内存映射到用户区.我的具体问题是:dma_mmap_coherent
和之间有什么区别remap_pfn_range
?
编辑它可能很好地提供一般概述将内核内存映射到用户区的方法,包括如何在内核驱动程序mmap回调中使用不同的apis.