一、程序的内存的空间布局:

由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。

需要由程序员分配释放管理,若程序员不释放,程序结束时可能由OS回收。通常在堆中进行动态存储分配。

非初始化数据段(bss)

通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,未初始化的全局变量和静态变量存放在这里。在程序开始执行之前,内核将此段初始化为0。函数外的说明:long sum[1000] ; 使此变量存放在非初始化数据段中。

初始化的数据(data)

通常将此段称为数据段,它包含了程序中需赋初值的变量。初始化的全局变量和静态变量存放在这里。例如,C程序中任何函数之外的说明:int maxcount = 99; 使此变量以初值存放在初始化数据段中。

正文段(代码段)

CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常环境指针环境表环境字符串执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。

size命令可以看到一个程序的正文段(text)、数据段(data)、非初始化数据段(bss)及文件长度.

生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;

                  对于栈来讲,它的生长方向是自顶向下的,是向着内存地址减小的方向增长。

二、程序栈是什么样

程序执行/函数调用过程:

函数调用时:

建立新栈帧,传递参数,修改“当前代码行”;

函数退出时:

删除栈帧,处理返回值,修改“当前代码行”

过程调用 
        call   首先将被调函数的参数入栈,最后是返回地址入栈,再跳到被调函数起始地址
        leave  准备返回时的桢栈 : 令栈指针指向先指向当前桢的起始处(这里保存的是调用者桢的起始地),出栈(桢指针重置为调用者桢的起始;且栈指针指向返回地址)

       等同于 :   

       movl %ebp,%esp popl %ebpret    (栈指针指向返回地址)出栈并跳到那个位置(返回地址).

寄存器

(1) esp:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2) ebp:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。(ebp在当前栈帧内位置固定,故函数中对大部分数据的访问都基于ebp进行)
(3) eip:指令寄存器(extended instruction pointer),其内存放着一个指针,该指针永远指向下一条等待执行的指令地址。 可以说如果控制了EIP寄存器的内容,就控制了进程——我们让eip指向哪里,CPU就会去执行哪里的指令。eip可被jmp、call和ret等指令隐含地改变(事实上它一直都在改变)(ret指令就是把当前栈顶保存的返回值地址 弹到eip中)

函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是在不停变化的。eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。

esp中的指针将一直指向这个新位置, 所以 esp 中的地址数据是动态的。

三、入栈顺序

3.1 函数参数的入栈顺序:自右向左

        函数参数的入栈顺序和具体编译器的实现有关,一般采用自右向左的方式入栈,调用者清栈。
因为自右向左入栈顺序的好处就是可以动态的变化参数个数

void test(int a, int b, int c)  // 入栈顺序为cba,栈顶为a

3.2 局部变量的入栈顺序

        在没有栈溢出保护机制下编译时,所有局部变量按系统为局部变量申请内存中栈空间的顺序,即:先申请哪个变量,哪个先入栈,正向的。也就是说,编译器给变量空间的申请是直接按照变量申请顺序执行的。(先定义的先入栈
        在有栈溢出保护机制下编译时,入栈顺序有所改变,先按照类型划分,再按照定义变量的先后顺序划分,即:char型先申请,int类型后申请(与编译器溢出保护时的规定相关);然后栈空间的申请顺序与代码中变量定义顺序相反(后定义的先入栈)。

程序内存空间布局以及对栈顶,栈底的理解相关推荐

  1. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  2. linux c 代码分析工具,编程达人 分享几款Linux 下C/C++程序内存泄漏检查工具

    1.内存管理是否正确(因为这个程序本身开辟很多内存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发的,内存管理机制一直是程序员头痛的东西) 2.程序的健硕性如何(服务器任何程序的基本要求就 ...

  3. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  4. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  5. C++程序内存分配方式(堆与栈)

    一.内存布局 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,与数据结构中的堆毫无关系,分配方 ...

  6. 顺序栈(含有栈顶指针,栈底指针)的实现以及编写过程中的一些疑惑的解决

    参考文献:数据结构(c语言版)---严蔚敏p44----->p47 代码如下: #include<stdlib.h>//malloc realloc #include<iost ...

  7. 堆栈的栈顶和栈底在哪_【c# .net】堆栈(Stack)

    堆栈(Stack) 1.简介 堆栈(Stack)代表了一个后进先出的对象集合. 注意:后进先出指的是后面添加的元素会排在集合的顶部也就是最前面,按照从后往前添加元素的规则 就像一个,一端封闭,一端开口 ...

  8. 个人记录002--IAP程序做跳转的时候检查栈顶地址问题,(ck_addr0x2FFE0000)==0x20000000

    IAP跳转的地址判断,为什么是0x2FFE0000 或者 0xFF000000 之类? if(((*(vu32*)(app_addr+4))&0xFF000000)==0x08000000) ...

  9. 栈顶指针到底指向哪_被称为“程序员试金石”的指针真的没有那么难!不信的话你来看看

    很多朋友放弃C语言都是因为指针,说什么指针的*号很讨厌啦.分不清址与值啦,当然了,最烦的还是链表结点,本来链表操作就让人烦了,再加上指针这个东西真是让初学的朋友苦不堪言,最后放弃了C语言转投其他语言的 ...

最新文章

  1. Callgrind--函数调用分析工具以及可视化方法
  2. 埋点套路深,千万别掉“坑”
  3. 蓝桥杯 基础训练 试题集汇总【13道】
  4. 就想问问你们,这种女朋友从哪里来的?
  5. Codeforces Global Round 12 D. Rating Compression 思维 + 贪心
  6. 定位到元素后获取其属性_Selenium界面自动化测试(4)(Python):元素定位及操作...
  7. python 迭代器相关知识
  8. Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(一)
  9. Linux Socket学习(五)
  10. java json 多余属性,fastjson支持JSON字符串解析到指定类型的JavaBean时的多余属性么?...
  11. zabbix监控之概念和安装
  12. Android游戏开发中使用Libgdx引擎遇到的问题及解决办法汇总
  13. 第二次作业(个人作业):软件案例分析
  14. 如何破解域管理员密码
  15. 计算机网络——局域网
  16. 基于FPGA的并行PRBS实现方法
  17. anaconda python降级有影响吗,更新conda会导致降级和被取代的包
  18. 使用ALLpairs完成正交表测试法练习题
  19. UI 自动化中的分层设计
  20. 2023年,web前端工程师20道Vue面试题及解析

热门文章

  1. python读取oracle数据库数据库_Python读写Oracle数据库
  2. 不知道怎么完成流程图制作?用这个软件就可以了
  3. 【职场】技术人员的自我运营之道
  4. 淘宝新手开店不使用直通车,应该怎么去进行做呢?
  5. HEVC标准概览-很概括很详细
  6. ERP词汇中英文对照
  7. linux中$$、$!、$?等的含义
  8. arduino音乐播放器(蜂鸣器版)
  9. power linux 安装系统,在Linux系统中安装/使用PowerShell Core 6.0
  10. IBM收购了Redhat,转身就卖掉了自己的重要软件......