免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4977 | 回复: 7
打印 上一主题 下一主题

[硬件及驱动] dma映射 pci_map_page [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-04 18:17 |只看该作者 |倒序浏览
这样的,用户传递过来的缓存char* user_buf 在物理内存中不一定是连续的,我要在pcie-dma设备中使用 DMA方式 把 这一坨数据传到设备。

dma不是要总线地址吗!

get_user_pages 可以得到 user_buf 的所有的 page 结构,,可能有些 page对应的物理内存 还是 连续的,,,
这样我就需要把这些 对应的内存连续的 page 映射 到一块连续 的总线地址区间,,,,可是 pci_map_page 一次只能映射一个page啊?~
这岂不是有点坑爹,?!是不是有什么其他的函数,,,!

以前都是用dma_map_single  dma_map_sg之类的,这类函数要映射的物理内存都是已经被映射到内核虚拟空间的,。。。
而 user_buf 的所有的 page 结构 对应的 物理内存 应该被映射到了 用户进程 的虚拟空间,而没有映射到 内核的虚拟空间。所以这里也就不能用
dma_map_single  dma_map_sg 这类函数吗?


论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-06-04 19:03 |只看该作者
看似需要支持类似G/S特性的硬件才能直接DMA操作不连续的物理内存?或者有IOMMU?

论坛徽章:
0
3 [报告]
发表于 2014-06-04 19:42 |只看该作者
回复 2# humjb_1983
我这个东西 支持 s/g


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-06-04 19:52 |只看该作者
那不就是用dma_map_sg()接口么?

论坛徽章:
0
5 [报告]
发表于 2014-06-05 17:14 |只看该作者
以前都是用dma_map_single  dma_map_sg之类的,这类函数要映射的物理内存都是已经被映射到内核虚拟空间的,。。。
而 user_buf 的所有的 page 结构 对应的 物理内存 应该被映射到了 用户进程 的虚拟空间,而没有映射到 内核的虚拟空间。所以这里也就不能用
dma_map_single  dma_map_sg 这类函数吗?


恩,假设无IOMMU,一般物理地址到总线地址都是一一映射的,另外对于硬件,它只关心物理地址,并不关心是否被内核映射。你的设备支持SG应该可以直接用pci_map_sg,我觉得这里更要确定,你要保证你ubuf对应的Page不会被swap,所以你在用户程序里面mlock应该就行。

论坛徽章:
0
6 [报告]
发表于 2014-06-11 00:18 |只看该作者
xs3c 发表于 2014-06-05 17:14
恩,假设无IOMMU,一般物理地址到总线地址都是一一映射的,另外对于硬件,它只关心物理地址,并不关心是 ...



用get user page 不需要锁,除非你不再当前进程上下文做dma.

论坛徽章:
0
7 [报告]
发表于 2014-06-11 00:20 |只看该作者
fjaygrfjaygr 发表于 2014-06-04 18:17
这样的,用户传递过来的缓存char* user_buf 在物理内存中不一定是连续的,我要在pcie-dma设备中使用 DMA方式 ...


用了get usr page 然后就可以用你说的函数了

论坛徽章:
0
8 [报告]
发表于 2014-06-11 10:59 |只看该作者
回复 6# Solaris12
多谢指教!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP