我調試了一個內存破壞問題,並發現Linux內核似乎接受用戶「緩衝的免費部分」。教科書總是教我們撥號/免費成對。我有點迷惑不解了!所以我寫了一個在Linux內核中運行的小測試。內存的kfree部分是否有效?
char *p_buf, *p_buf2;
p_buf = kmalloc(1024, GFP_KERNEL); //alloc 1024
printk("malloc(1024) = %p\n", p_buf);
kfree(p_buf+256); //free from offset 256(equals to free 768)
printk("kfree(%p)\n", p_buf+256);
p_buf2 = kmalloc(1024-256, GFP_KERNEL); // alloc 768
printk("malloc(%d) = %p\n", 1024-256, p_buf2);
kfree(p_buf);
kfree(p_buf2);
和結果(在Linux上運行3.16)
malloc(1024) = ce52b800 //alloc 1024
kfree(ce52b900) //free 768 ---(1)
malloc(768) = ce52b900 //alloc 768 ---(2)
可以看到,(1)和(2)的地址是相同的。這是對的嗎?這是否意味着Linux將緩衝區分成兩部分,如我所料? 我知道這段代碼肯定是錯的,但我只想知道Linux內核如何處理它 - Linux如何釋放與alloc不同的地址。
在先進的感謝。
kfree'的'文檔不說「的緩衝區的部分可以被釋放」。在你的第二個例子中,你混合了'malloc'(沒有'k')和'kfree'。您可能會遇到未定義的行爲。 –
你說得對。問題是,我仍然可以做「免費」如果不立即錯誤(恐慌或任何消息),我可以分配是從「無錯先前的」返回的緩衝區。稍後,內存損壞發生在某處。 – acolor
@acolor:那不會使任何方式的碼是否正確。 –