第13章 模块机制与操作.pdf
《第13章 模块机制与操作.pdf》由会员分享,可在线阅读,更多相关《第13章 模块机制与操作.pdf(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux操作系统精讲操作系统精讲大连理工大学软件学院大连理工大学软件学院邱铁邱铁综合楼综合楼413,Tel:0411-87571632E_mail:参考教材:参考教材:?Linux应用与开发典型实例精讲邱铁、于玉龙、徐子川编著应用与开发典型实例精讲邱铁、于玉龙、徐子川编著.清华大学出版社清华大学出版社.2010.5第第13章 模块机制与操作章 模块机制与操作学习本章要达到的目标:学习本章要达到的目标:?1.了解内核编程应注意的事项;了解内核编程应注意的事项;?2.熟悉模块的符号表导入与导出功能;熟悉模块的符号表导入与导出功能;?3.熟悉模块的参数使用方法;熟悉模块的参数使用方法;?4.理解理
2、解Linux内核的模块机制;内核的模块机制;?5.熟悉熟悉Linux内核的模块的编写方法及模块内核的模块的编写方法及模块makefile的书写格式。的书写格式。13.1 关于内核编程关于内核编程?Linux可以运行在两种模式下:?用户模式用户模式(user mode)?内核模式内核模式(kernel mode)。?内核模式下编程还存在一些限制:?不能使用浮点运算。?不要让内核程序进行长时间等待。?尽可能保持代码的清洁。13.2 Linux的模块机制的模块机制?Linux操作系统使用了一种全新的机制操作系统使用了一种全新的机制模块模块(Module)机制机制。?用户可以根据需要,在不需要对内核重
3、新编译的情况下,模块可以动态地载入内核或从内核中移出。用户可以根据需要,在不需要对内核重新编译的情况下,模块可以动态地载入内核或从内核中移出。13.2.1 Linux内核结构内核结构?操作系统采用两种体系结构:?微内核(Micro kernel)最常用的功能模块被设计成内核模式运行的一个或一组进程,而其它大部分不十分重要的功能模块都作为单独的进程在用户模式下运行最常用的功能模块被设计成内核模式运行的一个或一组进程,而其它大部分不十分重要的功能模块都作为单独的进程在用户模式下运行?单内核(Monolithic kernel,有时也叫宏内核Macro kernel)内核一般作为一个大进程的方式存在
4、。该进程内部又可以被分为若干模块,在运行的时候,它是一个独立的二进制映象内核一般作为一个大进程的方式存在。该进程内部又可以被分为若干模块,在运行的时候,它是一个独立的二进制映象Linux内核结构内核结构?为了弥补单一体系结构的这一缺陷,为了弥补单一体系结构的这一缺陷,Linux操作系统使用了模块机制。如图操作系统使用了模块机制。如图13.1所示,模块可通过所示,模块可通过 insmod命令插入内核,也可以通过命令插入内核,也可以通过rmmod命令从内核中删除。命令从内核中删除。13.2.2 模块的实现模块的实现?模块的编译模块的编译?模块许可声明模块许可声明?模块安装与初始化模块安装与初始化模
5、块的编译模块的编译?在在linux2.6内核中,模块的编译需要配置过的内核源代码;内核中,模块的编译需要配置过的内核源代码;?编译过程首先会到内核源码目录下,读取顶层的编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录;经过编译、链接后生成的内核模块文件的后缀为文件,然后再返回模块源码所在目录;经过编译、链接后生成的内核模块文件的后缀为.ko;模块的编译模块的编译?2.6内核模块的Makefile模板:ifneq($(KERNELRELEASE),)mymodule-objs:=mymodule 1.o mymodule 2.o#依赖关系 obj-m+=
6、mymodule.o#编译链接后将生成 mymodule.o 模块 else PWD:=$(shell pwd)KVER:=$(shell uname-r)KDIR:=/lib/modules/$(KVER)/build all:$(MAKE)-C$(KDIR)M=$(PWD)#此处将再次调用 make clean:rm-rf*.o*.mod.c*.ko*.symvers*.order*.markers*endif 模块的编译模块的编译?当在命令行执行当在命令行执行make命令时,将调用命令时,将调用Makefile 文件。文件。KERNELRELEASE是在内核源码的顶层是在内核源码的顶层M
7、akefile中定义的一个变量,在第一次读取执行此中定义的一个变量,在第一次读取执行此Makefile时,时,$(KERNELRELEASE)未被设置,因此第一行未被设置,因此第一行ifneq失败,从失败,从else后面开始执行,设置后面开始执行,设置KDIR,PWD等变量。等变量。模块的编译模块的编译?如果如果make的目标是的目标是clean,直接执行,直接执行clean标号后的操作,执行完标号后的操作,执行完clean后面的后面的rm命令后就结束了。当命令后就结束了。当make的目标为的目标为all时,时,-C$(KDIR)指明跳转到内核源码目录下读取那里的指明跳转到内核源码目录下读取那
8、里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的表明然后返回到当前目录继续读入、执行当前的Makefile,也就是第二次调用,也就是第二次调用make。?当从内核源码目录返回时,当从内核源码目录返回时,$(KERNELRELEASE)已被定义,此时第一行已被定义,此时第一行ifneq成功,成功,make将继续读取将继续读取else之前的内容。之前的内容。ifneq的内容为的内容为kbuild语法的语句,指明模块源码中各文件之间的依赖关系,以及要生成的目标模块名。语法的语句,指明模块源码中各文件之间的依赖关系,以及要生成的目标模块名。声明模块的许可证声明模块的许可
9、证?从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(DualBSD
10、/GPL);模块的初始化与退出模块的初始化与退出?在在Linux2.6内核中,内核模块需要调用宏内核中,内核模块需要调用宏module_init()与与module_exit()去注册初始化与退出函数。可以采用以下模板格式:去注册初始化与退出函数。可以采用以下模板格式:#include MODULE_LICENSE(GPL);/声明模块的许可证声明模块的许可证 /*声明模块安装初始化和退出函数声明模块安装初始化和退出函数*/static int _init mod_init_xxx(void);static void _exit mod_exit_xxx(void);module_init(m
11、od_init_xxx);module_exit(mod_exit_xxx);/*定义模块安装初始化函数定义模块安装初始化函数*/int mod_init_xxx(void)/*可以在这里添加初始化代码可以在这里添加初始化代码*/return 0;/*定义模块退出函数定义模块退出函数*/void mod_exit_xxx(void)/*可以在这里添加释放代码可以在这里添加释放代码*/MODULE_AUTHOR(xxx);/注明模块作者注明模块作者 MODULE_DESCRIPTION(xxxxx);/注明模块功能描述注明模块功能描述 MODULE_VERSION(Ver x.x);/注明模块版
12、本注明模块版本 13.2.3 Linux模块导出符号表模块导出符号表?在内核中,导出内核函数需要使用特殊的指令:在内核中,导出内核函数需要使用特殊的指令:EXPORT_SYMBOL()和和EXPORT_SYMPOL_GPL()。?导出的内核函数可以被其它模块调用,而未导出的函数模块则无法被其它模块调用。导出的内核函数可以被其它模块调用,而未导出的函数模块则无法被其它模块调用。?导出的内核符号表被看作是导出的内核接口,也可以看作内核导出的内核符号表被看作是导出的内核接口,也可以看作内核API。?内核符号的导出格式内核符号的导出格式 EXPORT_SYMBOL(symbol_name);EXPOR
13、T_SYMBOL_GPL(symbol_name);/只适用于包含 GPL 许可权的模块 13.2.4 模块参数模块参数?Linux操作系统内核提供了一种模块带参数的机制操作系统内核提供了一种模块带参数的机制?定义一个模块参数可通过定义一个模块参数可通过module_param()完成:完成:?module_param(name,type,perm);13.2.5 模块使用计数模块使用计数?内核需要记录加载到系统里的每一个模块的使用情况内核需要记录加载到系统里的每一个模块的使用情况?在在Linux操作系统操作系统2.4内核中使用两个宏来完成对模块引用计数的操作:内核中使用两个宏来完成对模块引用
14、计数的操作:/*使模块使用计数器加 1,表示模块的使用者增加一个*/MOD_INC_USE_COUNT;/*使模块使用计数器减 1,表示模块的使用者减少一个*/MOD_DEC_USE_COUNT;?在在Linux操作系统操作系统2.6内核中,使用下面的两个函数来完成对模块引用计数的操作:内核中,使用下面的两个函数来完成对模块引用计数的操作:/*使模块使用计数器加 1,表示模块的使用者增加一个;若返回为 0,表示调用失败,希望使用的模块没有被加载或正在被卸载中*/int try_module_get(struct module*module);/*使模块使用计数器减 1,表示模块的使用者减少一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第13章 模块机制与操作 13 模块 机制 操作
限制150内