JnuSimba/LinuxSecNotes

Linux 堆内存管理深入分析(下)勘误

Opened this issue · 0 comments

在阅读Linux 堆内存管理深入分析(下)的过程中,发现一处自相矛盾的地方:

2.每个fast bin都是一个单链表(只使用fd指针)。为什么使用单链表呢?因为在fast bin中无论是添加还是移除fast chunk,都是对“链表头”进行操作,而不会对某个中间的fast chunk进行操作。更具体点就是LIFO(后入先出)算法:添加操作(free内存)就是将新的fast chunk加入链表头,删除操作(malloc内存)就是将链表头部的fast chunk删除。

  1. free(fast chunk)操作:这个操作很简单,主要分为两步:先通过chunksize函数根据传入的地址指针获取该指针对应的chunk的大小;然后根据这个chunk大小获取该chunk所属的fast bin,然后再将此chunk添加到该fast bin的链尾即可。整个操作都是在_int_free函数中完成。

Understanding glibc malloc一文中:

  • free(fast chunk)
    • Fast bin index is calculated to retrieve its corresponding binlist.
    • This free chunk gets added at the front position of the above retrieved binlist.

参考了源码_int_free,看得不是完全地明白,像是插在了链尾。