《第6章 模块编程实验.ppt》由会员分享,可在线阅读,更多相关《第6章 模块编程实验.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6 6章章 模块编程实验模块编程实验 ./期期期期望望望望该该该该模模模模块块块块所所所所能能能能实实实实现现现现的的的的一一一一些些些些功功功功能函数能函数能函数能函数,如如如如open()open()open()open()、release()release()release()release()、writewritewritewrite()()()()、6.1 6.1 6.1 6.1 实验目的实验目的实验目的实验目的 6.2 6.2 6.2 6.2 准备知识准备知识准备知识准备知识 6.2.1 6.2.1 6.2.1 6.2.1 模块的组织结构模块的组织结构模块的组织结构模块的组织结
2、构 /其他其他其他其他headerheaderheaderheader信息信息信息信息 intintintint init_module()init_module()init_module()init_module()#include include include include /module.h /module.h /module.h 模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹./声明是一个模块声明是一个模块声明是一个模块声明是一个模块././././加载时加载时加载时加载时,初始化模块的编码初始化模块的编码初始化模块的编码初始化模块的编码#include include
3、include include /kernel.h /kernel.h /kernel.h /说说说说明明明明是是是是个个个个内内内内核功能核功能核功能核功能 /read()read()read()read()、ioctlioctlioctlioctl()()()()等函数等函数等函数等函数 .void cleanup_module()void cleanup_module()void cleanup_module()void cleanup_module()././././卸载时卸载时卸载时卸载时,注销模块的编码注销模块的编码注销模块的编码注销模块的编码 模块编程实验模块编程实验 _ _ 成
4、都信息工程学院 徐虹6.2.2 6.2.2 模块的编译模块的编译模块的编译模块的编译#gccgccO2gWallDMODULED_KERNEL_cfilename.cO2gWallDMODULED_KERNEL_cfilename.c/filename.c/filename.c为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件 6.2.3 6.2.3 模块的加载模块的加载模块的加载模块的加载 6.2.4 6.2.4 模块的卸载模块的卸载模块的卸载模块的卸载 6.2.5 6.2.5 模块链接到内核的示意图模块链接到内核的示意图
5、模块链接到内核的示意图模块链接到内核的示意图 6.2.6 6.2.6 模块程序中管理模块的几个文件操模块程序中管理模块的几个文件操模块程序中管理模块的几个文件操模块程序中管理模块的几个文件操作作作作模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹intint(*lseeklseek)(),)(),intint(*read)(),read)(),intint(*wriwrite)(),te)(),intint(*readdirreaddir)(),)(),intint(*select)(select)(),),intint (*ioctlioctl)(),)(),intint (*mma
6、pmmap)(),)(),intint (*open)(),void(open)(),void(*release)(),release)(),intint(*(*fsyncfsync)(),)(),intint(*(*fasyncfasync)(),)(),intint(*check_media_change)(),(*check_media_change)(),intint(*revalidate)()(*revalidate)()模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 图图图图6-16-1模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示
7、意图模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _lseeklseeklseeklseek,改改改改变变变变模块结构中的操作位置模块结构中的操作位置模块结构中的操作位置模块结构中的操作位置 modulenamemodulenamemodulenamemodulename_read,_read,_read,_read,modulenamemodulenamemodulenamemodulename_write,_write,_write,_write
8、,NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _readdirreaddirreaddirreaddir,读取某个子目录中的内容读取某个子目录中的内容读取某个子目录中的内容读取某个子目录中的内容 structstructstructstruct file_operations file_operations file_operations file_operationsmodulenamemodulenamemodulenamemodulename_fops=_fops=_fops=_fops=NULL,
9、NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_select,_select,_select,_select,允允允允许许许许应应应应用用用用程程程程序序序序响响响响应应应应来来来来自自自自模模模模块块块块的的的的事事事事件件件件 模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _ioctlioctlioctlioctl,应应应应用用用用程序通过程序通过程序通过程序通过I/OI/OI/O
10、I/O控制系统的系统调控制系统的系统调控制系统的系统调控制系统的系统调 /用用用用来来来来控控控控制制制制模模模模块行为块行为块行为块行为 NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _mmapmmapmmapmmap,模块地址空间到用户地址空间的映射模块地址空间到用户地址空间的映射模块地址空间到用户地址空间的映射模块地址空间到用户地址空间的映射 modulenamemodulenamemodulenamemodulename_open,_open,_open,_open,modulenamemodule
11、namemodulenamemodulename_release,_release,_release,_release,NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _fsyncfsyncfsyncfsync,同步内存与磁盘上的数据状态同步内存与磁盘上的数据状态同步内存与磁盘上的数据状态同步内存与磁盘上的数据状态,输输输输模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 /出出出出缓缓缓缓冲冲冲冲区区区区里里里里尚尚尚尚未未未未写写写写到磁盘的数据写出去到磁盘的数据写出去到磁盘的数据写出去到磁盘的数
12、据写出去 NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_ _ _ _fasyncfasyncfasyncfasync,改变模块行为改变模块行为改变模块行为改变模块行为 NULL,NULL,NULL,NULL,/modulenamemodulenamemodulenamemodulename_check_media_change,_check_media_change,_check_media_change,_check_media_change,检查自上次操作后检查自上次操作后检查自上次操作后检查自上次操作后,/介介
13、介介质质质质(软软软软盘盘盘盘和和和和CD-ROM)CD-ROM)CD-ROM)CD-ROM)是否更换是否更换是否更换是否更换 NULL NULL NULL NULL /modulenamemodulenamemodulenamemodulename_revalidate,_revalidate,_revalidate,_revalidate,若更换了介质若更换了介质若更换了介质若更换了介质,则更新信息则更新信息则更新信息则更新信息 模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹6.3 实验内容 6.3.1 编写一个简单的内核模块6.3.2 模块加载前后的比较6.3.3 向模块中再添
14、加一些新函数6.4 实验指导 6.4.1 一个简单的内核模块模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹#include include include include /kernel.h/kernel.h/kernel.h /在在在在内内内内核核核核模块中共享模块中共享模块中共享模块中共享#include include include include /module.h/module.h/module.h /一一一一个个个个模模模模块块块块 /处理处理处理处理CONFIG_MODVERSIONS CONFIG_MODVERSIONS CONFIG_MODVERSIONS CON
15、FIG_MODVERSIONS#if CONFIG_MODVERSIONS=1#if CONFIG_MODVERSIONS=1#if CONFIG_MODVERSIONS=1#if CONFIG_MODVERSIONS=1#define MODVERSIONS#define MODVERSIONS#define MODVERSIONS#define MODVERSIONS#include#include#include#include .h.h.h#endif endif endif endif intintintint init_module()init_module()init_modul
16、e()init_module()/初初初初始始始始化化化化模块模块模块模块 模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 printkprintkprintkprintk(Hello!(Hello!(Hello!(Hello!This This This This is is is is a a a a testing testing testing testing module!n);module!n);module!n);module!n);return 0;return 0;return 0;return 0;void void void void cleanup_modul
17、e()cleanup_module()cleanup_module()cleanup_module()/取取取取消消消消init_moduleinit_moduleinit_moduleinit_module()()()()函数所做的打印功能操作函数所做的打印功能操作函数所做的打印功能操作函数所做的打印功能操作 printkprintkprintkprintk(Sorry!(Sorry!(Sorry!(Sorry!The The The The testing testing testing testing module is unloading now!n);module is unload
18、ing now!n);module is unloading now!n);module is unloading now!n);模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 rootrootlinuxlinux /#/#gccgcc O2 O2 Wall Wall DMODULE DMODULE D_KERNEL_ D_KERNEL_ c c testmoduletestmodule.c.c rootrootlinuxlinux /#/#lsls s s /在在当当前前目目录下查看生成的目标文件录下查看生成的目标文件testmoduletestmodule.o .o rootro
19、otlinuxlinux /#/#insmodinsmod f f testmoduletestmodule.o.o Hello!Hello!This This is is a a testing testing module!module!模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹rootrootlinuxlinux/#/#rmmod testmodule rmmod testmodule Sorry!Sorry!The The testing testing module module is is unloading now!unloading now!6.4.2 6.4.2
20、 模块加载前后的比较模块加载前后的比较#include include .h /用户空间的标准用户空间的标准I/OI/O出头文件出头文件void GetCr3()void GetCr3()模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 int iValueint iValueint iValueint iValue;_ _ _ _ _ _ _ _asmasmasmasm_ _ _ _ _volatile_ _volatile_ _volatile_ _volatile_ _(_(_(_(movlmovlmovlmovl%cr3,%0:%cr3,%0:%cr3,%0:%cr3,%0:=
21、r=r=r=r (a);(a);(a);(a);printfprintfprintfprintf(“the the the the value value value value in in in in cr3 cr3 cr3 cr3 is:is:is:is:%d%d%d%d”,a);,a);,a);,a);/用户空间的标准输出函数用户空间的标准输出函数用户空间的标准输出函数用户空间的标准输出函数 intintintint main()main()main()main()模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 GetCr3();GetCr3();return 0;return
22、 0;#include include/module.hintint init_module()init_module()int iValueint iValue;_ _ _ _asmasm_ _volatile_(_ _volatile_(模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹movlmovl%cr3,%0:=r(%cr3,%0:=r(iValueiValue););printfprintf(cr3:%d,(cr3:%d,iValueiValue);return 0;return 0;void cleanup_module(void)void cleanup_module(
23、void)printkprintk(uninstall GetCr3!n(uninstall GetCr3!n);模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹DFLAGS=DFLAGS=D_KERNEL_D_KERNEL_ DMODULEDMODULECFLAGS=CFLAGS=O2 O2 g g Wall Wall WstrictWstrict-prototypes prototypes pipe pipe l/user/include/l/user/include/linuxlinux/gccgcc c c GetCr3.c GetCr3.c$(DFLAGS)$(DFLAGS)
24、$(CFLAGS$(CFLAGS)o GetCr3.oo GetCr3.oclean:clean:rmrm f f*.o.oGetCr3.o:GetCr3.cGetCr3.o:GetCr3.c模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹rootrootlinuxserverlinuxserver root#root#/sbinsbin/insmod insmod GetCr3.oGetCr3.o Cr3:234320012 Cr3:234320012 /这这个个数数值值有有可可能能不一样不一样 rootrootlinuxserverlinuxserver root#root#/sb
25、insbin/rmmod rmmod GetCr3GetCr3Uninstall GetCr3!Uninstall GetCr3!模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹6.4.3 6.4.3 向模块中添加新函数向模块中添加新函数intint open(open(struct struct inodeinode*inodeinode,structstruct filefile*filpfilp)MOD_INC_USE_COUNT;MOD_INC_USE_COUNT;/增加该模块的用户数目增加该模块的用户数目 printkprintk(This(This module modul
26、e is is in in open!n);open!n);return 0;return 0;模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 void void void void release(release(release(release(struct struct struct struct inodeinodeinodeinode*inodeinodeinodeinode,structstructstructstruct file*file*file*file*filpfilpfilpfilp)MOD_DEC_USE_COUNT;MOD_DEC_USE_COUNT;MOD
27、_DEC_USE_COUNT;MOD_DEC_USE_COUNT;/该该该该模模模模块块块块的的的的用用用用户户户户数目减数目减数目减数目减1 1 1 1 printkprintkprintkprintk(This(This(This(This module module module module is is is is in in in in release!n);release!n);release!n);release!n);return 0;return 0;return 0;return 0;#ifdefifdefifdefifdef DEBUG DEBUG DEBUG DEBUG
28、 模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 printk printk printk printk(release(%p,%p)n,(release(%p,%p)n,(release(%p,%p)n,(release(%p,%p)n,inodeinodeinodeinode,filpfilpfilpfilp););););#endif endif endif endif int int int int read(read(read(read(struct struct struct struct inodeinodeinodeinode*inodeinodeinodeinode
29、,structstructstructstruct file*file*file*file*filpfilpfilpfilp,char*,char*,char*,char*bufbufbufbuf,intintintint count)count)count)count)intintintint leave;leave;leave;leave;if(verify_area(VERIFY_WRITE,if(verify_area(VERIFY_WRITE,if(verify_area(VERIFY_WRITE,if(verify_area(VERIFY_WRITE,bufbufbufbuf,co
30、unt),count),count),count)=DEFAULT)DEFAULT)DEFAULT)DEFAULT)return DEFAULT;return DEFAULT;return DEFAULT;return DEFAULT;for(leave=count;leave0;leave-)for(leave=count;leave0;leave-)for(leave=count;leave0;leave-)for(leave=count;leave0;leave-)模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 _ _put_user(1,_ _put_user(1,_ _pu
31、t_user(1,_ _put_user(1,bufbufbufbuf,1);,1);,1);,1);bufbufbufbuf+;+;+;+;return count;return count;return count;return count;IntIntIntInt write(write(write(write(struct struct struct struct inodeinodeinodeinode*inodeinodeinodeinode,structstructstructstruct filefilefilefile*filpfilpfilpfilp,const char,
32、const char,const char,const char*bufbufbufbuf,intintintint count)count)count)count)return count;return count;return count;return count;模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹6.4.4 6.4.4 模块的测试模块的测试#mknod mknod /dev/dev/moduledev moduledev c c major major minor minor rootrootlinuxlinux /#cat/#cat/proc/modules/pr
33、oc/modules|awkawk$2=$2=moduledevmoduledev print$1print$1模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹#include include include include .h .h .h#include#include#include#include#include#include#include#include#include#include#include#include .h .h .h main()main()main()main()intintintint i,i,i,i,testmoduledevtestmoduled
34、evtestmoduledevtestmoduledev;char char char char bufbufbufbuf10;10;10;10;testmoduledevtestmoduledevtestmoduledevtestmoduledev=open(/dev/=open(/dev/=open(/dev/=open(/dev/moduledevmoduledevmoduledevmoduledev,O_RDWR);,O_RDWR);,O_RDWR);,O_RDWR);if(if(if(if(testmoduledevtestmoduledevtestmoduledevtestmodu
35、ledev=1)1)1)1)模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹 printfprintfprintfprintf(Cant open the file!n);(Cant open the file!n);(Cant open the file!n);(Cant open the file!n);exit(0);exit(0);exit(0);exit(0);read(read(read(read(testmoduledevtestmoduledevtestmoduledevtestmoduledev,bufbufbufbuf,10);,10);,10);,10);for(
36、i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)printfprintfprintfprintf(%dn,(%dn,(%dn,(%dn,bufbufbufbufiiii ););););close(close(close(close(testmoduledevtestmoduledevtestmoduledevtestmoduledev););););return 0;return 0;return 0;return 0;模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹模块编程实验模块编程实验 _ _ 成都信息工程学院 徐虹