Linux/GCC 中 mmap() 和 memalign() 的组合?
Posted
技术标签:
【中文标题】Linux/GCC 中 mmap() 和 memalign() 的组合?【英文标题】:Combination of mmap() and memalign() in Linux/GCC? 【发布时间】:2015-11-23 12:44:23 【问题描述】:我需要在我的 C++ 程序中分配一些内存块,有两个要求。首先分配的地址需要在块大小上对齐,其次它需要分配在 4GB 以下的虚拟地址空间。
memalign()
帮助我解决第一个要求,mmap()
帮助我解决第二个要求,因为我可以将 MAP_32BIT
标志作为参数传递。但是有可能以某种方式将它们组合成一个简单的解决方案吗? (从技术上讲,我当然可以将mmap()
与我想要的任何地址一起使用,但该解决方案可能不太便携)。
【问题讨论】:
为什么设备驱动没有分配内存? 你为什么使用mmap
? malloc
怎么样?你能告诉我原因吗?
因为我不能告诉 malloc 分配低于 4GB,而且我的程序是用 64 位编译的。在 Visual Studio 中,我可以使用 /LARGEADDRESSAWARE:NO,但据我所知,GCC 中没有类似的东西。
@user1483597 mmap()
始终通过构造为您提供页面对齐的内存。
@AndrewHenle 我需要将代码本身编译为 64 位,但特定的缓冲区地址为 32 位宽。听起来很奇怪,但这正是我所需要的。
【参考方案1】:
只需 mmap 一个(首先四舍五入到下一个幂)两倍于您需要的块,然后 munmap 不需要的块。
【讨论】:
好主意,但我认为可能有更简单的东西。 @user1483597,可能是,但我在生产代码中多次看到我的答案,所以我想这是最简单的解决方案。顺便说一句:标记为已解决的答案通常不再吸引访问者。最好等一两天再将我的答案标记为已接受,这样您可能会得到更好的解决方案。以上是关于Linux/GCC 中 mmap() 和 memalign() 的组合?的主要内容,如果未能解决你的问题,请参考以下文章