linux内核入门 Chapter 9.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 编译Linux内核 本章包括: 9.1 工具链 9.2 编译内核源代码 小结 习题 到此为止,我们已经认识了linux内核子系统,也探究了系统的初始化函数。同样,了解内核映像的创建也是非常重要的。本章将讨论内核映像的编译和链接过程,并考察内核的编译过程。 9.1 工具链(toolchain) 工具链(toolchain)是创建linux内核映像的一组程序集合。链的概念源于一工具的输出将作为另一工具的输入这一特点。工具链包含编译程序、汇编程序和链接程序。从技术上讲,还需一个文本编辑器。本节只讨论前三个工具。开发软件时工具链必不可少,当然,软件开发工具包(SDK)也是必需的。 编译程序(compiler)是一个转换程序,可将高级源语言转换成低级目标语言(object language)。目标代码是运行在目标系统上并依赖于机器的一系列指令。汇编程序(assembler)也是一个转换程序,可将汇编语言转换成与编译程序相同的目标代码。其不同之处在于:汇编程序产生的机器指令与汇编语句一一对应,而高级语言的每条语句可能对应多条机器指令。如你所知,linux源代码中与体系结构相关的某些文件是用汇编语言编写的,它们调用汇编程序将其编译为目标代码。 链接编辑程序(link editor)或链接程序(linker)可将多个可执行模块链接成一个单元,以便执行。 图9.1说明了工具链的链式关系。链接程序将把程序的目标代码与它使用的所有函数库链接起来。编译程序中含有标志位,可供用户选择编译级别。例如:图9.1中可以看到,编译程序可以直接产生机器代码,也可以先编译成汇编语言,再经由汇编程序把它组合成计算机可直接执行的机器指令。 9.1.1 编译程序 通常,编译程序也具有链式特性,它分成多步执行,一步的输出作为下一步的输入,图9.2是其图解。编译的第一步是词法扫描(scanner),它将高级语言编写的程序拆分为一一个个的单词符号(tokens)。接下来,语法分析(parser)阶段根据一定的语法规则将这些符号组织起来,并由上下文分析阶段根据语义属性进一步组织这些符号。优化程序可提高所解析的符号的效率,代码生成阶段则产生目标代码。编译程序输出符号表和可重定位的目标代码。换句话说,每一个已编译的模块其起始地址都是0,链接时必须重定位到合适的位置。 图9.2 编译程序的操作过程 9.1.2 交叉编译 工具包通常自然地(natively)运行,这就意味着编译代码的系统和运行目标代码的系统相同。如果在x86系统上开发了一个内核,把它装载到另一个(或同样的)x86系统上时,无须进行任何编译工作。功能强大的 Macs和数量繁多的x86工具包可将代码编译成能在相应体系结构上运行的代码。但是,如果我们想在一种平台下编写代码,而在另一种平台下运行呢? 听来容易做来难!考虑一下嵌入式市场,嵌入式系统通常是在有限内存和I/O接口的环境中实现其功能。无论控制的是汽车,路由器还是手机,这些设备都不足以容纳一个完整的嵌入式系统开发环境(更不用说监视器和键盘)。解决的办法就是,让开发者利用他们功能强大、相对廉价的工作站作为宿主机(host systems)来开发代码,然后将这些代码下载到目标系统(target system)上进行检测。因而称之为交叉编译! 例如:你可能是PowerPC嵌入式系统的开发者,该系统使用405处理器。而你的台式机绝大多数都是x86的。通过使用gcc,你可以在这些台式机上完成所有开发工作(包括C程序和汇编程序),只要在编译时使用-mcpu=405选项就可以了。这样产生的目标代码具有405处理器特有的指令和寻址方式。之后就可以把目标代码下载到嵌入式系统中运行并调试。这样做看起来确实很乏味,但是对资源有限的嵌入式系统而言,它大大节省了内存。 在这种特殊环境下,许多用于交叉编译的辅助开发调试工具也应运而生。 9.1.3 链接程序 编译一个C程序时(例如,“Hello world”),生成的代码远不止.c文件中的这三四行。链接程序的工作就是找出所有引用的外部模块并链接起来。这些外部模块或函数库一般来自于开发者、操作系统和C运行库(printf()的出处)。链接程序取出这些函数库,修订指针位置(重定位),并交叉引用模块中的解析符号,最终产生一个可执行模块。符号可以是全局的也可以是局部的。全局符号可以在模块内部定义,或由另一模块外部引用。链接程序要找到与模块相关的所有符号的定义。(注意:内核开发者无法使用用户函数库。)对于普通函数,内核自身有对应的函数。静态库是在链接时被找到并拷贝的,而动态库和共享库是在运行时才装载的,并让所有的进程共享。Microsoft和OS/2将共享库称为动态链接库。Linux提供的系统调用dlopen( ), dlsym( )及 dlclos

文档评论(0)

xxj1658888 + 关注
实名认证
文档贡献者

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档