注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:4.4.5
一、程序文件的一般布局
1) 不同代码可执行程序中的对应关系
g_init_v映射到.data段——变量被初始化
g_uninit_v映射到.bss段——变量没被初始化(记得看uboot代码时,bss段内存会被初始化为0)
int a = 3;和int b;不放在右边是因为没有栈和堆的存储区,右边这个表是为了映射到可执行程序。
二、程序与进程
1) 程序和进程不同
- 程序是静态的概念,表现形式为一个可执行文件
- 进程是动态的概念,程序由操作系统加载运行后得到进程
- 每个程序可以对应多个进程(多进程编程)
- 每个进程只能对应一个程序
三、思考
1) 面试中的小问题
包含脚本代码的文本文件是一种类型的可执行程序吗?如果是,对应什么样的进程呢?
脚本是一种间接地可执行程序。答案分析下图。
四、程序与进程
五、程序文件的一般布局
1) 文件布局在内存中的映射
左图:可执行程序文件布局(编译阶段)
右图:可执行程序被加载到内存布局的结果(运行阶段)
未映射区域:用来加载特殊的可执行程序。
六、程序的内存布局
1) 各个段的作用
- 堆栈段在程序运行后才正式存在,是程序运行的基础
- .bss段存放的是未初始化的全局变量和静态变量
- .text段存放的是程序中的可执行代码
- .data段保存的是已经初始化了的全局变量和静态变量
- .rodata段存放程序中的常量值,如字符串常量
七、程序术语的对应关系
1) 静态存储区通常指程序中的.bss和.data段
2) 只读存储区通常之程序中的.rodata段
3) 局部变量所占空间为栈上的空间
4) 动态空间为堆中的空间
5) 程序可执行代码存放于.text段(if、switch等等)
八、思考
1) 面试中的小问题
同是全局变量和静态变量,为什么初始化的和未初始化的保存在不同段中?
提示:面试考验的是思考方式,你是如何处理问题。
小结:
1) 程序源码在编译后对应可执行程序中的不同存储区
2) 程序和进程不同,程序静态概念,进程是动态概念
3) 堆栈段是程序运行的基础,只存在于进程空间中
4) 程序可执行代码存放于.text段,是只读的
5) .bss和.data段用于保存全局变量和静态变量