关闭
Hit
enter
to search or
ESC
to close
May I Suggest ?
#leanote #leanote blog #code #hello world
Mutepig's Blog
Home
Archives
Tags
Search
About Me
Linux堆基本校验情况
无
315
0
0
mut3p1g
## malloc ``` fastbin: 1. nb <= get_max_fast () 2. fastbin_index (chunksize (victim)) == idx smallbin: 1. in_smallbin_range (nb) 2. victim->bk->fd==victim (victim为smallbin链表上的最后一个) unsortedbin: 1. 前提:victim的size符合要求(2 * SIZE_SZ~av->system_mem) 2. size==nb就会直接分配 3. 如果无法直接分配,直接通过size获得对应的bin_index,然后加入到对应的bins largebin: 1. !in_smallbin_range (nb) 2. victim需要通过unlink校验 binmap: 1. size>=nb 2. victim需要通过unlink校验 unlink校验: 1. victim的size == next_chunk的prev_size 2. victim->fd->bk == victim->bk->fd == victim 3. 对于largebin,victim->fd_nextsize->bk_nextsize == victim->bk_nextsize->fd_nextsize == victim ``` ## free ##### a. 通用检查 1. p的地址是否合法,是否对齐 2. p的`size`是否大于等于`MINSIZE`且对齐 3. p的下一个`chunk`的`PREV_INUSE`是否为真 4. p的下一个`chunk`不能太小(≤2*SIZE_SZ)或太大(≥av->system_mem) ##### b. fastbin * 检查 1. p的大小小于`fastbin`的最大值`global_max_fast` 2. p不能是对应`fastbins`的`fasttop`(应该是将fastbin全部遍历一遍看看在不在里面) 3. p对应`fastbins`的`fasttop`下标与p下标相同 * 流程 通过校验后,p成为对应`fastbins`的`fasttop`,并不修改p下一个`chunk`的`PREV_INUSE`。 ##### c. unsorted bin * 检查 1. p不能是`topchunk` 2. p的下一个`chunk`不能超过`topchunk`的结束地址 * 流程 ![](https://leanote.com/api/file/getImage?fileId=59ce62bbab6441728f0035f2) 最后将合并的`chunk`插入为`unsorted bin`的第一个块 ##### d. next chunk => top 如果下一个`chunk`为`topchunk`,那么直接将两者合并成一个`chunk`,并将新的`chunk`设置为`topchunk`
觉得不错,点个赞?
提交评论
Sign in
to leave a comment.
No Leanote account ?
Sign up now
.
0
条评论
More...
文章目录
No Leanote account ? Sign up now.