免费注册 查看新帖 |

Chinaunix

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

dma_alloc_coherent()函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-20 16:30 |只看该作者 |倒序浏览
本帖最后由 527639827 于 2010-05-21 08:22 编辑

从ldd3上440页看到 建立一致性DMA映射函数
   
    rc=dma_alloc_coherent(struct *dev, size_t size, dma_addr_t *dma_handle, int flag)

该函数实际获得两个地址,
    1、函数的返回值是一个(rc),代表缓冲区的内核虚拟地址
    2、相关的总线地址,保存在dma_handle中


我有一些疑问:

1、dma_handle这个地址究竟是干什么用的?如果我的dev是个pci设备,那么dma_handle是不是代表的dev的总线地址?

2、如果我修改rc地址里面的值,或者修改dma_handle里面的值,那么另外一个是不是应该发生相应的变化,毕竟都是同一片内存啊。
    可是我修改一个,另外一个都没有反应,感觉上这两个地址值是互不相干的,哪位大侠给我解释解释啊。。。

论坛徽章:
0
2 [报告]
发表于 2010-05-21 11:00 |只看该作者
dma_handle用于保存设备信息

论坛徽章:
0
3 [报告]
发表于 2010-05-22 09:30 |只看该作者
dma_handle用于保存设备信息
0vk0 发表于 2010-05-21 11:00


能不能说详细点?

论坛徽章:
0
4 [报告]
发表于 2010-05-23 15:34 |只看该作者
dma_handle里面的值只能获取不能修改,你修改的时候没报错么

论坛徽章:
0
5 [报告]
发表于 2010-05-24 08:09 |只看该作者
dma_handle里面的值只能获取不能修改,你修改的时候没报错么
0vk0 发表于 2010-05-23 15:34


能修改啊?直接用writel或者ioremap之后用writel都能修改,反而是rc必须ioramp之后才能改,能给我解释下为啥不能改么?那本书有提到?

论坛徽章:
0
6 [报告]
发表于 2010-05-24 11:20 |只看该作者
dma_addr_t里面的变量是由内核来控制的

论坛徽章:
0
7 [报告]
发表于 2010-05-27 11:39 |只看该作者
dma_handle这个变量保存的是bus地址,在X86架构下,bus地址=物理地址,而其他架构就不一定了,比如我的arm架构,bus地址和物理地址就存在一个偏移,bus地址是pci总线识别的地址,而cpu识别的地址是物理地址,因为对pci总线地址的操作应该是要通过bus_to_virt()等系列函数进行转换

本来我以为bus_to_virt()是将bus地址转换为虚拟地址,可是最近实践却发现时将bus地址转换为物理地址,想要得到虚拟地址,还得phys_to_virt()一下得到的物理地址,不知道哪个大侠能来解释下,为啥啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP