网站大量收购独家精品文档,联系QQ:2885784924

第13章 模块机制与操作.ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第13章 模块机制与操作

Linux应用与开发典型实例精讲 配套教材: 《Linux应用与开发典型实例精讲》 邱铁、于玉龙、徐子川编著. 清华大学出版社. 2010.5 Email:openlinux21@ 第13章 模块机制与操作 学习本章要达到的目标: 1. 了解内核编程应注意的事项; 2. 熟悉模块的符号表导入与导出功能; 3. 熟悉模块的参数使用方法; 4. 理解Linux内核的模块机制; 5. 熟悉Linux内核的模块的编写方法及模块makefile的书写格式。 13.1 关于内核编程 Linux可以运行在两种模式下: 用户模式(user mode) 内核模式(kernel mode)。 内核模式下编程还存在一些限制 : 不能使用浮点运算。 不要让内核程序进行长时间等待。 尽可能保持代码的清洁。 13.2 Linux的模块机制 Linux操作系统使用了一种全新的机制——模块(Module)机制。 用户可以根据需要,在不需要对内核重新编译的情况下,模块可以动态地载入内核或从内核中移出。 13.2.1 Linux内核结构 操作系统采用两种体系结构: 微内核(Micro kernel) 最常用的功能模块被设计成内核模式运行的一个或一组进程,而其它大部分不十分重要的功能模块都作为单独的进程在用户模式下运行 单内核(Monolithic kernel,有时也叫宏内核Macro kernel) 内核一般作为一个大进程的方式存在。该进程内部又可以被分为若干模块,在运行的时候,它是一个独立的二进制映象 Linux内核结构 为了弥补单一体系结构的这一缺陷,Linux操作系统使用了模块机制。如图13.1所示,模块可通过?insmod命令插入内核,也可以通过rmmod命令从内核中删除。 13.2.2 模块的实现 模块的编译 模块许可声明 模块安装与初始化 模块的编译 在linux2.6内核中,模块的编译需要配置过的内核源代码; 编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录;经过编译、链接后生成的内核模块文件的后缀为.ko; 模块的编译 2.6内核模块的Makefile模板: 模块的编译 当在命令行执行make命令时,将调用Makefile 文件。KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,$(KERNELRELEASE)未被设置,因此第一行ifneq失败,从else后面开始执行,设置KDIR,PWD等变量。 模块的编译 如果make的目标是clean,直接执行clean标号后的操作,执行完clean后面的rm命令后就结束了。当make的目标为all时,-C$(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile,也就是第二次调用make。 当从内核源码目录返回时,$(KERNELRELEASE)已被定义,此时第一行ifneq成功,make将继续读取else之前的内容。ifneq的内容为kbuild语法的语句,指明模块源码中各文件之间的依赖关系,以及要生成的目标模块名。 声明模块的许可证 从Linux内核2.4.10开始,动态加载的模块必须通过MODULE_LICENSE宏声明此模块的许可证 否则在动态加载此模块时,会收到内核被污染module license unspecified taints kernel.的警告。 声明模块的许可证 被内核接受的许可证有GPL,GPLv2,GPL and additional rights,Dual BSD/GPL,Dual MPL/GPL,Proprietary,其中最常用的的是“GPL”和Dual BSD/GPL。 书写格式如下: MODULE_LICENSE(GPL); MODULE_LICENSE(Dual BSD/GPL); 模块的初始化与退出 在Linux2.6内核中,内核模块需要调用宏module_init()与module_exit()去注册初始化与退出函数。可以采用以下模板格式: 13.2.3 Linux模块导出符号表 在内核中,导出内核函数需要使用特殊的指令:EXPORT_SYMBOL()和EXPORT_SYMPOL_GPL()。 导出的内核函数可以被其它模块调用,而未导出的函数模块则无法被其它模块调用。 导出的内核符号表被看作是导出的内核接口,也可以看作内核API。 内核符号的导出格式 13.2.4 模块参数 Linux操作系统内核提供了一种模块带参数的机制 定义一个模块参数可通过module_param()完成: module_param(n

文档评论(0)

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

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

1亿VIP精品文档

相关文档