1、代码段
(1)作用:存放程序的可执行指令(即编译后的机器码)。
(2)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)
(3)通常是只读的,防止程序意外修改自身指令。
2、数据段
(1)数据段(Data Segment):存储程序中的数据,直观理解就是C语言程序中的全局变量、静态变量和常量。
(2)数据段分为如下三种:
- 已初始化的数据段(.data段):存放初始化为非0的全局变量和静态变量。
- 未初始化的数据段(.bss 段):存放未初始化和初始化为0 的 全局变量和静态变量。
- 只读数据段(.rodata 段):只读数据段就是在程序运行期间只能读不能写的数据。
- 一般存储常量,如字符串常量和const修饰的变量;
- 但是不一定,const常量的实现方法在不同平台是不一样的。
3、堆内存
(1)C语言不会自动向堆中存放东西。
(2)堆内存用于动态内存分配。由程序员手动申请和释放;生命周期由程序员控制,若忘记释放会导致内存泄漏。
4、文件映射区
文件映射区就是进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完了后在保存时再将内存中的文件写到硬盘中去。
5、栈
(1)作用:用于存放函数的局部变量、参数、返回地址等。
(2)特点:
- 由编译器自动分配和释放。
- 函数调用时压栈,函数返回时出栈。
- 若使用过多栈空间(如递归太深),会导致栈溢出(stack overflow)。
6、内核映射区
(1)内核映射区就是将操作系统内核程序映射到这个区域了。
(2)对于linux中的每一个进程来说,它都以为整个系统中只有它自己和内核而已。它认为内存地址0xC0000000以下都是它自己的活动空间,0xC0000000以上是OS内核的活动空间。
(3)每一个进程都活在自己独立的进程空间中,0-3G的空间每一个进程是不同的(因为用了虚拟地址技术),但是内核是唯一的。
7、OS下和裸机下C程序加载执行的差异
(1)C语言程序运行时环境有一定要求。
- 意思是单独个人写的C语言程序没法直接在内存中运行,需要外部一定的协助。
- 这段协助的代码叫加载运行代码(或者叫构建C运行时环境的代码)。
- 这一段代码在操作系统下是别人写好的,会自动添加到我们写的程序上。
- 这段代码的主要作用是:给全局变量赋值、清bss段。
(2)在裸机开发中,写shell时有一次定义了一个全局变量初始化为0但是实际不为0,后来在裸机的start.S中加了清bss段代码就变0了。
- 这就说明在裸机程序中没人帮我们来做这一段加载运行时代码,要程序员自己做(start.S中的重定位和清bss段就是在做这个事);
- 在操作系统中运行程序时程序员自己不用操心,会自动完成重定位和清bss,所以我们看到的现象:C语言中未初始化的全局变量默认为0·····。
(3)已初始化的数据段(.data段),初始化位非0的全局变量或静态局部变量。这些初值在main函数运行之前就已经被初始化了,是重定位期间完成的初始化。
8、Linux下的C程序内存映像


200

被折叠的 条评论
为什么被折叠?



