【发布时间】:2016-04-03 16:18:48
【问题描述】:
目前,我正在使用example driver 来学习,并以此为基础建立了自己的自定义驱动程序。 mmap 代码几乎完全相同,除了我允许用户管理他们自己请求的大小并以此为基础分配内存以及我在 /dev 中自动创建 char 设备这一事实。
为了解释上下文,对于我的用例,我想缩小我遇到的一个问题。 dma_mmap_coherent 在使用 kmalloc 的内存时可以测试工作,但是当我有一个保留的物理地址区域时,我想使用它的 remap_pfn_range 安静地工作,并且 dmesg 没有报告任何错误,但是当我去阅读时,无论我在那里写了什么,它总是返回 0xff 字节。无论我是在 ioremap'ing 内存之后在内核空间中使用 iowrite 和 ioread 还是尝试使用小型 mmap'ing 用户空间测试在用户空间中写入,这都是正确的。
我已经对这个主题进行了我能想到的尽可能多的研究。对于 remap_pfn_range 的文档,我只能找到kernel.org page,以及 remap_pfn_range 上的一些内核 gmain 邮件列表存档替换 remap_page_range。至于 dma_mmap_coherent,我能找到更多,including a presentation from the linux archives。
最终必须有所不同;似乎有很多不同的方法可以将内核内存映射到用户空间。我的具体问题是:dma_mmap_coherent 和remap_pfn_range 有什么区别?
编辑最好提供将内核内存映射到一般用户空间的方法的总体概述,涵盖如何在内核驱动程序 mmap 回调中使用不同的 api。
【问题讨论】:
-
你有没有想过这个问题,即一起使用 mmap 和 dma_mmap_coherent?我做不到,我自己做了读写函数。
-
是的,我确实使用了那些特定的功能。你想要一个例子吗?我特别在寻找 remap_pfn_range 和 dma_mmap_coherent 之间的区别,以便我知道要走哪条路线。
-
如果你能发布一个这个工作的例子,那就太好了。我猜用户端代码是标准的,而 kmod 是我出错的地方。
-
当然我会在有时间的时候发布一些东西。我很确定我自己也从一个例子中学到了东西,但我很快就会制作并测试一个。你用的是什么内核版本?
标签: c linux linux-kernel