2015-06-06 3 views
1

Я пытаюсь перекодировать таНос и бесплатные функции, но я получил проблему с munmap ..Как использовать munmap пользовательского таНос

С моим пользовательским таНосом, создать пул памяти с ттар (Ex: 4Kb) , поэтому я могу вернуть индекс этого пула в качестве адреса при вызове malloc.

Это отлично работает, но когда я использую мои беспошлинные (Звонок в munmap), то я хочу, чтобы выделить что-то другое с моим пользовательским таНосом, я получил Segfault, как если бы мой весь пул был disallocated по munmap ..

Пример:

Ask 1024 bytes to my malloc 
-> First call so malloc allocate a pool of 4 * pagesize() (So 16 000  
bytes) 
-> Return to me an addr than I use. (addr[0] = 42) 
-> Free with munmap this address (munmap(addr, 1024)) 
-> re ask to my malloc 1024 bytes 
-> Try to fill it with something and segfault. 

Я действительно не понимаю, что происходит. Удаляет ли munmap весь мой пул?

К сожалению для бедных английского ..

ответ

3

Вы unmapping всей страницы.

Адрес addr должен быть кратным размеру страницы. Все страницы, содержащие часть указанного диапазона, не отображаются, и последующие ссылки на эти страницы будут генерировать SIGSEGV. Это не ошибка, если указанный диапазон не содержит отображаемых страниц.

munmap(2)

Итак, когда вы munmap ваше первое выделение, вы неотображённые всю первую страницу. Вы должны подождать, чтобы разблокировать только тогда, когда вся страница будет освобождена. Или просто не отмените ее вообще. Просто убедитесь, что два процесса не получают память с одной и той же страницы, поэтому нет уязвимостей в системе безопасности.

+0

Так что, если я прошу дважды 1024 моего malloc, а затем я хочу отключить первый, я не могу, потому что на моей системе 4096 страниц? Я прав ? Но, так, у меня будут утечки в этом случае И в этом случае, чтобы заслужить второй аргумент munmap? –

+0

@JeanYim Вы правы. Второй аргумент имеет смысл только в том случае, если он больше, чем 'PAGE_SIZE'. Вы можете разделить более одной страницы за раз. У вас будет фрагментация, но не более 4K, что не так уж плохо. Вы сохраняете это, освободив 1024 байта, в следующий раз, когда процесс запрашивает <= 1024. Если пользователь освободит целую страницу, вы можете ее отменить. – mtijanic

+0

Спасибо большое! Последний вопрос, так что вторым аргументом является число страниц для разблокировки? Не количество бесплатных октетов? (Я считал, что) –