前些天学习到了程序在虚拟内存中分布的一些知识点,结合在网上查阅的一些资料,整理一下知识点。本博客参考博主 hackbuteer1的《程序在内存中的分布》这篇文章。

v 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。

例如:对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x00000000~0x0FFFFFFF(256M)。

v 一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。

从低地址到高地址,可分为下面几段:

Ø 预留内存地址(操作系统维护的内存地址,不可访问)

Ø 程序代码区(只读,存代码和一些其他的东西);

Ø data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放);

Ø bss段(存未初始化的全局变量和static变量);

Ø 堆(由低地址向高地址增长,一般(C++)new和(C)malloc分配,由程序员分配释放);

Ø 共享库文件(调用的库文件,位于堆和栈之间);

Ø 栈(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放);

v 以上程序在虚拟内存空间中的分布,适用于一般的操作系统和内核。但不完全适用,例如:《unix系统编程》32位下,0-3G是用户区,3G-4G是内核区。

【转】程序在内存中的分布相关推荐

  1. C语言之程序在内存中的分布以及内存越界问题

    C语言程序在内存中的分布: bss段:该段用来存放没有被初始化或者初始化为0的全局变量,以及被static修饰的未初始化的局部变量.在程序运行的整个生命周期内都存在于内存中.这个段中的变量只占用程序运 ...

  2. c++ 程序在内存中的分布

    从低地址到高地址: 1.代码区[包含常量的]:存放函数体的二进制代码 2.全局变量区[已初始化 + 未初始化]: 全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量在一块区域, 未初始化的 ...

  3. 程序在内存中运行的奥秘

    简介 当丰富多彩的应用程序在计算机上运行,为你每天的工作和生活带来便利时,你是否知道它们是如何在计算机中工作呢?本文用形象的图表与生动的解释,揭示了程序在计算机中运行的奥秘. 内存管理是操作系统的核心 ...

  4. Java程序在内存中运行详解

    Java语言是一门编译型语言,需要将编写的源代码(.java文件)编译之后(.class字节码文件),通过 jvm 才能正常的执行,下面的内容记录了一个程序从编写到执行整个过程在内存中是怎么一个变的. ...

  5. 组织c语言程序的是什么,C程序在内存中的组织方式

    对我本人来说,学习任何一种高级语言,总想知道高级语言是如何被编译并载入内存的,一个程序的运行,在计算机内存中是怎样组织的等等问题,总想打破砂锅问到底,有好多疑问,因此我就学习了汇编语言,汇编语言确实让 ...

  6. java程序在内存中的存储分配

    java程序在内存中的存储分配情况: 一. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)  2.jvm只有一个堆区(heap)被所有线 ...

  7. C语言探秘:C代码在内存中的分布

    估计会有很多初学者跟我有一样的疑惑,这些编写好的代码是放在磁盘中,但是运行将会被copy至内存中去运行.但他们在内存中是怎么分布呢.在 "linux下c编程圣经"(apue)UNI ...

  8. c++虚基类在内存中的分布

    本文转自http://www.cnblogs.com/cy568searchx/p/3688215.html 今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了 ...

  9. 操作系统-----程序的逻辑地址和物理地址+程序在内存中的编译链接装入方式

    前提知识: 1.程序是先要放在内存上,才能被cpu执行的. 2.内存 内存就像酒店里的一个个小房间,每个小房间都有编号: 假设有4个学号为1,2,3,4的同学,入住酒店时分别按学号递增次序入住酒店房间 ...

最新文章

  1. jdbc mysql 函数 慢_java jdbc addBatch()提交mysql速度过慢
  2. 次小生成树(Prim + Kruaskal)
  3. python数字加密解密_Python对整形数字进行加密和解密
  4. 《系统集成项目管理工程师》必背100个知识点-53项目团队建设的五个阶段及其特点...
  5. C#中使用DLL相关问题
  6. rabbitmq的安装和使用
  7. eclipse将java工程转换为java动态web工程(工程转换均可参照)
  8. 索尼笔记本如何进Bios设置U盘启动
  9. Visual studio内存泄露检查工具--BoundsChecker
  10. AGC002(D~F)【Kruskal重构树,博弈论,dp】
  11. Eclipse下如何导入jar包
  12. 本周日直播丨Oracle 多租户容器数据库体系结构
  13. linux 汇编 读取软盘,读取软盘逻辑扇区的汇编实现代码
  14. RuiJie命令行划VLAN
  15. 深入Webpack-编写Loader
  16. 【PYTHON程序设计】期中准备
  17. 需求与商业模式创新-需求考试复习
  18. android截图保存在哪,电脑f12截屏一般保存在什么位置 | 手游网游页游攻略大全...
  19. chrome去广告插件 去掉百度热搜
  20. 通过计数器完成工厂可视化看板的开发

热门文章

  1. 字段 新增hive_Hive分区表 | 每日五分钟学大数据
  2. 配置文件 web.config 的讨论
  3. java获取xml参数
  4. sublimeText OmniMarkupPreviewer 404
  5. iptables禁止端口和开放端口
  6. PHP编写命令行脚本和后台运行程序的注意事项
  7. 线段树(单点更新(模板)) 之 hdu 1166
  8. ASP.NET MVC 的多国语系支持
  9. 从无头单链表中删除节点
  10. WinCE 5.0 WIFI 无线网卡的配置和建立连接(转)