免费注册 查看新帖 |

Chinaunix

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

内存映射和DMA [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-11 19:40 |只看该作者 |倒序浏览
本帖最后由 xrqun 于 2010-05-11 19:51 编辑

现在做一个驱动,需要使用内存映射和DMA发现有点问题,无法解决。
驱动目的:一个CPU向一个外设发送大量的数据
打算做法:1.在内核中申请大概2M的空间,使用内存映射的方法映射到用户空间,由应用程序在这段空间中填充数据
          2.数据填充好后使用DMA发送给外设
具体做法:内核版本2.6.18
              1.内存映射用户空间:mmap
                             内核空间:no_page,vmalloc()
          2.使用get_free_page申请的空间来传递DMA,使用连续的物理地址空间
问题:
          1.内存映射时使用的是vmalloc申请的地址,在物理上不连续,无法用来做DMA
               2.如果用kmalloc,申请的空间不够
          3.不知能不能用get_free_page做?如何做?
          4.或者是其他的什么办法

论坛徽章:
0
2 [报告]
发表于 2010-05-12 22:42 |只看该作者
方法1:搜索alloc_bootmem,这个是在启动时保留一块大内存,不过要改内核。

方法2:改GRUB,加上MEM=256 之类的参数。这样LINUX就只会用指定大小的内存。也就是可以保留出一段物理内存自己用。用的时候先在KERNEL里IOREMAP一下,然后用户程序应该可以通过 /DEV/MEM来访问。不过我只做到内核里自己用的这一步。

论坛徽章:
0
3 [报告]
发表于 2010-05-13 12:44 |只看该作者
谢谢。
采用第二种方法实验了,可以的。
已经做通了。

论坛徽章:
0
4 [报告]
发表于 2010-05-13 23:08 |只看该作者
不客气。{:2_171:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP