2015-06-06 60 views
1

我試圖重新編寫malloc和free功能,但我得到了與munmap一個問題..如何使用munmap定製的malloc

隨着我的自定義的malloc,我創建的內存使用mmap池(例如:4KB) ,所以當我的malloc被調用時,我可以返回該池的索引作爲地址。

這項工作很好,但是當我使用我的自定義自由(呼叫到munmap),那麼我想分配別的東西與我的自定義的malloc,我有段錯誤,就像如果我的整個池被munmap disallocated ..

例子:

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

您正在解除映射整個頁面。

地址addr必須是頁面大小的倍數。 包含部分指定範圍的所有頁面都未映射,,隨後對這些頁面的引用將生成SIGSEGV。如果指定的範圍不包含任何映射頁面,則不是錯誤。

munmap(2)

所以當你munmap你的第一次分配,你未映射整個第一頁。只有當整個頁面被釋放時,您才應該等待取消映射。或者根本不取消映射 - 只要確保兩個進程不從同一頁面獲取內存,那麼就沒有安全漏洞。

+0

所以,如果我問兩次1024到我的malloc,然後我想disalloc第一,我不能因爲我的系統上的頁面是4096?我對嗎 ? 但是,在這種情況下,我會泄漏 而在這種情況下,應該得到munmap的第二個參數麼? –

+0

@JeanYim你是對的。第二個參數只有在大於「PAGE_SIZE」時纔有意義 - 您可以一次取消映射多個頁面。你會有碎片,但不超過4K,這並不壞。您將該空閒的1024字節保留在附近,以便下一次過程要求<= 1024。如果用戶最終釋放整個頁面,則可以將其取消映射。 – mtijanic

+0

非常感謝!最後一個問題,所以第二個參數是要取消映射的頁面數量?不是免費的八位組數? (我相信) –