+ -
当前位置:首页 → 问答吧 → 求解内核中的内存管理机制

求解内核中的内存管理机制

时间:2010-12-31

来源:互联网

看到一本书上有段这样的描述:如果在一个已分配的内存块尾部的后面(或者在它的头部)写数据,就很可能会损坏malloc库用于记录内存分配情况的数据结构。出现这个情况后,经过一段时间,一个malloc调用,甚至是一个free调用都会引发段错误并导致程序崩溃。。。。有点想不明白。。所以想了解下这里指的这些记录内存分配情况的数据结构是哪些。。linux下的malloc机制到底是怎样的。

作者: michaeltsing   发布时间: 2010-12-31

哪本书写出这样的话?修改内存数据区怎么会影响内存管理区了?内核地址空间管理不就是处理这样问题的吗?

作者: matthew_ye   发布时间: 2010-12-31

搜一下内核版的精华帖,看看有没有相关的介绍

作者: Godbach   发布时间: 2010-12-31



QUOTE:
哪本书写出这样的话?修改内存数据区怎么会影响内存管理区了?内核地址空间管理不就是处理这样问题的吗?
matthew_ye 发表于 2010-12-31 11:11




    上面描述的情况应该是越界的时候出现的问题,是非正常的读写内存。。

作者: michaeltsing   发布时间: 2010-12-31

malloc是由libc提供的函数,可以想象成,libc向内核申请了一大块的空间,然后当用户调用malloc的时候,libc从它申请的那一大块空间中分一块返回给你。

于是libc需要知道,自己申请的那一大块中,哪些已经分配了,哪些没有。所以需要一些控制信息。而且一般来说,这些控制信息也放在这一大块中。
那么,如果你malloc的空间写越界了,就可能把这里面的控制信息给写坏了。
并且这种写坏当时是没法发现的,因为内核只知道分配了一大块出去。至于这一大块是libc在用,还是已经malloc出去了,内核不知道。libc也不知道,因为你写内存的时候不会调用libc的函数,而是直接写了。
于是,等到你再次去malloc或者free的时候,libc需要用到这些控制信息了,可能就会出问题。libc也不知道控制信息是否被写坏过(当然,可以有一些检验,但是不能保证100%校验成功),它就拿着被写坏的信息来处理,结果可能就访问到了内核尚未分配出现的空间,然后就崩溃了。

作者: kouu   发布时间: 2010-12-31

回复 kouu


    感谢kouu的回答。。。能不能再详细点,把libc中具体保存控制信息的数据结构给说下啊。。

作者: Godbach:   发布时间: 2010-12-31

热门下载

更多