获取大块物理内存

追上我就让你嘿嘿嘿 2018-01-25 05:21:59
如果要用DMA的话,需要大块的物理内存,假设现在需要一块很大的内存(1G),但get_free_pages()方法一次最大只能分配4M的连续空间,如果通过多个调用get_free_pages的话,又不能保证多次调用之间得到的内存是一块连续的空间,那么我在不编译内核的情况下,如何得到连续的大块物理内存呢??
...全文
1242 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
大家有了解过DPDK么,DPDK采用的分配DMA地址的方式貌似可以分配很大的物理空间。具体的方式是设置大页内存。我测试过,这种方式进行DMA操作是可行的,也就是说申请的物理内存是连续的。接口如下,其中65535*4096就可以当作是进行DMA操作的内存空间,当然这2个值是可改的,上限就是你的大页内存分配的大小。 memory_pool = rte_mempool_create(name_str, 65535, 4096, MBUF_CACHE_SIZE, sizeof(struct rte_pktmbuf_pool_private), rte_pktmbuf_pool_init, NULL, rte_pktmbuf_init, NULL, rte_eth_dev_socket_id(port), // allocate the memory on the NUMA node to which the NIC is connected to 0);
Hello Worm 2018-02-26
  • 打赏
  • 举报
回复
举个栗子,视频图像处理,不说高的,一帧1080P的图像就需要1920*1080*3Byte(假设RGB格式,实际可能更多),差不多6MB,一秒钟是60帧,也就是说1GB的大小理论上仅能存个3秒左右的视频。当然实际场景很少存raw图像,但在有些情况,例如后端网络波动时略微缓存几帧图像是真实存在的,而且有些设备处理的不是1路视频,而是3路。。。
引用 3 楼 heronism 的回复:
好奇了解下,分配这么大(1G)连续内存实际需求(场景)是什么,谢谢
zhxianbin 2018-02-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/21cnbao/article/details/7309757 (Linux内核最新的连续内存分配器(CMA)——避免预留大块内存) http://bbs.chinaunix.net/thread-1967403-1-1.html
heronism 2018-02-22
  • 打赏
  • 举报
回复
好奇了解下,分配这么大(1G)连续内存实际需求(场景)是什么,谢谢
Hello Worm 2018-02-09
  • 打赏
  • 举报
回复
如果你是在嵌入式系统上,那么可以预留一块内存来实现,本质上,如楼上的哥们所说,这块内存其实是脱离MMU管理的。印象中主要修改一下几个方面 1.自己计算内存大小和地址,包括需要预留的大小 2.在u-boot中指定内存大小时,要减去你预留的那一块区域大小 3. 可以通过驱动的方式映射你预留的那一块区域,映射用的函数参考mmap和munmap系统调用对应的实现函数。 总之,这个工作并不是那么简单,可能还是需要好几天来完成的。
InDepth 2018-02-06
  • 打赏
  • 举报
回复
没办法的,我记得当年实现是通过修改内核代码,在内核内存管理之前预先留下一块内存,后续内核模块访问该内存的地址,最大分配过2G

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧