Tcache index计算以及CHUNKSIZE大小
本文为基础内容。
根据how2heap上描述的Tcache index计算规则,即:
#define request2size(req) \
(((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
MINSIZE : \
((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
/* When "x" is from chunksize(). */
# define csize2tidx(x) (((x) - MINSIZE + MALLOC_ALIGNMENT - 1) / MALLOC_ALIGNMENT)
/* When "x" is a user-provided size. */
# define usize2tidx(x) csize2tidx (request2size (x))
宏usize2tidx
用于计算IDX的值,可以看到分两步:
- 用request2size将用户输入的数值转换为CHUNKSIZE
- 用csize2tidx将CHUNKSIZE转换为IDX
request2size:
在64位机器上,SIZE_SZ=0x8,MALLOC_ALIGN_MASK=0xf,MINSIZE=0x20
((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
在这里用于将用户请求的值x加上8之后进行16字节向上取整。
可以根据规则计算得出,x<=0x18时,CHUNKSIZE均为0x20;0x19~0x28为0x30,以此类推。
csize2tidx:
在得到CHUNKSIZE后,计算IDX十分简单,只要将CHUNKSIZE减去0x11然后使用MALLOC_ALIGNMENT整除即可。