当前位置:  技术问答>linux和unix

关于DMA_driver的一些问题?

    来源: 互联网  发布时间:2016-11-23

    本文导语:  本人最近在写一个DMA的driver,第一次写driver,现在有些下面的疑问,请大侠们解疑啊: 1.DMA中缓冲池或缓冲区是否是必须的? 在DMA其实内部是一个一定大小的FIFO,是否在逻辑上还需要一个缓冲区或缓冲池来缓存FIFO处...

本人最近在写一个DMA的driver,第一次写driver,现在有些下面的疑问,请大侠们解疑啊:
1.DMA中缓冲池或缓冲区是否是必须的?
在DMA其实内部是一个一定大小的FIFO,是否在逻辑上还需要一个缓冲区或缓冲池来缓存FIFO处理不过来的数据呢?如果是这个缓冲区使用kmalloc分配的返回的是虚拟地址(物理上连续的),我在将其做为DMA的buffer使用的时候需要将其转换为物理地址,然后外设或内存来数据的时候都需要将其拷贝到该buffer,这里的拷贝cpu将会参与,这样不是脱离了DMA传输带来的优势,若是用DMA的方式将数据拷贝到这个buffer,那不是又出现了fifo数据处理不过来需要建立缓冲的矛盾吗?总之问题在于:若是有这个buffer,如何将外设或内存的数据放到这个buffer,再由这个buffer发送到目的外设或内存中去呢?
2. DMA操作必须是连续的物理地址,但是用户层使用你的driver传下的虚拟地址只能保证在逻辑上是连续的,那么driver内部是否需要判断传下的虚拟地址是否在物理上连续,再对其进行相应的处理吗?

|
哦,我可能明白你的意思了,你的意思是在用户空间指定源和目的地址,然后在内核中采用dma的办法来实现这两者间的传输。额,如果是这样的话,不幸的告诉你,这个必须要使用内核的API从而将数据从用户空间传替到内核空间的,不可能直接使用dma的。如果还没有很明白的话,你还是仔细看看上一篇回复你的帖子。

|
问题1:这个问题,i don't know
问题2:用户传下来虚拟地址,将其转换成物理地址,做成DMA传输的基地址,这种方式可能会出问题;其一,就像你说的不连续,其二,就是这段内存不一定是zone[DMA]区得地址,那么DMA控制器可能无法寻址;其三,用户空间的虚拟地址转换成物理地址应该比较麻烦(不比kernel空间的一致性映射的内存,只需要做简单的线性变换),不知道kernel是否提供了相应的API。
 所有,你可能需要更改你driver的设计,让DMA的内存在kernel中分配,然后用户读数据时,就copy_to_user;

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3