- 程序为什么会崩溃
- 内存中的程序布局
当某个错误导致程序突然和异常地停止执行时,程序崩溃。迄今为止最为常见的导致程序崩溃的原因是试图在未经允许的情况下访问一个内存位置。硬件会感知这件事,并执行对操作系统的跳转。Unix系列的平台上,操作系统一般会宣布程序导致了段错误(seg
fault),并停止程序运行。在微软的windows系统上,对应的术语是一般保护错误(general protection
fault)。无论是哪个名称,硬件都必须支持虚拟内存,而且操作系统必须使用虚拟内存才会发生这个错误。虽然这是如今的通用计算机的标准,但是读者应记住,专用的小型计算机一般没有这种情况,比如用来控制机器的嵌入式计算机。
程序在内存中是如何分布的?
在Unix平台上,为程序分配的虚拟地址的布局通常如下:
.text |
.data |
.bss |
堆 |
↓ 未使用 ↑ |
栈 |
env |
这里虚拟地址0在最下方,箭头显示了其中两个组件(堆和栈)的增长方向,当它们增长时,消耗掉未使用的自由区域。各个部分的作用如下:
- 文本区域(.text),由程序源代码中的编译器产生的机器指令组成。这一组件包括静态链接代码,包括做初始化工作然后调用main()的系统代码/usr/lib/crt0.o
- .data 数据区域,包含在编译时分配的所有程序变量,即全局变量。如 int x = 5;
- .bss 数据区域,包含的是存放未初始化数据的全局变量