免费注册 查看新帖 |

Chinaunix

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

关于 vmalloc 的几点疑惑…… [复制链接]

论坛徽章:
0
1 [报告]
发表于 2009-05-16 09:19 |显示全部楼层
vmalloc 应该不能直接为 DMA 申请内存。可以使用 kmalloc 或更低层的函数 alloc_page() /
__get_free_page() 加上 GFP_DMA 标志为 DMA 申请内存。这个标志从 zonelist  的
ZONE_DMA 区域进行分配,以保证物理内存的连续性。

论坛徽章:
0
2 [报告]
发表于 2009-05-17 11:18 |显示全部楼层
对于scatter/gather模式,在这里我理解是要看硬件设备是否支持,否则一
次 DMA 传多个不连续的页面,也没有什么意义吧?还有所谓 DMA 的支持函数,
我看到的都是内部实际调用的 __get_free_pages() 等函数,如 dma_pool_alloc()
/ dma_alloc_coherent()  函数。前者先在 dma pool list cache 中查找,
找不到则调用了 pool_alloc_page(),而在这个函数中调用了 dma_alloc_coherent()
->__get_free_pages() 从而得到页面。在某些体系下 dma_alloc_coherent() 则
直接调用了 alloc_pages() 来分配页面。


如果这么说的话,那么和 WINDOWS 提供的 MDL 应用于 scatter/gather 的 DMA
方式应该是一个意思。DMA controller 用 SCATTER_GATHER_LIST 标识相关页面,
在 DMA_OPERATIONS 中由 GetScatterGatherList->PDRIVER_LIST_CONTROL
的回调函数处理 SCATTER_GATHER_LIST 的相关页面。而 linux 的 DMA 内存分配函
数我没有仔细看,只是知道它内部调用了 __get_free_pages() / alloc_pages() 等函数。
了解的可以说一下。

[ 本帖最后由 sinister 于 2009-5-17 14:40 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-05-17 12:06 |显示全部楼层
恩,看到 “DMA需要的内存有专门的函数分配” 忽略了后面 “直接” 两字。误解了你的意思。

论坛徽章:
0
4 [报告]
发表于 2009-05-19 00:35 |显示全部楼层
原帖由 eexplorer 于 2009-5-18 14:28 发表


ZONE_DMA 是16M以下的物理内存,只是给一些旧的设备,之能访问16M以内的物理内存。现在的pci设备的dma engine都能访问4G以内的内存。
所以分配dma able的内存不需要指定GFP_DMA,否则你可能很快就分配不出 ...



恩,补充的对。因为前面没有提级具体的硬件设备,没有说分配的 DMA 内存,是否为 ISA 设备使用。考虑到兼容性的问题,所以我说“可以使用”,而非“必须使用”。并指明了 GFP_DMA 标志是从 zonelist 的 ZONE_DMA 分配的内存,因为在这个区域中仅包含物理内存的 0-16M 前 16M。而这前 16M 正是给那些无法在整个 32 BIT 地址空间中进行 DMA 的设备提供的,如 ISA 这种只能访问物理内存前 16M 的设备。当然这里所说的 ZONE_DMA 的作用仅是指 x86 而言,因为在某些体系下 ZONE_DMA 本就为空。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP