iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0

在前一篇文章中,我們介紹了 Heap 的基本操作,包括記憶體的分配與釋放,並提到了 Bin 機制。這篇文章將詳細介紹不同類型的 Bins 及其運作方式。

Bin 機制概述

當記憶體被釋放後,glibc 會將這些空閒的記憶體區塊(Free Chunks)存入不同類型的 Bins,以便後續的管理和再次分配。不同大小的空閒區塊會存放在對應的 Bin 中,依據記憶體區塊的大小分為以下四種主要類型:

  1. Fast Bins
    Fast Bins 是用來管理小於 64 bytes的空閒記憶體區塊。由於這些區塊的大小較小,Fast Bins 會優先將其快速回收以供後續重複使用。Fast Bins 的設計目的是提升小型記憶體區塊的分配與釋放速度,因為小區塊在程式中頻繁地分配和釋放。
    不過 Fast Bins 不會立即合併相鄰的區塊,因此可能導致碎片化問題,但速度相對較快。

  2. Unsorted Bins
    Unsorted Bins 是釋放記憶體後最初存放區塊的暫存區,無論釋放的區塊大小為何,都會先進入 Unsorted Bins。這是一個暫時的存放機制,當下一次分配需求到來時,glibc 會從 Unsorted Bins 中尋找是否有合適大小的區塊可用。
    當釋放的區塊進入 Unsorted Bins 時,glibc 會在下一次進行記憶體分配時優先檢查該 Bin。
    如果區塊大小匹配,會直接分配;否則,glibc 會將這些區塊移至合適的 Small Bin 或 Large Bin 中。

  3. Small Bins
    Small Bins 是用來管理小於 512 bytes 的記憶體區塊,通常會將這些區塊按照特定的大小分類管理。這些區塊在釋放後會進入對應的 Small Bin,而 Small Bins 的記憶體區塊是相互鏈結在一起的。
    小於 512 bytes 的空閒區塊會依其大小對應到不同的 Small Bin 中。每個 Small Bin 內的區塊大小固定,可以快速查找並分配合適的區塊。
    與 Fast Bins 不同的是,Small Bins 會進行區塊合併,減少碎片化。

  4. Large Bins
    Large Bins 用來管理大於 512 bytes 的記憶體區塊。這些區塊的大小較大,因此 Large Bins 通常會按照範圍進行分類管理。
    大於 512 bytes 的空閒區塊會進入 Large Bins,區塊按大小以範圍分配至對應的 Bin 中。
    Large Bins 內的區塊並不一定大小相同,但區塊大小的範圍相近,方便進行分配。
    當下一次需要大塊記憶體時,glibc 會先檢查 Large Bins 中是否有合適的區塊。

分配記憶體流程

當程式呼叫 malloc() 申請記憶體時,glibc 會先在 Bin 中尋找,如果在 Bin 就找到適合的就會配給申請者,尋找順序如下:

檢查 Fast Bins:先檢查 Fast Bins 中是否有適合大小的區塊。
檢查 Unsorted Bins:如果 Fast Bins 中沒有適合的區塊,會檢查 Unsorted Bins。
檢查 Small Bins / Large Bins:如果 Unsorted Bins 沒有合適的區塊,會檢查對應的 Small Bins 或 Large Bins。


上一篇
[Day19] Heap 介紹 - 基本操作
下一篇
[Day21] Heap 介紹 - Chunk
系列文
Pwn2Noooo! 執行即 Crash 的 PWNer 養成遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言