xrqun 发表于 2010-05-11 19:40

内存映射和DMA

本帖最后由 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.或者是其他的什么办法

accessory 发表于 2010-05-12 22:42

方法1:搜索alloc_bootmem,这个是在启动时保留一块大内存,不过要改内核。

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

xrqun 发表于 2010-05-13 12:44

谢谢。
采用第二种方法实验了,可以的。
已经做通了。

accessory 发表于 2010-05-13 23:08

不客气。{:2_171:}
页: [1]
查看完整版本: 内存映射和DMA