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