实验三 模块编程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验三 模块编程 实验内容: 设计实现一个内核模块。 proc文件系统的模块化编程。 3.1 模块编程 3.1.1 实验目的 掌握Linux下内核模块的实现机制,熟练运用动态模块进行系统程序编程。 3.1.2 实验内容 为内核设计一个简单的动态模块,并利用用户程序进行测试,之后再予以卸载。 3.1.3 实验原理 模块是在内核空间运行的程序,实际上是一种目标文件,不能单独运行但其代码可在运行时链接到系统中作为内核的一部分运行或卸载。Linux内核模块是一个编译好的、具有特定格式的独立目标文件,用户可通过系统提供的一组与模块相关的命令将模块加载进内核,当内核模块被加载后,它有如下特点: 与内核一起运行在相同的内核态和内核地址空间。 运行时与内核具有同样的特权级。 可方便地访问内核中的各种数据结构。 此外,内核模块还可以很容易地被移出内核,当用户不再需要某模块功能时,可以将它从内核卸载以节省系统主存开销,配置十分灵活。 一个典型的内核模块应包含如下几个部分: (1)头文件声明。头两行是模块头文件,其中module.h和init.h是必不可少的。module.h包含加载模块时需要的函数和符号定义;init.h中包含模块初始化和清理函数的定义。如果在加载时允许用户传递参数,模块中还应包含moduleparam.h头文件。 (2)模块许可声明。从内核2.4.10版本开始,模块必须通过MODULE_LICENSE宏声明此模块的许可证,否则在加载此模块时会显示“kernel tainted”(内核被污染)的警告信息。从linux/module.h文件中可看到,被内核接受的许可证有GPL、GPL v2、GPL and additional rights、Dual BSD/GPL、Dual MPL/GPL、Dual MIT/GPL和Proprietary。 (3)初始化和清理函数声明。内核模块必须调用宏module_init和module_exit去注册初始化和清理函数。初始化和清理函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。这两个函数配对使用,例如当初始化函数申请了一个资源,那么清理函数就应释放这个资源,使得模块不留下任何副作用。除了模块初始化函数和清理函数,还可以根据需要设计编写其它函数。 本实验基于2.6.26版本的内核。设计一个简单的内核模块,该模块的功能是在被加载进内核时向系统日志中写入“hello,my module wored!”;在模块被卸载时向系统日志写入“goodbye,unloading my module.”。 3.1.4 实验步骤 设计一个内核模块,首先要设计模块代码,对其进行编译形成模块程序(.ko文件,2.6以前内核版本为.o文件),然后就可以加载和卸载模块了。当模块加载后,就可以如同使用系统调用一样调用模块中的相关函数了。 内核模块是否加载成功可以通过lsmod命令观察。模块加载成功后,使用lsmod命令输出的模块列表中会有相应的模块项目(模块程序名);如果模块初始化函数中通过printk函数向内核日志写入信息的话,此时还也可以使用命令dmesg 查看内核日志,观察其变化情况;或者查看/proc/modules 文件,检查文件内容是否包含相应的模块项目。同理,在卸载时也同时观察三者的变化。 步骤一:设计内核模块程序。并将其放置于一个没有Makefile文件的目录,如/home/module中。 内核模块代码如下(mymodules.c): #include linux/init.h /*必须要包含的头文件*/ #include linux/kernel.h #include linux/module.h /*必须要包含的头文件*/ static int mymodule_init(void) //模块初始化函数 { printk(hello,my module wored! \n); /*输出信息到内核日志*/ return 0; } static void mymodule_exit(void) //模块清理函数 { printk(goodbye,unloading my module.\n); /*输出信息到内核日志*/ } module_init(mymodule_init); //注册初始化函数 module_exit(mymodule_exit); //注册清理函数 MODULE_LICENSE(GPL); //模块许可声明 步骤二:在模块源程序的相同目录下创建Makefile文件。 Makefile文件的内容如下: ifneq ($(KERNELRELEASE),) obj-m := mymodules.o #ob

文档评论(0)

abf4675328 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档