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

举报
韩曙亮 发表于 2022/01/11 01:51:01 2022/01/11
【摘要】 文章目录 一、x86 架构下的堆内存二、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 向 操作系统 申请一块内存 , 然后返回内存的首地址给客户端 ;

在这里插入图片描述





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



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

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

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

在这里插入图片描述

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

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

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/120667352

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。