Android|【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )
文章目录
- 一、x86 架构下的堆内存
- 二、x86 架构下的栈内存 与 函数调用
一、x86 架构下的堆内存
【Android|【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )】在可用内存中 , 申请内存块 , 这部分内存块就是堆内存 ;
- C 语言中使用 malloc 等函数申请堆内存 ; 调用 free 函数释放内存 ;
- Java 语言中使用 new 关键字创建的对象 , 一般都是放在堆内存中 ; GC 垃圾回收期自动释放内存 ;
堆内存是由系统分配的 , malloc 是 stdlib 标准库中的函数 , 其真正的实现是调用了系统中断 ( int3 软中断 ) , 将申请内存的字节大小 size 放到寄存器中 , 中断发生后 , 切换到系统层面 , 在系统管理的内存块中 , 分配 size 大小的内存 , 将这块内存的首地址返回 ;
对于 Java 语言的 new 关键字在堆内存中创建对象 , Java 运行环境氛围两层 , 上层是 Java 虚拟机 ( JVM ) , 下层是 Windows / Linux / Mac 操作系统 ;
Java 虚拟机启动时 , 首先要根据启动时的 内存设置参数 , 维护一个指定大小的内存空间 ; JVM 申请的内存 , 可以一次性分配完毕 , 也可以选择使用多少分配多少的策略 ;
new 创建对象 , 由 JVM 向 操作系统 申请一块内存 , 然后返回内存的首地址给客户端 ;
文章图片
二、x86 架构下的栈内存 与 函数调用
" 栈 " 是内存中的一块连续的地址 , 栈内存是一块连续的有顺序的内存 ;
- 栈底处于内存低地址 , 栈顶处于内存高地址 ;
- 栈底处于内存高地址 , 栈顶处于内存低地址 ;
文章图片
调用函数时 , 首先将参数入栈 , 每传入一个参数 , 栈指针都要向上移动 ;
执行
func(arg0, arg1, arg2)
函数 , 将函数参数放入栈时 , 从右到左依次入栈 ;
文章图片
推荐阅读
- 宽容谁
- 我要做大厨
- android第三方框架(五)ButterKnife
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘