《第7章 linux下模块编程实验.ppt》由会员分享,可在线阅读,更多相关《第7章 linux下模块编程实验.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023/1/14成都信息工程学院1第第7章章 模块编程实验模块编程实验2023/1/14成都信息工程学院2n一、一、实验目的目的n体会用体会用户空空间和系和系统空空间;n理解操作系理解操作系统“宏内核宏内核”组织方式方式n学学习模模块操作(加操作(加载、卸、卸载)2023/1/14成都信息工程学院3n二、模二、模块的的组织结构构n内核模内核模块至少包含两个函数:至少包含两个函数:n模模块加加载函数:函数:init_module(),作,作为模模块的初始的初始化函数,模化函数,模块加加载时被被执行行n模模块卸卸载函数:函数:cleanup_module(),作,作为模模块的的结束函数,模束函数
2、,模块卸卸载时被被执行行n从从2.3.13内核开始,也可以内核开始,也可以为开始和开始和结束函数起束函数起任意名称任意名称。这可以通可以通过宏宏module_init()和和module_exit()实现2023/1/14成都信息工程学院4n内核模内核模块包含包含头文件及宏文件及宏说明:明:n#include n它定它定义了模了模块的的 API、类型和宏型和宏(MODULE_LICENSE、MODULE_AUTHOR等等等等),所有的内核模所有的内核模块都必都必须包含包含这个个头文件。文件。n#include n使用内核信息使用内核信息记录优先先级时要包含要包含这个文件,一般在使个文件,一般在
3、使用用printk函数函数时使用到使用到优先先级信息。信息。n#include nmodule_init、module_exit等宏定等宏定义。2023/1/14成都信息工程学院5n内核模内核模块的代的代码编写没有外部的函数写没有外部的函数库可以可以用,只能使用内核用,只能使用内核导出的函数出的函数n如:不能使用如:不能使用printf(),而要使用,而要使用printk()nprintk()并不是并不是设计用来同用用来同用户交互的,它交互的,它实际上是上是为内核提供日志功能,内核提供日志功能,记录内核信息或用来内核信息或用来给出警告。因此,每个出警告。因此,每个printk()声明都会声明都
4、会带一个一个优先先级,形如,形如和和KERN_ALERT 那那样。内核。内核总共定共定义了八个了八个优先先级的宏。的宏。(具体可具体可查看文件:看文件:/usr/src/linux-2.4/include/linux/kernel.h)2023/1/14成都信息工程学院6n三、添加模块三、添加模块2023/1/14成都信息工程学院71、最、最简单的内核模的内核模块(hello.c)#include#include int init_module()printk(Hello!This is a testing module!n);return 0;void cleanup_module()pri
5、ntk(“Sorry!The module is unloading!n);2023/1/14成都信息工程学院8n内核模内核模块在用在用gcc 编译时需要使用特定的参数:需要使用特定的参数:ngcc -Wall-DMODULE-D_KERNEL_-DLINUX-c 用用insmod命令手工加命令手工加载编译好的模好的模块:ninsmod hello.on如果出如果出现“kernel-module version mismatch”错误,修改:,修改:编译器版本器版本/usr/include/linux/version.h 或者内核源代或者内核源代码版本版本/usr/src/linux-2.4/
6、include/linux/version.h使两者使两者相同即可相同即可n如果成功,可以看到屏幕如果成功,可以看到屏幕输出信息;同出信息;同时,可用,可用dmesg命令命令查看、也可在看、也可在/var/log/messages文件中文件中查看到相看到相应输出出2023/1/14成都信息工程学院9n用用lsmod命令命令查看加看加载成功的模成功的模块:nlsmod n所有已所有已经被加被加载的内核模的内核模块都都罗列在文件列在文件/proc/modules 中,中,因此可因此可查看看该文件也可得到模文件也可得到模块列表列表n用用modinfo 模模块名名 可可查看具体的模看具体的模块信息信息
7、n用用rmmod命令卸命令卸载模模块:nrmmod hellon如果成功,如果成功,输出相出相应的信息,可用的信息,可用类似的方法似的方法查看看输出出2023/1/14成都信息工程学院102、添加内核模、添加内核模块证书n在在2.4 及更新的内核中,一种及更新的内核中,一种识别代代码是否在是否在GPL 许可可下下发布的机制被引入,布的机制被引入,因此在使用非公开的源代因此在使用非公开的源代码产品品时得到警告得到警告n在前面用在前面用insmod加加载编译好的模好的模块时,会提示,会提示”no license”相相关信息关信息n通通过添加以下的宏可以避免添加以下的宏可以避免nMODULE_LIC
8、ENSE()设置在置在GPL 证书下下发布代布代码nMODULE_DESCRIPTION()描述模描述模块的用途的用途nMODULE_AUTHOR()用来声明模用来声明模块的作者的作者nMODULE_SUPPORTED_DEVICE()声明模声明模块支持的支持的设备n这种种证书机制在机制在头文件文件linux/module.h 实现2023/1/14成都信息工程学院11n添加添加证书信息的代信息的代码(hello2.c):):#include#include#include#define DRIVER_AUTHOR Teacher zhang#define DRIVER_DESC A samp
9、le driverint init_module()printk(Hello!This is a testing module!n);return 0;void cleanup_module()printk(Sorry!The testing module is unloading now!n);MODULE_LICENSE(GPL);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_SUPPORTED_DEVICE(testdevice);2023/1/14成都信息工程学院12n用用modinfo命令命令查
10、看模看模块,会得到相关的信息,会得到相关的信息n测试的其它的其它过程同前所述程同前所述2023/1/14成都信息工程学院133、改、改变“开始开始”和和“结束束”函数函数名等名等n为init_module()和和cleanup_module()函数取函数取任意名字。可以通任意名字。可以通过宏宏module_init()和和module_exit()来来实现n这些宏在些宏在头文件文件linux/init.h 定定义n需要注意的是函数必需要注意的是函数必须在宏的使用前定在宏的使用前定义,否,否则会有会有编译错误n程序例子如下:程序例子如下:2023/1/14成都信息工程学院14n改改变默默认函数名
11、的函数名的简单模模块(hello3.c):):#include#include#include#define DRIVER_AUTHOR Teacher zhang#define DRIVER_DESC A sample driverstatic int init_hello3(void)printk(KERN_ALERTHello!This is a testing module!n);return 0;static void cleanup_hello3()printk(KERN_ALERTSorry!The testing module is unloading now!n);modul
12、e_init(init_hello3);module_exit(cleanup_hello3);MODULE_LICENSE(GPL);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_SUPPORTED_DEVICE(testdevice);2023/1/14成都信息工程学院15n编译命令:命令:ngcc -Wall-DMODULE-D_KERNEL_-DLINUX -I/usr/src/linux-2.4/include-c 由于每次由于每次编译需要需要输入的入的选项太多,可以太多,可以编写写makefile文件,内容如下:文件,内容如下:CC:=gccMODCFLAGS:=-I/usr/src/linux-2.4/include-Wall-DMODULE-D_KERNEL_-DLINUXhello3.o:hello3.c$(CC)$(MODCFLAGS)-c hello3.c.PHONY:cleanclean:rm-f hello3.o2023/1/14成都信息工程学院16本课程结束本课程结束Thank you!