0%

对堆的认识

0x00 缘起

刚学二进制的时候,对堆没什么概念,就知道是内存,什么都不懂的时候倒没有什么。好好学了Linux操作系统之后,知道了物理内存,虚拟内存,内存分页,操作系统对内存的分配等等。此时突然想到了当时没看懂的堆溢出攻击,今天也看了一些书,都说是由操作系统进行管理的,还以为堆对物理内存中的东西。

然而看了看堆溢出攻击的原理,可以构造一个数据结构,让操作系统认为这个是堆块,也可以覆盖堆块。重要的是在线性内存(虚拟地址)中,可以看到堆的数据结构。

0x01 思考

虽然堆的分配,合并等过程,完全是由操作系统完成的,但是每个进程的堆的的确确是用线性地址进行组织的。所以可以从调试器中看到堆块,块链表等数据结构。

那为什么Linux Windows都有堆这种数据结构呢?虽然一时解释不出来,但是我觉得按块分配内存,对于高级编程来说应该是很重要的。

0x02 类比

堆的双向链表很容易让人联想到的数据结构是操作系统内核的缓冲区。想来堆和缓冲区的思路有一部分是重合的,缓冲区是在实实在在的物理内存中,或者说是内核的地址空间,而堆是在进程的线性地址空间,层次不同。另外缓冲区是要尽量多地占用(尽可能驻留内存),像Mac OS的方式就是将几乎所有空闲物理内存作为缓冲区,以增强性能(文件、软件打开速度);而堆块不用了要赶紧free掉(否则内存泄漏),理念也不同。