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() 与我想要的任何地址一起使用,但该解决方案可能不太便携)。

【问题讨论】:

为什么设备驱动没有分配内存? 你为什么使用mmapmalloc 怎么样?你能告诉我原因吗? 因为我不能告诉 malloc 分配低于 4GB,而且我的程序是用 64 位编译的。在 Visual Studio 中,我可以使用 /LARGEADDRESSAWARE:NO,但据我所知,GCC 中没有类似的东西。 @user1483597 mmap() 始终通过构造为您提供页面对齐的内存。 @AndrewHenle 我需要将代码本身编译为 64 位,但特定的缓冲区地址为 32 位宽。听起来很奇怪,但这正是我所需要的。 【参考方案1】:

只需 mmap 一个(首先四舍五入到下一个幂)两倍于您需要的块,然后 munmap 不需要的块。

【讨论】:

好主意,但我认为可能有更简单的东西。 @user1483597,可能是,但我在生产代码中多次看到我的答案,所以我想这是最简单的解决方案。顺便说一句:标记为已解决的答案通常不再吸引访问者。最好等一两天再将我的答案标记为已接受,这样您可能会得到更好的解决方案。

以上是关于Linux/GCC 中 mmap() 和 memalign() 的组合?的主要内容,如果未能解决你的问题,请参考以下文章

mmap() 在内核空间和用户空间中是不是相同?

linux中ioremap和mmap的区别

内存映射mmap 和 共享内存

Linux 共享内存:shmget() 与 mmap()?

linux gcc编译参数有啥用?

Android跨进程通信-mmap函数