VC6記憶體管理malloc(2)

2021-08-22 07:17:30 字數 1660 閱讀 5147

heap_init呼叫後,呼叫_ioinit,第一次進行記憶體呼叫malloc,申請256位元組,在debug模式,使用malloc_dbg函式。之後呼叫_nh_malloc_dbg,nh_malloc_dbg呼叫_heap_alloc_dbg。

對256位元組的記憶體申請,還需要加上額外的管理資訊,附加到真正的記憶體申請,附加後的記憶體大小是真正申請記憶體的大小。第3個指標指向呼叫的檔名,第4個變數,表示呼叫的位置行,第5個變數,真正的記憶體大小0x100,第7個變數,流水號碼,現在是第一次記憶體申請1。gap被填上4個fd,前後兩個gap,像欄杆一樣,保護真正的記憶體。

用於管理phead指向的記憶體,加入pfirstblock,plastblock管理記憶體鍊錶中,和進行一些初始化工作。

呼叫_heap_alloc_base函式,實際申請記憶體大小和sbh_threadhold進行比對,來決定呼叫那個記憶體申請函式。還有前後兩個cookie大小8個位元組申請,所以和1016位元組進行比較。

調整後block的大小是0x130,包括真正的記憶體,header,gap,cookie,調整大小(16位元組邊界),cookie中儲存00000131,最後乙個bit置1表示是否使用。

前面都是計算大小,沒有實際申請記憶體。sbh_alloc_new_region,bitvec為unsigned int,bitvgrouphi,bitvgrouplo組成為32組,每組64bit,表示記憶體是否使用。每個header有真正的記憶體1m,為了管理1m記憶體使用32個group。每個group有64個listhead,每個listhead有2個指標。為了管理1m記憶體,使用16k記憶體的成本。

sbh_alloc_new_group記憶體切的動作。每個group管理32k記憶體,共8頁page。第乙個group記憶體分配使用完,才開始使用第二個group。每個header,不是實際分配1m,是虛擬的概念。每個group使用時,才實際分配page。

0xffffffff為-1,作用是進行合併時使用。4080是兩個黃色之間的記憶體大小。去掉邊界gap8個位元組後,剩餘4088位元組,為調整到16位元組的整數倍,就是4080位元組,保留8個位元組,未使用。實際申請記憶體前的準備工作完成。listhead1-63負責16位元組,32位元組,...,1 008位元組,listhead 64負責大於1k記憶體的管理。

VC6記憶體管理malloc(1)

vc6程式main之前和之後的示意圖 call stack 執行前核心先呼叫maincrtstartup 函式,heap alloc base 函式對記憶體分配有兩種情況,小於1016位元組,呼叫 sbh alloc block,管理小記憶體。大於1016位元組使用windows呼叫heapallo...

vc6 控制項

詳見msdn 為控制項新增乙個控制項型變數然後訪問之 edit idc edit1 m edit1 void ctest1dlg onbutton1 也可以直接使用id訪問 cstring str int i getdlgitemtextw idc edit1,str afxmessagebox s...

VC6遠端除錯

vc開發環境之所以提供遠端除錯的能力,是因為有些情況下單機除錯會讓你崩潰掉。比如,除錯gui程式的wm paint訊息,因為要單步除錯,所以 偵錯程式會對介面的重繪產生 heisenberg不確定性原理 當然還有些別的情況也適用,比如程式在測試環境執行的好好的,但是在客戶那行為總 是異常,這時候如果...