设为首页 收藏本站
查看: 464|回复: 0

[经验分享] Linux实验二:Linux 内核模块测试

[复制链接]

尚未签到

发表于 2016-1-14 08:29:14 | 显示全部楼层 |阅读模式
一、实验目的
  对Linux内核模块进行了解。
二、实验内容
  创建一个内核模块,在加载和卸载模块时在内核中打印相关信息。
三、背景知识:
  一、什么是内核模块?
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithickernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。

  二、内核模块编写
编写内核模块时必须要有的两个函数 :
__init 和 __exit 是 Linux 内核的一个宏定义,使系统在初始化完成后释放该函数,并释放其所占内存。因此它的优点是显而易见的。建议在编写入口函数和出口函数时采用后面的方法。
还有,在内核编程时所用的库函数和在用户态下的是不一样的。如模块程序中使用的printk函数,对应于用户态下的printf函数,printk 是内核态信息打印函数,功能和printf类似但 printk还有信息打印级别。
加载模块和卸载模块:
1>module_init(hello_init)
a. 告诉内核你编写模块程序从那里开始执行。
b.module_init() 函数中的参数就是注册函数的函数名。
2>module_exit(hello_exit)
a. 告诉内核你编写模块程序从那里离开。
b.module_exit() 中的参数名就是卸载函数的函数名。

三、内核模块编译:
第一步:模块源代码,如果使用vi更好,直接wq保存退出即可!
第二步:写一个Makefile文件。
  Makefile文件所做的工作是编译生成.o,.ko等模块相关文件!
四、实验步骤:
  一、编写模块代码HelloWorld.c
  二、编写Makefile文件
  三、编译模块
  四、加载卸载HelloWorld模块
  五、查看模块信息
  六、卸载HelloWorld模块
  七、查看模块信息

五、实验演示:
  
  进入Linux终端控制台,创建HelloWorld.c文件,可用vi HelloWorld.c创建并编写内容。

  // HelloWorld.c
DSC0000.jpg
  2-1 模块HelloWorld代码
  创建Makefile文件(注意文件名大小写区分)
DSC0001.jpg
  2-2模块HelloWorldMakefile配置文件
  注意:
   “make –C/lib ......”语句
  make语句前面的空格为制表符(按tab键),-C 中的C为大写,不能为小写
  保存好后在终端当前目录执行make操作进行编译,如下图:
DSC0002.jpg
  2-3对模块HelloWorld执行make操作
  编译好后会生成许多文件:
DSC0003.jpg
  2-4模块HelloWorld编译后的内容
  
  最后对模块进行加载和卸载测试:
  终端在当前目录下,输入命令 insmod ./HelloWorld.ko
  输入命令 lsmod,能找到名为HelloWorld 的模块,说明模块已经加载;
DSC0004.jpg
  2-5模块HelloWorld已经加载到内核
  
  输入命令 dmesg,查看最后一行,会有模块加载时调用的函数输出;
  输入命令 rmmod HelloWorld ,卸载模块(注意与加载时不同),然后输入lsmod,已经找不到HelloWorld模块,说明模块已经卸载;
  输入命令 dmesg,查看模块卸载是调用的函数输出。
  
DSC0005.jpg
  图2-6模块HelloWorld加载以及卸载时内核模块的记录
六、实验小结:
lMakefile 是一种脚本,这种脚本主要是用于多文件的编译

lmake 程序可以维护具有相互依赖性的源文件,但某些文件发生改变时,它能自动识别出,并只对相应文件进行自动编译。
上述简单例子中的Makefile文件的内容为:obj-m:=helloworld.o,在这我要提醒大家,在网上有许多种Makefile文件的写法,但都太麻烦了,如果写的是内核模块,obj-m:=*.o足矣(*是你的模块文件名,比如上面的hellworld.c文件).之后使用
make -Wall -C /lib/modules/`uname -r`/build M=`pwd`modules
命令生成helloworld.o,helloworld.ko等文件,有的人直接使用
make -C /lib/modules/`uname -r`/build M=`pwd` modules
中间省略了-Wall,Wall可以看成 W+all,而W代表Warning,所以使用 -Wall 即是显示所有警告!

l加载模块命令:insmod helloworld.ko
l卸载模块命令:rmmod helloworld.ko
  查看模块信息:dmesg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-164111-1-1.html 上篇帖子: linux_20 Advanced Commands for Linux Experts 下篇帖子: Linux cp命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表