macos — портирование C ++ VirtualFree в OS X

Я пытаюсь создать порт управления памятью, в котором некоторые распределители используют механизм виртуальной памяти для резервирования адресного пространства без (в начале) выделения физической памяти, а затем выделения памяти только тогда, когда это необходимо.

Код основан на Windows VirtualAlloc и VirtualFree, чтобы заставить вещи работать, теперь я пытаюсь перенести этот код на Apple OS X, которая, насколько я знаю, не имеет такого API, через некоторое время я поднимаюсь со следующим кодом:

//to reserve virtual address space
//equivalent of VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS)
void* ptr = mmap(NULL, size, PROT_NONE, (MAP_PRIVATE | MAP_ANON), -1, 0);
msync(ptr, size, (MS_SYNC | MS_INVALIDATE));

//to free ALL virtual address space
//equivalent of VirtualFree(addr, 0, MEM_RELEASE)
//where "size" is the size of the entire virtual address space and "addr" the starting address
msync(addr, size, MS_SYNC);
munmap(addr, size);

//to allocate physical memory
//equivalent of VirtualAlloc(addr, size, MEM_COMMIT, PAGE_READWRITE)
void* ptr = mmap(addr, size, (PROT_READ | PROT_WRITE), (MAP_FIXED | MAP_SHARED | MAP_ANON), -1, 0);
msync(addr, size, (MS_SYNC | MS_INVALIDATE));

Единственное, что я не могу понять, это как портировать использование VirtualFree для освобождения / отмены передачи только части физической памяти, имитируя вызов VirtualFree:

VirtualFree(addr, size, MEM_DECOMMIT);

Я пытался вызвать munmap с нужным адресом и размером, но он не освобождает память … при вызове его для освобождения все виртуальное пространство работает отлично.

Может ли кто-нибудь помочь мне в этой задаче?

1

Решение

Я нашел ответ на свой вопрос благодаря этому блогу:
http://blog.nervus.org/managing-virtual-address-spaces-with-mmap/

Я также публикую здесь его решение в случае, если ссылка умирает:

void DecommitMemory(void* addr, size_t size)
{
// instead of unmapping the address, we're just gonna trick
// the TLB to mark this as a new mapped area which, due to
// demand paging, will not be committed until used.

mmap(addr, size, PROT_NONE, MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
msync(addr, size, MS_SYNC|MS_INVALIDATE);
}
2

Другие решения


По вопросам рекламы [email protected]