2、Linux下C程序的内存映像

2.1、 代码段、只读数据段
(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)
(2)只读数据段就是在程序运行期间只能读不能写的数据,const修饰的常量有可能是存在只读数据段的(但也不一定,const常量的实现方法
在不同平台是不一样的)
2.2、数据段、bss段
(1)数据段存:1、显式初始化为非0的全局变量;2、显式初始化为非0的static局部变量
(2)bss段存:1、显式初始化为0或者未显示初始化的全局变量;2、显式初始化为0或未显示初始化的ststic的局部变量
2.3、堆
C语言中什么样的变量存在堆内存中?C语言不会自动向堆中存放东西,堆的操作是程序员自己手工操作的。程序员根据需求自己判断要不要使用堆内存,
用的时候自己申请,自己使用,完了自己释放。
2.4、文件映射区
文件映射区就是进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完了后在保存时再将内存中的
文件写到硬盘中。
2.5、栈
栈内存区,局部变量分配在栈上;函数调用传参过程也会用到栈
2.6、内核映射区
(1)内核映射区就是将操作系统内核程序映射到这个区域了。
(2)对于Linux中的每一个进程来说,他都以为整个系统中只有它自己和内核而已。他认为内存地址0xC0000000以下都是它自己的活动空间,
0xC0000000以上是OS内核的活动空间。
(3)每一个进程都活在自己独立的进程空间中,0-3G的空间每一个进程是不同的(因为用了虚拟地址技术),但是内核是唯一的。
2.7 OS下和裸机下C程序加载执行的差异
(1)C语言程序运行时环境有一定要求,意思是单独个人写的C语言程序没法直接在内存中运行,需要外部一定的协助,这段协助的代码叫加载运行代码(或者叫构建C
运行时环境的代码,这一段代码在操作系统下是别人写好的,会自动添加到我们写的程序上,这段代码的主要作用是:给全局变量赋值、清bss段)。
(2)start.S中的重定位和清bss段就是帮助我们将数据段的全局变量或静态局部变量有非0初值的初始化。所以我们会看到:在C语言中未初始化的全局变量默认为0。
(3)在操作系统中,运行程序时会自动完成重定位和清bss段。

最新文章

  1. 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
  2. 生成uuid
  3. hdu 5237 二进制
  4. Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
  5. SQL Server 字符串函数
  6. 【转】不同VLAN之间相互通信及VTP、STP、EtherChannel概念
  7. DELPHI XE8 远程调试
  8. 201621123043 《Java程序设计》第3周学习总结
  9. 20190325-HTML框架、audio标签、vedio标签、source标签、HTML表单
  10. systemd: Started Session 305 of user root.
  11. mysql <=> null 问题
  12. DevExpress WinForms使用教程:皮肤颜色和LookAndFeel
  13. No.0
  14. Burrow 服务的安装部署
  15. Chrome 调试技巧
  16. git工具使用包括上传本地代码到服务器
  17. JS/Jquery版本的俄罗斯方块(附源码分析)
  18. android studio maven 仓库的使用
  19. C++11 Lambda表达汇总总结
  20. elk架构图

热门文章

  1. SpringBoot整合MyBatis获得插入数据后获取主键,返回值总是1
  2. spring事务传播属性和隔离级别
  3. 整合Spring时Service层为什么不做全局包扫描详解
  4. Liveness 探测【转】
  5. 第1课 VMware的NSX全面落地软件定义网络SDN
  6. PHP: isset与empty的区别
  7. Django(七)模型:字段属性、字段选项(参数)
  8. pythonfile的知识点
  9. I0.0 上升边沿 清空 MW10~MW58 联系多个知识点融合
  10. python 获取cpu、内存、硬盘等实时信息 psutil