第八章嵌入式.pdf

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档