【发布时间】:2011-08-30 11:05:14
【问题描述】:
我正在寻找一种在 Linux 上分配内存的方法,类似于 Windows 上的 VirtualAlloc。要求是:
- 要分配的内存块大小为 2^16。
- 内存块地址大于0x0000ffff
- 内存块地址的最后 16 位必须为零。
在 Windows 上,因为应用程序地址的下限 (lpMinimumApplicationAddress) 我们有 (2) 明显的权利。从(1)、(2)和系统规则我们也实现了(3)。
感谢您的帮助。
【问题讨论】:
-
@Ignacio:通常用于 DMA。这(间接)是直接 I/O 函数通常需要对齐缓冲区的原因。
-
用户代码在为 DMA 分配内存做什么?
-
@Ignacio:我刚刚告诉过你:直接(无缓冲)I/O。在 Windows 上为
FILE_FLAG_NO_BUFFERING。不确定它是如何在 Linux 上完成的,但内核只是锁定您提供的缓冲区并将其用于 DMA,而不是从 DMA 反弹缓冲区复制。 “零拷贝 I/O”需求量很大。 -
@Ignacio:对于#3,我正在尝试实现内存池。我可以通过 (blockPtr & 0xffff0000) 获得块的地址。这在释放块时很有用。
标签: linux virtualalloc