【Android 逆向】x86 CPU 架构体系 ( 堆内存 | 栈内存 | 函数调用 )
一、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 向 操作系统 申请一块内存 , 然后返回内存的首地址给客户端 ;
二、x86 架构下的栈内存 与 函数调用
" 栈 " 是内存中的一块连续的地址 , 栈内存是一块连续的有顺序的内存 ;
- 栈底处于内存低地址 , 栈顶处于内存高地址 ;
- 栈底处于内存高地址 , 栈顶处于内存低地址 ;
上述两种情况 , 都有可能出现 ;
调用函数时 , 首先将参数入栈 , 每传入一个参数 , 栈指针都要向上移动 ;
执行 func(arg0, arg1, arg2)
函数 , 将函数参数放入栈时 , 从右到左依次入栈 ;
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/120667352
- 点赞
- 收藏
- 关注作者
评论(0)