Arm Linux如何预留并使用超大内存

[复制链接]
查看11 | 回复7 | 2021-1-27 05:10:05 | 显示全部楼层 |阅读模式
Hiall,
最近在做一个事情,我们的Linux系统里集成了一个FPGA,系统使用2G内存,我们希望使用后面的1G内存作为FPGA数据存取空间,内核通过DMA读取FPGA数据,请问大家有木有好的思路,如何实现?
已经试过的方式:
1.kmalloc,这种方法我只能最多申请到700多M空间就挂了
2.dma_alloc_coherent,这个我只能申请64M的空间
3.uboot传参mem=1G,这样后面的1G就被reserve了,但是内核里面不知道怎么样使用?
欢迎讨论!
谢谢了:)
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
没有具体研究过,这还有一个做法:
http://blog.csdn.net/21cnbao/article/details/7309757
回复

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
楼主,dma_alloc_coherent我现在只能申请2M下来,有什么办法么,在arm上用
回复

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
内核空间中可以用ioremap映射成虚拟地址,用户空间中用mmap映射成虚拟地址。然后像普通内存一样用。
这种情况下,这些内存可能没有被cache,memcpy的速度比正常内存慢。而且fpga写内存时可能与arm系统读内存存在冲突。
回复

使用道具 举报

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

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
FPGA在这里可以看为外设,虽然理论上说,DMA是可以覆盖4GB的虚拟地址空间,但是这里应该访问的是DMA_ZONE,而DMA_ZONE根据不同硬件配置又不同,一般是256M的居多。
回复

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
当然,16MB的也有很多。
回复

使用道具 举报

千问 | 2021-1-27 05:10:05 | 显示全部楼层
uboot传参mem=1G
使用这种方法,预留的1G内存使用ioremap内核直接使用,用户态使用mmap使用该块内存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行