堆的调试实验

  • 调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实

  • 使用调试器加载函数会触发前者

  • __asm int3 调试最真实的栈

  • 未启用块表的堆区信息

  • 堆区起始位置(假设为0x00520000)

  • 起始位置开始依次是段表索引,虚表索引,空表使用标识和空表索引区

  • 空表索引区的位置是偏移0x178处

  • 一个堆刚刚初始化时堆块的状态:

    • 只有一个空闲的大块(尾块)
    • 位于堆偏移0x0688处(启用块表后这个位置将是快表)(忽略掉8字节块首)
    • Freelist[0]指向尾块
    • 处零号空表索引外其余均指向自己,其余的空闲链表中都没有空闲堆块



  • 块首:8字节

  • 调试实验中堆分配的细节

    (1)堆块的大小包括了块首在内,即如果请求 32 字节,实际会分配的堆块为 40 字节:8

    字节块首+32 字节块身。

    (2)堆块的单位是 8 字节,不足 8 字节的部分按 8 字节分配。

    (3)初始状态下,快表和空表都为空,不存在精确分配。请求将使用“次优块”进行分配。

    这个“次优块”就是位于偏移 0x0688 处的尾块。

    (4)由于次优分配的发生,分配函数会陆续从尾块中切走一些小块,并修改尾块块首中的

    size 信息,最后把 freelist[0]指向新的尾块位置。(找零钱)

  • 块表的状态HeapCreat(0,0,0)

  • 变化:

    • 尾块不再是0x0688偏移处,通过0x0178Freelist[0]处可以看出
  • 堆刚初始化时块表是空的

  • 申请8,16,24字节的堆空间再释放后:

    • 之前0x0688处

    • 释放后:

  • 空表和块表堆块区别

  • 块首只存指向下一堆块的指针,不存在指向前一堆块的指针

  • 块首中的标识位为 0x01,也就是这个堆块是 Busy 状态

0day堆(2)堆的调试实验的更多相关文章

  1. 0day堆(1)堆的管理策略

    基本概念 堆块:堆区内存的基本单位 包括两个部分:块首,块身 块首:标识这个堆块自身的信息:如大小,是否被占用等 块身:分配给用户使用的数据区 堆表:一般位于堆区的起始位置,用于索引堆区所有堆块的信息 ...

  2. C++ 堆 和 堆 分析

    [摘要] 堆和栈,即是数据结构,又是分配存储空间的不同方式.在数据结构上.堆是树型层次结构,结点按keyword次序排列,经常使用的堆为二叉堆:栈是一种先进后出的数据结构.在内存分配上的堆和栈,首要差 ...

  3. 【ZZ】堆和堆的应用:堆排序和优先队列

    堆和堆的应用:堆排序和优先队列 https://mp.weixin.qq.com/s/dM8IHEN95IvzQaUKH5zVXw 堆和堆的应用:堆排序和优先队列 2018-02-27 算法与数据结构 ...

  4. SQL0973N在 "<堆名>" 堆中没有足够的存储器可用来处理语句

    SQL0973N在 "<堆名>" 堆中没有足够的存储器可用来处理语句. 解释: 已使用此堆的所有可用内存.不能处理该语句. 用户响应: 接收到此消息(SQLCODE)后 ...

  5. bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心

    Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...

  6. <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  7. 【算法】01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈)

    [算法]01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈) 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有 ...

  8. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  9. 堆+建堆、插入、删除、排序+java实现

    package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMa ...

随机推荐

  1. 一夜搞懂 | JVM 字节码执行引擎

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一 ...

  2. MATLAB 一维随机变量及其概率分布

    1.两点分布 clc clear a=rand(1,10); for ii=1:10 if a(ii)<0.2 a(ii)=0; else a(ii)=1; end end a x=0的概率为0 ...

  3. MATLAB——文件读写(2)

    一.importdata函数 1. txt 如图,提取经纬度. 程序如下 clear all test=importdata('经纬度.txt'); [r,c]=size(test.data);%ro ...

  4. Validation框架的应用

    Validation框架的应用 一,前言 这篇博客只说一下Validation框架的应用,不涉及相关JSR,相关理论,以及源码的解析. 如果之后需要的话,会再开博客描写,这样会显得主题突出一些. 后续 ...

  5. vim效率操作

                                        vim效率操作 案例6:vim效率操作 6.1问题 本例要求掌握使用vim文本编辑器时能够提高操作效率的一些常用技巧和方法,完成 ...

  6. php的 '1' == 1, 返回true,到底是谁变成了谁?

    此过程为字符串的 '1' 隐含的编程了数字类型1,所以是true

  7. 查找 mysql 配置文件 my.cnf

    $ locate my.cnf 看看你的linux上有多少个my.cnf,一般都配置为/etc/my.cnf

  8. 为什么条件变量需要传入mutex?

    条件变量一般而言,会有一个布尔表达式作为唤醒的条件.调用wait的线程需要读取这个布尔表达式内数据, 同样,调用signal的线程需要修改这个布尔表达式的数据,让表达式为真.故而这两个线程必然访问至少 ...

  9. python--爬虫之JSON于JsonPath

    JSON json的引入 在python中json作为一个内建库不需要额外安装,只需要使用import json执行引入 json模块的功能 在python中json模块提供了四个功能:dumps.d ...

  10. go 内置函数

    一.什么是内置函数? 二.内置函数有哪些? 名称 说明 close 用于管道通信 len.cap len 用于返回某个类型的长度或数量(字符串.数组.切片.map 和管道):cap 是容量的意思,用于 ...