【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )

文章目录

  • 一、x86 架构下的堆内存
  • 二、x86 架构下的栈内存 与 函数调用





一、x86 架构下的堆内存



在可用内存中 , 申请内存块 , 这部分内存块就是堆内存 ;

  • C 语言中使用 malloc 等函数申请堆内存 ; 调用 free 函数释放内存 ;
  • Java 语言中使用 new 关键字创建的对象 , 一般都是放在堆内存中 ; GC 垃圾回收期自动释放内存 ;

应用程序 , 通过 " 系统调用 " 向系统申请内存块 , 系统分配内存块 , 将分配的地址返回给申请内存的应用程序 ; 这里的 " 系统调用 " 就是调用 malloc 等函数 , 申请内存 ;


堆内存是由系统分配的 , malloc 是 stdlib 标准库中的函数 , 其真正的实现是调用了系统中断 ( int3 软中断 ) , 将申请内存的字节大小 size 放到寄存器中 , 中断发生后 , 切换到系统层面 , 在系统管理的内存块中 , 分配 size 大小的内存 , 将这块内存的首地址返回 ;


对于 Java 语言的 new 关键字在堆内存中创建对象 , Java 运行环境氛围两层 , 上层是 Java 虚拟机 ( JVM ) , 下层是 Windows / Linux / Mac 操作系统 ;

Java 虚拟机启动时 , 首先要根据启动时的 内存设置参数 , 维护一个指定大小的内存空间 ; JVM 申请的内存 , 可以一次性分配完毕 , 也可以选择使用多少分配多少的策略 ;

new 创建对象 , 由 JVM 向 操作系统 申请一块内存 , 然后返回内存的首地址给客户端 ;

【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )_第1张图片





二、x86 架构下的栈内存 与 函数调用



" 栈 " 是内存中的一块连续的地址 , 栈内存是一块连续的有顺序的内存 ;

  • 栈底处于内存低地址 , 栈顶处于内存高地址 ;
  • 栈底处于内存高地址 , 栈顶处于内存低地址 ;

上述两种情况 , 都有可能出现 ;

【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )_第2张图片

调用函数时 , 首先将参数入栈 , 每传入一个参数 , 栈指针都要向上移动 ;

执行 func(arg0, arg1, arg2) 函数 , 将函数参数放入栈时 , 从右到左依次入栈 ;

【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )_第3张图片

你可能感兴趣的