2.4. 编译和加载.pdfVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2.4. 编译和加载

2.4. 编译和加载 2.4. 编译和加载 本章开头的 hello world 例⼦包含了⼀个简短的建⽴并加载模块到系统中去的演⽰. 当然, 整个 程⽐我们⽬前看到的多. 本节提供了更多细节关于⼀个模块作者如何将源 码转换成内核中的运⾏的⼦系统. 2.4.1. 编译模块 第⼀步, 我们需要看⼀下模块如何必须被建⽴. 模块的建⽴ 程与⽤户空间的应⽤程序 的建⽴ 程有显著不同; 内核是⼀个⼤的, 独⽴的程序, 对于它的各个部分如何组合在 ⼀起有详细的明确的要求. 建⽴ 程也与以前版本的内核的 程不同; 新的建⽴系统⽤ 起来更简单并且产⽣更正确的结果, 但是它看起来与以前⾮常不同. 内核建⽴系统是⼀ 头负责的野兽, 我们就看它⼀⼩部分. 在内核源码的 Document/kbuild ⽬录下发现的⽂ 件, 任何想理解表⾯之下的真实情况的⼈都要阅读⼀下. 有⼏个前提, 你必须在能建⽴内核模块前解决. 第⼀个是保证你有版本⾜够新的编译器, 模块⼯具, 以及其他必要⼯具. 在内核⽂档⽬录下的⽂件 Documentation/Changes ⼀直 列出了需要的⼯具版本; 你应当在向前⾛之前参考⼀下它. 试图建⽴⼀个内核(包括它 的模块), ⽤错误的⼯具版本, 可能导致不尽的奇怪的难题. 注意, 偶尔地, 编译器的版本 太新可能会引起和太⽼的版本引起的⼀样的问题. 内核源码对于编译器做了很⼤的假 设, 新的发⾏版本有时会⼀时地破坏东西. 如果你仍然没有⼀个内核树在⼿边, 或者还没有配置和建⽴内核, 现在是时间去做了. 没有源码树在你的⽂件系统上, 你⽆法为 2.6 内核建⽴可加载的模块. 实际运⾏为其⽽ 建⽴的内核也是有帮助的( 尽管不是必要的 ) . ⼀旦你已建⽴起所有东西, 给你的模块创建⼀个 makefile 就是直截了当的. 实际上, 对 于本章前⾯展⽰的 hello world 例⼦, 单⾏就够了 obj-m := hello.o 熟悉 make , 但是对 2.6 内核建⽴系统不熟悉的读者, 可能奇怪这个 makefile 如何⼯作. 毕竟上⾯的这⼀⾏不是⼀个传统的 makefile 的样⼦. 答案, 当然, 是内核建⽴系统处理 了余下的⼯作. 上⾯的安排( 它利⽤了由 GNU make 提供的扩展语法 )表明有⼀个模块 要从⽬标⽂件 hello .o 建⽴. 在从⽬标⽂件建⽴后结果模块命名为 hello .ko . 反之, 如果你有⼀个模块名为 module .ko , 是来⾃ 2 个源⽂件( 姑且称之为, file 1.c 和 file2.c ), 正确的书写应当是 obj-m := module.o module-objs := file1.o file2.o 对于⼀个象上⾯展⽰的要⼯作的 makefile , 它必须在更⼤的内核建⽴系统的上下⽂被调 ⽤. 如果你的内核源码数位于, 假设, 你的 ~/kernel-2.6 ⽬录, ⽤来建⽴你的模块的 make 命令( 在包含模块源码和 makefile 的⽬录下键⼊ )会是 make -C ~/kernel-2.6 M=`pwd` modules 这个命令开始是改变它的⽬录到⽤ -C 选项提供的⽬录下( 就是说, 你的内核源码⽬录 ) . 它在那⾥会发现内核的顶层 makefile . 这个 M= 选项使 makefile 在试图建⽴模块⽬标 前, 回到你的模块源码⽬录. 这个⽬标, 依次地, 是指在 obj -m 变量中发现的模块列表, 在我们的例⼦⾥设成了 module .o . 键⼊前⾯的 make 命令⼀会⼉之后就会感觉烦, 所以内核开发者就开发了⼀种 makefile ⽅式, 使得⽣活容易些对于那些在内核树之外建⽴模块的⼈. 这个窍门是如下书写你的 makefile If KERNELRELEASE is defined, weve been invoked from the kernel build system and can use its language. ifneq ($(KERNELRELEASE),) obj-m := hello.o Otherwise we were called directly from the command line; invoke the kernel build system. else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD :

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档