码迷,mamicode.com
首页 > 其他好文 > 详细

Malloc碎碎念

时间:2016-02-15 18:28:38      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:

(以前为给同学分享写的点东西,很基础。)现在的比赛中堆溢出非常常见,对于glibc下malloc的理解也要深入一些。

malloc_chunk的对齐属性

在glibc中,malloc_chunk以 2*sizeof(size_t)对齐,在32位系统中以8字节对齐,在64位系统中一般以16字节对齐。Malloc_chunk的定义如下:

技术分享

    既然malloc_chunk以2*sizeof(size_t)对齐,那么malloc返回给用户的指针数值也是以2*sizeof(size_t)对齐。

Glibc中最小的chunk是多大呢?

最小的chunk需要保证能放下prev_size、size、fd以及bk字段并保证对齐。在32位系统中,即16字节,在64位系统中,一般为32字节。在64位系统中也可能定义INTERNAL_SIZE_T也即size_t为4字节,这种情况下最小的chunk位24字节。如下:

技术分享

Fastbin里有多少bin呢?

技术分享

    将上面的宏计算出来,会发现NFASTBINS为10,不论32位系统还是64位系统。

Fastbin里chunk的大小范围呢?

    在32位系统中,fastbin里相邻的两个bin大小差距8个字节;在64位系统中,则是差距16个字节。

技术分享

    既然有10个fastbin,在32位系统中,fastbin的chunk的范围是从16,24,32,...,88字节吗?不对!在malloc_init_state函数中,会将fastbin最大的chunk设置为64,并没有达到88。

技术分享

技术分享

    因此,在32位系统中,fastbin里chunk的大小范围从16到64;在64位系统中,fastbin里chunk的大小范围从32到128。

Small bins里chunk大小范围?有多少bins?

    在32位系统中,small bins里的chunk大小从16到504字节;在64位系统中,small bins里的chunk大小从32到1016字节。

技术分享

    根据small bins里的chunk大小范围以及每个chunk递增的大小得知,small bins里有62个bin。

怎么根据p=malloc(m)里的m来判断分配多大的chunk呢?

    将申请的内存大小加上每个chunk的overhead,也就是chunk结构体里的size字段。然后对齐,就是需要分配的chunk的大小。

技术分享

    举个例子:

技术分享

    在64位系统中,确定chunk的大小为0x88+0x8=0x90。所以每一次申请,都会分配一个大小为0x90的chunk。

技术分享

    返回的一个chunk大小为0x90,除了pre_size和size,还剩下0x80大小的区域,你会想"什么?我申请了0x88的大小,却返回了一个0x80大小的内存?"其实这些chunk都是虚拟出来的,正常情况下可以使用的内存包括下一个chunk的pre_size字段,所以申请了0x88的大小,还是可以使用到0x88大小的内存的。

Malloc碎碎念

标签:

原文地址:http://www.cnblogs.com/wangaohui/p/5190889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!