第13章 模块机制与操作.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:46 大小:1MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

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

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

预览

免费试读已结束,剩余 36 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux操作系统精讲大连理工大学软件学院邱铁综合楼413,Tel:0411-87571632E_mail:qiutie@dlut.edu.cn参考教材:‡《Linux应用与开发典型实例精讲》邱铁、于玉龙、徐子川编著.清华大学出版社.2010.5第13章模块机制与操作学习本章要达到的目标:†1.了解内核编程应注意的事项;†2.熟悉模块的符号表导入与导出功能;†3.熟悉模块的参数使用方法;†4.理解Linux内核的模块机制;†5.熟悉Linux内核的模块的编写方法及模块makefile的书写格式。13.1关于内核编程†Linux可以运行在两种模式下:¾用户模式(usermode)¾内核模式(kernelmode)。†内核模式下编程还存在一些限制:¾不能使用浮点运算。¾不要让内核程序进行长时间等待。¾尽可能保持代码的清洁。13.2Linux的模块机制†Linux操作系统使用了一种全新的机制——模块(Module)机制。†用户可以根据需要,在不需要对内核重新编译的情况下,模块可以动态地载入内核或从内核中移出。13.2.1Linux内核结构†操作系统采用两种体系结构:¾微内核(Microkernel)最常用的功能模块被设计成内核模式运行的一个或一组进程,而其它大部分不十分重要的功能模块都作为单独的进程在用户模式下运行¾单内核(Monolithickernel,有时也叫宏内核Macrokernel)内核一般作为一个大进程的方式存在。该进程内部又可以被分为若干模块,在运行的时候,它是一个独立的二进制映象Linux内核结构为了弥补单一体系结构的这一缺陷,Linux操作系统使用了模块机制。如图13.1所示,模块可通过insmod命令插入内核,也可以通过rmmod命令从内核中删除。13.2.2模块的实现†模块的编译†模块许可声明†模块安装与初始化模块的编译†在linux2.6内核中,模块的编译需要配置过的内核源代码;†编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录;经过编译、链接后生成的内核模块文件的后缀为.ko;模块的编译†2.6内核模块的Makefile模板:ifneq($(KERNELRELEASE),)mymodule-objs:=mymodule1.omymodule2.o#依赖关系obj-m+=mymodule.o#编译链接后将生成mymodule.o模块elsePWD:=$(shellpwd)KVER:=$(shelluname-r)KDIR:=/lib/modules/$(KVER)/buildall:$(MAKE)-C$(KDIR)M=$(PWD)#此处将再次调用makeclean:rm-rf*.o*.mod.c*.ko*.symvers*.order*.markers*~endif模块的编译†当在命令行执行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宏声明此模块的许可证†否则在动态加载此模块时,会收到内核被污染"modulelicense'unspecified'taintskernel."的警告。声明模块的许可证†被内核接受的许可证有"GPL","GPLv2","GPLandadditionalrights","DualBSD/GPL","DualMPL/GPL","Proprietary",其中最常用的的是“GPL”和"DualBSD/GP