《模块编程实验精选文档.ppt》由会员分享,可在线阅读,更多相关《模块编程实验精选文档.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、模块编程实验模块编程实验模块编程实验模块编程实验 _ 1 _ 1 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第一页,共二十六页./声明是一个模块声明是一个模块声明是一个模块声明是一个模块././././加载时加载时加载时加载时,初始化模块的编码初始化模块的编码初始化模块的编码初始化模块的编码#include#include#include#include /说说说说明明明明是是是是个个个个内内内内核功能核功能核功能核功能 /read()/read()/read()/read()、ioctl()ioctl()ioctl()ioctl()等函数等函数等函数等函数 .void cleanup_
2、module()void cleanup_module()void cleanup_module()void cleanup_module()././././卸载时卸载时卸载时卸载时,注销模块的编码注销模块的编码注销模块的编码注销模块的编码 模块编程实验模块编程实验 _ 2 _ 2 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二页,共二十六页6.2.2 模块的编译模块的编译#gcc O2 g Wall DMODULE D_KERNEL_c filename.c#gcc O2 g Wall DMODULE D_KERNEL_c filename.c /filename.c/filename
3、.c为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件为自己编写的模块程序源代码文件 6.2.3 6.2.3 模块的加载模块的加载模块的加载模块的加载 6.2.4 6.2.4 模块的卸载模块的卸载模块的卸载模块的卸载 6.2.5 6.2.5 模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示意图 6.2.6 6.2.6 模块程序中管理模块的几个文件操作模块程序中管理模块的几个文件操作模块程序中管理模块的几个文件操作模块程序中管理模块的几个文件操作模块编程实验模块编程实验 _ 3 _ 3 成都信息工程学院成都信息工程学院
4、徐虹徐虹本讲稿第三页,共二十六页int(*lseek)(),int(*read)(),int(*wriint(*lseek)(),int(*read)(),int(*write)(),int(*readdir)(),int(*select)(te)(),int(*readdir)(),int(*select)(),),int int(*ioctl)(),int(*ioctl)(),int(*mmap)(),int(*mmap)(),int(*open)(),void(*release)(),(*open)(),void(*release)(),int(*fsync)(),int(*fasync
5、)(),int(*fsync)(),int(*fasync)(),int(*check_media_change)(),int(*check_media_change)(),int(*revalidate)()int(*revalidate)()模块编程实验模块编程实验 _ 4 _ 4 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第四页,共二十六页 图图图图6-1 6-1 模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示意图模块链接到内核的示意图模块编程实验模块编程实验 _ 5 _ 5 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第五页,共二十六页 NULL,NULL,N
6、ULL,NULL,/modulename_lseek,modulename_lseek,modulename_lseek,modulename_lseek,改改改改变变变变模模模模块结构中的操作位置块结构中的操作位置块结构中的操作位置块结构中的操作位置 modulename_read,modulename_read,modulename_read,modulename_read,modulename_write,modulename_write,modulename_write,modulename_write,NULL,NULL,NULL,NULL,/modulename_readdir,m
7、odulename_readdir,modulename_readdir,modulename_readdir,读取某个子目录中的内容读取某个子目录中的内容读取某个子目录中的内容读取某个子目录中的内容 struct file_operationsstruct file_operationsstruct file_operationsstruct file_operationsmodulename_fops=modulename_fops=modulename_fops=modulename_fops=NULL,NULL,NULL,NULL,/modulename_select,modulena
8、me_select,modulename_select,modulename_select,允允允允许许许许应应应应用用用用程序响应来自模块的事件程序响应来自模块的事件程序响应来自模块的事件程序响应来自模块的事件 模块编程实验模块编程实验 _ 6 _ 6 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第六页,共二十六页 NULL,NULL,NULL,NULL,/modulename_ioctl,modulename_ioctl,modulename_ioctl,modulename_ioctl,应应应应用用用用程程程程序通过序通过序通过序通过I/OI/OI/OI/O控制系统的系统调控制系统的
9、系统调控制系统的系统调控制系统的系统调 /用来控制模块行为用来控制模块行为用来控制模块行为用来控制模块行为 NULL,NULL,NULL,NULL,/modulename_mmap,modulename_mmap,modulename_mmap,modulename_mmap,模模模模块块块块地地地地址址址址空空空空间到用户地址空间的映射间到用户地址空间的映射间到用户地址空间的映射间到用户地址空间的映射 modulename_open,modulename_open,modulename_open,modulename_open,modulename_release,modulename_re
10、lease,modulename_release,modulename_release,NULL,NULL,NULL,NULL,/modulename_fsync,modulename_fsync,modulename_fsync,modulename_fsync,同同同同步步步步内内内内存存存存与磁盘上的数据状态与磁盘上的数据状态与磁盘上的数据状态与磁盘上的数据状态,输输输输模块编程实验模块编程实验 _ 7 _ 7 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第七页,共二十六页 /出出出出缓缓缓缓冲冲冲冲区区区区里里里里尚尚尚尚未未未未写写写写到到到到磁磁磁磁盘的数据写出去盘的数据写出去
11、盘的数据写出去盘的数据写出去 NULL,NULL,NULL,NULL,/modulename_fasync,modulename_fasync,modulename_fasync,modulename_fasync,改改改改变变变变模模模模块块块块行为行为行为行为 NULL,NULL,NULL,NULL,/modulename_check_media_change,modulename_check_media_change,modulename_check_media_change,modulename_check_media_change,检查自上次操作后检查自上次操作后检查自上次操作后检查
12、自上次操作后,/介介介介质质质质(软软软软盘盘盘盘和和和和CD-ROM)CD-ROM)CD-ROM)CD-ROM)是否更换是否更换是否更换是否更换 NULL NULL NULL NULL /modulename_revalidate,modulename_revalidate,modulename_revalidate,modulename_revalidate,若更换了介质若更换了介质若更换了介质若更换了介质,则更新信息则更新信息则更新信息则更新信息 模块编程实验模块编程实验 _ 8 _ 8 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第八页,共二十六页6.3 实验内容 6.3.1 编写
13、一个简单的内核模块6.3.2 模块加载前后的比较6.3.3 向模块中再添加一些新函数6.4 实验指导 6.4.1 一个简单的内核模块模块编程实验模块编程实验 _ 9 _ 9 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第九页,共二十六页#include#include /在在在在内内内内核核核核模模模模块中共享块中共享块中共享块中共享#include /#include /#include /#include /一个模块一个模块一个模块一个模块 /处理处理处理处理CONFIG_MODVERSIONS CONFIG_MODVERSIONS CONFIG_MODVERSIONS CONFIG_
14、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#endif#endif int init_module()/int init_module()/int init_module()/int init_module()/
15、初始化模块初始化模块 模块编程实验模块编程实验 _ 10 _ 10 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十页,共二十六页 printk(Hello!printk(Hello!printk(Hello!printk(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_modu
16、le()cleanup_module()cleanup_module()cleanup_module()/取取取取消消消消init_module()init_module()init_module()init_module()函数所做的打印功能操作函数所做的打印功能操作 printk(Sorry!printk(Sorry!printk(Sorry!printk(Sorry!The The The The testing testing testing testing module module module module is is is is unloading now!n);unloadi
17、ng now!n);unloading now!n);unloading now!n);模块编程实验模块编程实验 _ 11 _ 11 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十一页,共二十六页rootlinux rootlinux/#/#gcc gcc O2 O2 Wall Wall DMODULE DMODULE D_KERNEL_ D_KERNEL_ c c testmodule.c testmodule.c rootlinux rootlinux/#/#ls ls s s /在在当当前前目目 录录 下下 查查 看看 生生 成成 的的 目目 标标 文文 件件testmodule.
18、o testmodule.o rootlinux rootlinux/#/#insmod insmod f f testmodule.o testmodule.o Hello!This is a testing module!Hello!This is a testing module!模块编程实验模块编程实验 _ 12 _ 12 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十二页,共二十六页rootlinux/#rmmod testmodule rootlinux/#rmmod testmodule Sorry!Sorry!The The testing testing module
19、module is is unloading now!unloading now!6.4.2 6.4.2 模块加载前后的比较模块加载前后的比较#include#include /用户空间的标准用户空间的标准I/OI/O出头文件出头文件void GetCr3()void GetCr3()模块编程实验模块编程实验 _ 13 _ 13 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十三页,共二十六页 int iValue;int iValue;int iValue;int iValue;_ _ _ _ _asm_ _asm_ _asm_ _asm_ _volatile_ _volatile_ _
20、volatile_ _volatile_ _(movl _(movl _(movl _(movl%cr3,%0:%cr3,%0:%cr3,%0:%cr3,%0:=r=r=r=r(a);(a);(a);(a);printf(“the printf(“the printf(“the printf(“the value value value value in in in in cr3 cr3 cr3 cr3 is:is:is:is:%d”,a);%d”,a);%d”,a);%d”,a);/用户空间的标准输出函数用户空间的标准输出函数用户空间的标准输出函数用户空间的标准输出函数 int main()
21、int main()int main()int main()模块编程实验模块编程实验 _ 14 _ 14 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十四页,共二十六页 GetCr3();GetCr3();return 0;return 0;#include#include int init_module()int init_module()int iValue;int iValue;_ _asm_ _volatile_(_ _asm_ _volatile_(模块编程实验模块编程实验 _ 15 _ 15 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十五页,共二十六页movl%cr3
22、,%0:=r(iValue);movl%cr3,%0:=r(iValue);printf(cr3:%d,iValue printf(cr3:%d,iValue);return 0;return 0;void cleanup_module(void)void cleanup_module(void)printk(uninstall GetCr3!n printk(uninstall GetCr3!n);模块编程实验模块编程实验 _ 16 _ 16 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十六页,共二十六页DFLAGS=DFLAGS=D_KERNEL_D_KERNEL_ DMODULED
23、MODULECFLAGS=CFLAGS=O2 O2 g g Wall Wall Wstrict-Wstrict-prototypes prototypes pipe pipe l/user/include/linux/l/user/include/linux/gcc gcc c c GetCr3.c GetCr3.c$(DFLAGS)$(DFLAGS)$(CFLAGS$(CFLAGS)o GetCr3.oo GetCr3.oclean:clean:rm f*.orm f*.oGetCr3.o:GetCr3.cGetCr3.o:GetCr3.c模块编程实验模块编程实验 _ 17 _ 17 成都信
24、息工程学院成都信息工程学院 徐虹徐虹本讲稿第十七页,共二十六页rootlinuxserver rootlinuxserver root#root#/sbin/insmod GetCr3.o/sbin/insmod GetCr3.o Cr3:234320012 Cr3:234320012 /这这个个数数值值有有可可能能不一样不一样rootlinuxserver rootlinuxserver root#root#/sbin/rmmod GetCr3/sbin/rmmod GetCr3Uninstall GetCr3!Uninstall GetCr3!模块编程实验模块编程实验 _ 18 _ 18
25、成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十八页,共二十六页6.4.3 6.4.3 向模块中添加新函数向模块中添加新函数int int open(struct open(struct inode*inode,struct inode*inode,struct file*filp)file*filp)MOD_INC_USE_COUNT;MOD_INC_USE_COUNT;/增加该模块的用户数目增加该模块的用户数目 printk(This printk(This module module is is in in open!n);open!n);return 0;return 0;模块编程
26、实验模块编程实验 _ 19 _ 19 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第十九页,共二十六页 void void void void release(struct release(struct release(struct release(struct inode*inode,struct inode*inode,struct inode*inode,struct inode*inode,struct file*filp)file*filp)file*filp)file*filp)MOD_DEC_USE_COUNT;MOD_DEC_USE_COUNT;MOD_DEC_USE_CO
27、UNT;MOD_DEC_USE_COUNT;/该该该该模模模模块块块块的的的的用用用用户户户户数数数数目目目目减减减减1 1 1 1 printk(This module is in release!n);printk(This module is in release!n);printk(This module is in release!n);printk(This module is in release!n);return 0;return 0;#ifdef DEBUG#ifdef DEBUG#ifdef DEBUG#ifdef DEBUG 模块编程实验模块编程实验 _ 20 _ 20
28、 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十页,共二十六页 printk(release(%p,%p)n,inode,filp);printk(release(%p,%p)n,inode,filp);printk(release(%p,%p)n,inode,filp);printk(release(%p,%p)n,inode,filp);#endif#endif#endif#endif int int int int read(struct read(struct read(struct read(struct inode*inode,struct inode*inode,stru
29、ct inode*inode,struct inode*inode,struct file*filp,char*buf,int count)file*filp,char*buf,int count)file*filp,char*buf,int count)file*filp,char*buf,int count)int leave;int leave;int leave;int leave;if(verify_area(VERIFY_WRITE,buf,count)=DEFAULT)if(verify_area(VERIFY_WRITE,buf,count)=DEFAULT)if(verify
30、_area(VERIFY_WRITE,buf,count)=DEFAULT)if(verify_area(VERIFY_WRITE,buf,count)=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-)模块编程实验模块编程实验 _ 21 _ 21 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十一页,共二十六页 _ _put
31、_user(1,buf,1);_ _put_user(1,buf,1);buf+;buf+;buf+;buf+;return count;return count;return count;return count;Int Int Int Int write(struct write(struct write(struct write(struct inode*inode,struct inode*inode,struct inode*inode,struct inode*inode,struct file*filp,const char*buf,int count)file*filp,con
32、st char*buf,int count)file*filp,const char*buf,int count)file*filp,const char*buf,int count)return count;return count;return count;return count;模块编程实验模块编程实验 _ 22 _ 22 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十二页,共二十六页6.4.4 6.4.4 模块的测试模块的测试#mknod#mknod /dev/moduledev/dev/moduledev c c major major minor minor rootli
33、nux rootlinux/#cat/#cat/proc/modules/proc/modules|awk awk$2=$2=moduledev moduledev print$1print$1模块编程实验模块编程实验 _ 23 _ 23 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十三页,共二十六页#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include main()main()main
34、()main()int i,testmoduledev;int i,testmoduledev;int i,testmoduledev;int i,testmoduledev;char buf10;char buf10;char buf10;char buf10;testmoduledev=open(/dev/moduledev,O_RDWR);testmoduledev=open(/dev/moduledev,O_RDWR);testmoduledev=open(/dev/moduledev,O_RDWR);testmoduledev=open(/dev/moduledev,O_RDWR);
35、if(testmoduledev=if(testmoduledev=if(testmoduledev=if(testmoduledev=1)1)1)1)模块编程实验模块编程实验 _ 24 _ 24 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十四页,共二十六页 printf(Cant open the file!n);printf(Cant open the file!n);printf(Cant open the file!n);printf(Cant open the file!n);exit(0);exit(0);exit(0);exit(0);read(testmodulede
36、v,buf,10);read(testmoduledev,buf,10);read(testmoduledev,buf,10);read(testmoduledev,buf,10);for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)printf(%dn,bufi);printf(%dn,bufi);printf(%dn,bufi);printf(%dn,bufi);close(testmoduledev);close(testmoduledev);return 0;return 0;模块编程实验模块编程实验 _ 25 _ 25 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十五页,共二十六页模块编程实验模块编程实验 _ 26 _ 26 成都信息工程学院成都信息工程学院 徐虹徐虹本讲稿第二十六页,共二十六页