Question

I was looking for a method of allocating memories on Linux which similar VirtualAlloc on Windows. Requirements are:

  1. Size of memories block to allocate is 2^16.
  2. Address of memories block is larger than 0x0000ffff
  3. Address of memories block must have last 16 bits are zero.

On Windows because lower limit of application address (lpMinimumApplicationAddress) we have (2) obvious right. From (1), (2) and system rules we also achieved (3).

Thanks for helping.

Was it helpful?

Solution

You want 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 */
}

The first 1UL << 16 is the alignment, and the second is the size.

When you're done with the block you pass it to free().

OTHER TIPS

Try mmap(..., MAP_ANONYMOUS, ...)

You'll get an address which is aligned to a page boundary. For more stringent alignment than that, you probably need to allocate extra and pick an address inside your larger block than is correctly aligned.

you can ask a specific address to mmap, it may fail for some specific addresses, but generally it works

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top