1

我正在寻找一种在 Linux 上分配内存的方法,类似于 Windows 上的 VirtualAlloc。要求是:

  1. 要分配的内存块大小为 2^16。
  2. 内存块地址大于 0x0000ffff
  3. 内存块地址的最后 16 位必须为零。

在 Windows 上,因为应用程序地址的下限 (lpMinimumApplicationAddress) 我们有 (2) 明显的权利。从(1)、(2)和系统规则我们也实现了(3)。

感谢您的帮助。

4

3 回答 3

1

尝试mmap(..., MAP_ANONYMOUS, ...)

您将获得一个与页面边界对齐的地址。对于比这更严格的对齐方式,您可能需要分配额外的空间并在更大的块内选择一个地址,而不是正确对齐。

于 2011-05-22T03:44:45.723 回答
0

您可以向mmap询问特定地址,对于某些特定地址可能会失败,但通常可以

于 2011-05-22T03:51:53.957 回答
0

你想要posix_memalign()

void *ptr;
int memalign_err = posix_memalign(&ptr, 1UL << 16, 1UL << 16);

if (memalign_err) {
    fprintf(stderr, "posix_memalign: %s\n", strerror(memalign_err));
} else {
    /* ptr is valid */
}

第一个1UL << 16是对齐,第二个是大小。

完成块后,将其传递给free().

于 2011-05-23T06:15:47.590 回答