我调试了一个内存破坏问题,并发现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:那不会使任何方式的码是否正确。 –