《C语言笔记:linux下C程序的内存映像》
一,内存图示
二,各内存段的作用
1,代码段、只读数据段
- 对应着程序中的代码(函数),代码段在Linux中也叫做文本段(.text)
- 只读数据段就是程序在运行时只能读不能写的数据,const修饰的常量就有可能存放在只读数据段。
2,数据段、.bss段
- 数据段存放,显示初始化为非0的全局变量和显示初始化为非0的静态局部变量。
- .bss段存放,显示初始化为0或者未显示初始化的全局变量和显示初始化为0或者未显示初始化的静态局部变量。
3,堆
- 程序不会自动向堆中存放东西,堆的操作由程序员自己手工操作。需要的时候申请,使用时存放/读取数据,使用完释放。
4,文件映射区
- 程序从操作(读取/写入)硬盘中文件的中间人。
5,栈区
- 局部变量分配在栈区,函数调用传参过程也用到栈。
6,内核映射区
- 内核映射区就是将操作系统的内核程序映射到这个区域。
- 对于Linux中的每一个进程来说,它都以为整个程序只有它自己和内核而已。它认为内存地址0xc0000000以下的都是它自己的活动空间,0xc0000000以上的是os内核的活动空间。
- 每一个进程都活在自己独立的进程空间中,实际上0-3G的空间每一个进程都是不同的(虚拟地址技术),但内核是唯一的。
三,OS下和裸机下C程序加载执行的差异
1,C语言程序运行时环境有一定的要求,意思是单独个人写的C程序没法直接在内存中运行,需要外部一定的协助,这段协助的代码叫做加载运行代码。(或者叫构建C运行时环境的代码,这一段代码在操作系统下是别人写好的,会自动添加到程序上,这段代码的主要作用是给全局变量赋值,清.bss段)。
2,数据段的全局变量或静态局部变量都是有非0的初值的,这些初值在重定位期间完成初始化,在main函数运行之前。
3,裸机中需要在启动代码start.S中补齐重定位和清.bss段。