Chinaunix

标题: glibc 2.12.1中malloc源码问题 [打印本页]

作者: contestjia    时间: 2016-06-30 16:33
标题: glibc 2.12.1中malloc源码问题
malloc源码中,是何时对main arena进行初始化了??对这个初始化流程不太熟悉,有明白的能帮帮忙吗?谢谢!
作者: MMMIX    时间: 2016-06-30 21:07
本帖最后由 MMMIX 于 2016-06-30 21:08 编辑

回复 1# contestjia


    2.12? 好古老的版本。

main_arena 本身是个无初值静态变量,保存在 .bss 段,在程序加载的时候就全初始化好了。再后来对其成员的写入,最开始的估计就是 malloc/arena.c 中的 ptmalloc_init() 了:https://sourceware.org/git/?p=gl ... 6bee2c60d0ca43#l510

510   mutex_init(&main_arena.mutex);
511   main_arena.next = &main_arena;


作者: fender0107401    时间: 2016-07-01 09:00
MMMIX 发表于 2016-06-30 21:07
回复 1# contestjia


大哥,你太牛逼了,让我来膜拜一下。
作者: contestjia    时间: 2016-07-01 09:53
这只是把它的互斥群锁初始化,以及自己链成环,可它里面的bins以及fastbinsY都是指向NULL的,我看thread arena初始化的时候,都会把这些bin指向一个地址,来标识当前bin都是空
作者: contestjia    时间: 2016-07-02 12:18
这只是把它的互斥群锁初始化,以及自己链成环,可它里面的bins以及fastbinsY都是指向NULL的,我看thread arena初始化的时候,都会把这些bin指向一个地址,来标识当前bin都是空
作者: MMMIX    时间: 2016-07-02 21:51
回复 4# contestjia


    这就可以用啦。对其他成员的操作,都是散落在不同的地方。不过,目前最新的代码,倒是在定义时给了 main_arena 一个完整的初值。
作者: contestjia    时间: 2016-07-03 00:02
本帖最后由 contestjia 于 2016-07-03 00:03 编辑

回复 6# MMMIX
你好,请问main_arena第一次调用sbrk进行堆扩展是什么时候了?

还有我查看进程的/proc/pid/maps,发现通常是132K的空间是rw_p权限,但non_main_arena的堆在new_heap的时候设置的空间应该是32K啊

这是申请堆时的size调整:
#define HEAP_MIN_SIZE (32*1024)


这是设置size的大小为read和write:





   
作者: MMMIX    时间: 2016-07-03 10:42
contestjia 发表于 2016-07-03 00:02
回复 6# MMMIX
你好,请问main_arena第一次调用sbrk进行堆扩展是什么时候了?

不知道。你跟踪下呗。

还有我查看进程的/proc/pid/maps,发现通常是132K的空间是rw_p权限,但non_main_arena的堆在new_heap的时候设置的空间应该是32K啊


这你不能光考虑 new_heap() 呀,grow_heap() 什么的也要考虑进去。
作者: contestjia    时间: 2016-07-03 13:22
谢谢,132K的原因我知道,另外那个我再跟踪下,谢谢了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2