我正在寻找一种在 Linux 上分配内存的方法,类似于 Windows 上的 VirtualAlloc。要求是:
- 要分配的内存块大小为 2^16。
- 内存块地址大于 0x0000ffff
- 内存块地址的最后 16 位必须为零。
在 Windows 上,因为应用程序地址的下限 (lpMinimumApplicationAddress) 我们有 (2) 明显的权利。从(1)、(2)和系统规则我们也实现了(3)。
感谢您的帮助。
我正在寻找一种在 Linux 上分配内存的方法,类似于 Windows 上的 VirtualAlloc。要求是:
在 Windows 上,因为应用程序地址的下限 (lpMinimumApplicationAddress) 我们有 (2) 明显的权利。从(1)、(2)和系统规则我们也实现了(3)。
感谢您的帮助。
尝试mmap(..., MAP_ANONYMOUS, ...)
您将获得一个与页面边界对齐的地址。对于比这更严格的对齐方式,您可能需要分配额外的空间并在更大的块内选择一个地址,而不是正确对齐。
您可以向mmap询问特定地址,对于某些特定地址可能会失败,但通常可以
你想要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()
.