Hi all,
最近在做一个事情,我们的Linux系统里集成了一个FPGA,系统使用2G内存,我们希望使用后面的1G内存作为FPGA数据存取空间,内核通过DMA读取FPGA数据,请问大家有木有好的思路,如何实现?
已经试过的方式:
1. kmalloc,这种方法我只能最多申请到700多M空间就挂了
2. dma_alloc_coherent,这个我只能申请64M的空间
3. uboot传参mem=1G,这样后面的1G就被reserve了,但是内核里面不知道怎么样使用?欢迎讨论!
谢谢了:)

解决方案 »

  1.   

    没有具体研究过,这还有一个做法:
    http://blog.csdn.net/21cnbao/article/details/7309757
      

  2.   

    楼主,dma_alloc_coherent我现在只能申请2M下来,有什么办法么,在arm上用
      

  3.   

    内核空间中可以用ioremap映射成虚拟地址,用户空间中用mmap映射成虚拟地址。然后像普通内存一样用。
    这种情况下,这些内存可能没有被cache,memcpy的速度比正常内存慢。而且fpga写内存时可能与arm 系统读内存存在冲突。
      

  4.   

    kmalloc,默认调用2个方向,1个是slab,一个是get_free_page(s),这些都只能映射到物理内存映射区,也就是内核空间的前896M,你要申请700M不出问题就不错了,申请大批量的空间,必然要使用不连续的物理内存,这只能使用vmalloc,使用内核虚拟地址空间。
      

  5.   

    FPGA在这里可以看为外设,虽然理论上说,DMA是可以覆盖4GB的虚拟地址空间,但是这里应该访问的是DMA_ZONE,而DMA_ZONE根据不同硬件配置又不同,一般是256M的居多。
      

  6.   

    uboot传参mem=1G使用这种方法,预留的1G内存使用ioremap内核直接使用,用户态使用mmap使用该块内存