内存映射和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.或者是其他的什么办法 方法1:搜索alloc_bootmem,这个是在启动时保留一块大内存,不过要改内核。
方法2:改GRUB,加上MEM=256 之类的参数。这样LINUX就只会用指定大小的内存。也就是可以保留出一段物理内存自己用。用的时候先在KERNEL里IOREMAP一下,然后用户程序应该可以通过 /DEV/MEM来访问。不过我只做到内核里自己用的这一步。 谢谢。
采用第二种方法实验了,可以的。
已经做通了。 不客气。{:2_171:}
页:
[1]