欢迎来到天天文库
浏览记录
ID:40727268
大小:440.50 KB
页数:21页
时间:2019-08-06
《实验三 模块编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验三模块编程实验内容:l设计实现一个内核模块。lproc文件系统的模块化编程。3.1模块编程3.1.1实验目的掌握Linux下内核模块的实现机制,熟练运用动态模块进行系统程序编程。3.1.2实验内容为内核设计一个简单的动态模块,并利用用户程序进行测试,之后再予以卸载。3.1.3实验原理模块是在内核空间运行的程序,实际上是一种目标文件,不能单独运行但其代码可在运行时链接到系统中作为内核的一部分运行或卸载。Linux内核模块是一个编译好的、具有特定格式的独立目标文件,用户可通过系统提供的一组与模块相关的命令将模块加载进内核,当内核
2、模块被加载后,它有如下特点:l与内核一起运行在相同的内核态和内核地址空间。l运行时与内核具有同样的特权级。l可方便地访问内核中的各种数据结构。此外,内核模块还可以很容易地被移出内核,当用户不再需要某模块功能时,可以将它从内核卸载以节省系统主存开销,配置十分灵活。一个典型的内核模块应包含如下几个部分:(1)头文件声明。头两行是模块头文件,其中module.h和init.h是必不可少的。module.h包含加载模块时需要的函数和符号定义;init.h中包含模块初始化和清理函数的定义。如果在加载时允许用户传递参数,模块中还应包含mod
3、uleparam.h头文件。(2)模块许可声明。从内核2.4.10版本开始,模块必须通过MODULE_LICENSE宏声明此模块的许可证,否则在加载此模块时会显示“kerneltainted”(内核被污染)的警告信息。从linux/module.h文件中可看到,被内核接受的许可证有GPL、GPLv2、GPLandadditionalrights、DualBSD/GPL、DualMPL/GPL、DualMIT/GPL和Proprietary。(3)初始化和清理函数声明。内核模块必须调用宏module_init和module_exi
4、t去注册初始化和清理函数。初始化和清理函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。这两个函数配对使用,例如当初始化函数申请了一个资源,那么清理函数就应释放这个资源,使得模块不留下任何副作用。除了模块初始化函数和清理函数,还可以根据需要设计编写其它函数。本实验基于2.6.26版本的内核。设计一个简单的内核模块,该模块的功能是在被加载进内核时向系统日志中写入“hello,mymodulewored!”;在模块被卸载时向系统日志写入“goodbye,unloadingmymodule.”。
5、3.1.4实验步骤设计一个内核模块,首先要设计模块代码,对其进行编译形成模块程序(.ko文件,2.6以前内核版本为.o文件),然后就可以加载和卸载模块了。当模块加载后,就可以如同使用系统调用一样调用模块中的相关函数了。内核模块是否加载成功可以通过lsmod命令观察。模块加载成功后,使用lsmod命令输出的模块列表中会有相应的模块项目(模块程序名);如果模块初始化函数中通过printk函数向内核日志写入信息的话,此时还也可以使用命令dmesg查看内核日志,观察其变化情况;或者查看/proc/modules文件,检查文件内容是否包含
6、相应的模块项目。同理,在卸载时也同时观察三者的变化。步骤一:设计内核模块程序。并将其放置于一个没有Makefile文件的目录,如/home/module中。内核模块代码如下(mymodules.c):#include/*必须要包含的头文件*/#include#include/*必须要包含的头文件*/staticintmymodule_init(void)//模块初始化函数{printk("hello,mymodulewored!");
7、/*输出信息到内核日志*/return0;}staticvoidmymodule_exit(void)//模块清理函数{printk("goodbye,unloadingmymodule.");/*输出信息到内核日志*/}module_init(mymodule_init);//注册初始化函数module_exit(mymodule_exit);//注册清理函数MODULE_LICENSE("GPL");//模块许可声明步骤二:在模块源程序的相同目录下创建Makefile文件。Makefile文件的内容如下:ifneq($(
8、KERNELRELEASE),)obj-m:=mymodules.o#obj-m指编译成外部模块elseKERNELDIR:=/lib/modules/$(shelluname-r)/build#定义一个变量,指向内核目录PWD:=$(shellpwd)modu
此文档下载收益归作者所有