首页
社区
课程
招聘
[分享]堆
发表于: 2021-4-26 00:45 2900

[分享]堆

2021-4-26 00:45
2900

堆常识

堆是操作系统给你几个分页(具体几个分页看LINK选项,link选项也有堆保留,堆提交),操作系统给你一个初始堆。
堆保留大小:指定虚拟内存中分配的合计大小 默认1mb
堆提交大小:指定物理内存中分配的合计大小 默认4kb

 

栈保留大小:指定虚拟内存中分配的合计大小 默认1mb
栈提交大小:指定物理内存中分配的合计大小 默认4kb

 

1mb = 1024kb
1kb = 1024byte
16进制 1k( 4096字节) 等于一个分页 。

 

所以堆空间肯定是0x1000的倍数。

堆空间申请从哪来

在main函数前的堆初始化来的。
winapi:HeapCreate()//创建堆环境,给你几个分页

 

这是在Main 前 初始化堆的代码(VC++6.0 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int __cdecl _heap_init (
        int mtflag
        )
{
        //  Initialize the "big-block" heap first.
        if ( (_crtheap = HeapCreate( mtflag ? 0 : HEAP_NO_SERIALIZE,
                                     BYTES_PER_PAGE, 0 )) == NULL )
            return 0;
 
        // Pick a heap, any heap
        __active_heap = __heap_select();
 
        if ( __active_heap == __V6_HEAP )
        {
            //  Initialize the small-block heap
            if (__sbh_heap_init(MAX_ALLOC_DATA_SIZE) == 0)
            {
                HeapDestroy(_crtheap);
                return 0;
            }
        }
        else if ( __active_heap == __V5_HEAP )
        {
            if ( __old_sbh_new_region() == NULL )
            {
                HeapDestroy( _crtheap );
                return 0;
            }
        }
 
        return 1;
}

//1.首先初始化“大块” 堆
//2.挑选堆
//3.初始化小块堆

 

调式版中堆初始化CDCDCD,
发布版不做初始化动作。

堆有问题常有的4个子,在内存中:

0xCDCD 屯:堆未初始化
0xFEEE 铪:表示空闲 (某些系统)
0xDDDD 葺:表示空闲 (某些系统)
0xDE 掭
0xCCCC 烫:栈未初始化

堆保存信息

在申请堆后,获得堆的地址。堆地址的前0x20字节保存了堆的信息
20210425233939.png
堆栈保存信息 ,类似双向链表。

 

想看堆的调式信息,要调用非标准api: _malloc_dbg()

 

#ifdef _DEBUG
char psz = (char )_malloc_dbg(10,_NORMAL_BLOCK,FILE,LINE);

 

#endif
如果 有_ _FILE__ 一定要加 #ifdef _DEBUG #endif

 

malloc //heapAlloc

 

free //HeapFree

 

堆创建的过程:
1.HeapCreate 建酒店
2.HeapAlloc 租酒店
3.HeapFree 退租
4.HeapDestroy 拆酒店

 

为了安全高版本堆分配随机化。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//