C++程序  |  75行  |  1.6 KB

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>

/* This program allocates memory with multiple calls to remap. This
 * can be used to verify if the remap api is working correctly. */

#define PAGE_SHIFT 12

#define ROUND_PAGES(memsize) ((memsize >> (PAGE_SHIFT)) << PAGE_SHIFT)

int main(int argc, char *argv[]) {
	unsigned int memsize;
	char *mem;
	int i, numpages, fd;

	if (argc != 2) {
		printf("Usage: %s <memory_size>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	memsize = strtoul(argv[1], NULL, 10);

	memsize = ROUND_PAGES(memsize);

	/* We should be limited to < 4G so any size other than 0 is ok */
	if (memsize == 0) {
		printf("Invalid memsize\n");
		exit(EXIT_FAILURE);
	}

	numpages = memsize >> PAGE_SHIFT;

	mem =  mmap(0, memsize, PROT_READ | PROT_WRITE,
			MAP_PRIVATE | MAP_ANONYMOUS,
			-1, 0);

	if (mem == (void*) -1) {
		perror("Failed to allocate anon private memory using mmap\n");
		exit(EXIT_FAILURE);
	}

	for (i = 2; i <= 16; i <<= 1) {
		mem = mremap(mem , memsize * (i >> 1),
					memsize * i,
					1 /* MREMAP_MAYMOVE */);

		if (mem == MAP_FAILED) {
			perror("Failed to remap expand anon private memory\n");
			exit(EXIT_FAILURE);
		}

		printf("Successfully remapped %d bytes @%p\n",
				memsize * i, mem);
	}

	if (munmap(mem, memsize * 16)) {
		perror("Could not unmap and free memory\n");
		exit(EXIT_FAILURE);
	}

	mem =  mmap(0, memsize, PROT_READ | PROT_WRITE,
			MAP_PRIVATE | MAP_ANONYMOUS,
			-1, 0);

	if (mem == (void*) -1) {
		perror("Failed to allocate anon private memory using mmap\n");
		exit(EXIT_FAILURE);
	}

	exit(EXIT_SUCCESS);
}