- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章嵌入式
第8 章 Linux系统编程之进程
8.1 程序映像的布局
C 编译器将每一个源文件编译成一个目标文件,然后编译器将这些单个的目标文件同必
需的一些库相链接,形成一个可执行模块(executable module )。程序运行或执行时,操作系
统将可执行模块拷贝到主存储器中去。
加载之后,可执行模块看起来占据了一个连续的内存块,这个连续的内存块被称为程序
映像(program image )。程序映像有几个不同的分区,程序文本或代码在内存低端地址中,
已初始化和未初始化的静态变量也有自己的分区,其他的分区包括堆、栈和环境。
高端地址 命令行参数和环境变量 argc、argv、环境
栈 函数调用的活动记录(返回地址、
参数、已保存的寄存器、自动变量
堆 用malloc函数族分配的内存
未初始化的静态变量
已初始化的静态变量
低端地址 程序文本
活动记录(activation record )是在进程栈顶端分配的一个内存块,用来装载调用过程中
函数的执行上下文,包括返回地址、参数(参数值从相应的命令行参数中拷贝而来)、状态
信息和调用时某些 CPU 寄存器的值及函数执行时在其内部分配的自动变量。
除了静态变量和自动变量之外,程序映像中还包括了argc 和 argv 占用的空间以及malloc
分配的空间。malloc 函数族在一个被称为堆(heap )的空闲内存池中分配存储空间,在堆上
分配的存储空间一直存在,直到它被释放或程序退出为止。
在程序映像中,已初始化的静态变量和未初始化的静态变量占据不同的区域。通常,已
初始化的静态变量是磁盘上可执行模块的一部分(因为编译器知道初始化的值),而未初始
1
化的静态变量则不是。当然,自动变量不是可执行模块的一部分,因为只有当定义它们的程
序块被调用时,才在栈的区域为它们分配空间。除非程序显式地对自动变量初始化,否则,
其初始值是不确定的。
尽管程序映像看起来占据了一个连续的内存块,但实际上,操作系统将程序映射到不一
定连续的物理内存块中。这种映射允许栈和堆有很大的逻辑空间(它们不会冲突的),除非
需要,否则这些栈和堆实际上可以不占物理内存——虚拟存储太好了!
练习 8-1:
用 ls -l 对下面两个 C 程序的可执行模块的大小进行比较。解释得到的结果。
版本 1: 版本 2:
int myarray[50000] = {1,2,3,4}; int myarray[50000];
int main(void) int main(void)
{ {
myarray[0] = 3; myarray[0] = 3;
return 0; return 0;
} }
8.2 标识符、存储类和链接类
根据 ANSI C 标准,“标识符可以表示一个对象;一个函数;一个结构、联合或枚举的
标记或成员;一个 typedef 名;一个标签名;一个宏名;或者一个宏参数” 。这里我们主要讨
论与变量和函数有关的标识符。
每个标识符都有一个范围(scope ),标识符只能在它的范围内使用。标识符的范围从它
的声明开始,如果声明出现在一个块的内部,那么其范围就在块的尾部结束;如果声明出
文档评论(0)