linux内核模块实验2学时

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一个内核模块实验
一:预习要求:
(1 )做本实验之前,请复习相关内核模块知识。

(2 )请了解内核模块的编写、编译及安装与卸载方法。

(3 )请学习内核打印函数printk() 的用法。

(4 )请复习Makefile 文件的编写。

二:实验目的:
(1 )掌握内核模块的组成部分。

(2 )掌握内核模块的编译、安装与卸载方法。

(3 )学会查看内核模块的信息。

三:实验任务:
编写一个内核模块module,向外导出两个函数,分别是“求累积和”和“求阶乘”功能。

编写另两个内核模块module1、module2,分别使用上面module模块中的函数,实现计算。

注意路径清晰,分别在三个目录下编写。

四:实验原理及方法:
Linux 内核模块(LKM )是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。

它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。

如果没有内核模块,就不得不反复编译生成操作系统的内核镜像来加入新功能,当附加的功能很多时,还会使内核变得臃肿。

一个Linux 内核模块主要由以下几个部分组成:
(1) 模块加载函数( 必须) :当通过insmod 或modprobe 命令加载内核模块时,模块的加(1) 模块加载函数( 必须) :当通过insmod 或modprobe 命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块相关初始化工作。

(2) 模块卸载函数(必须):当通过rmmod 命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

(3) 模块许可证声明(必须):模块许可证(LICENCE )声明描述内核模块的许可权限,如果不声明LICENCE, 模块被加载时将收到内核被污染的警告。

大多数情况下内核模块应遵循GPL 兼容许可权。

L inux2.6内核模块最常见的是
以MODULE_LICENSE( “Dual BSD/GPL ”) 语句声明模块采用BSD/GPL 双LICENSE 。

(4) 模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量。

(5) 模块导出符号(可选):内核模块可以导出符号(symbol, 对应于函数或变量) ,这样其他模块可以使用本模块中的变量或函数。

(6) 模块作者等信息声明(可选)。

一个内核模块至少包含两个函数,模块被加载时执行的初始化函数init_module() 和模块被卸载时执行的结束函数cleanup_module() 。

在最新内核稳定版本 2.6 中,两个函数可以起任意的名字,通过宏module_init() 和module_exit() 注册调用。

五:实验步骤:
1.创建目录modparm,在modparm下创建module1和module2目录
(同学也可以创建不同的目录,因为每个模块都有自己的Makefile 文件,所以每个Makefile必须在不同的目录下)。

在modparm存放modtest模块,在module1下存放module1模块,在module2下存放module2模块。

我的电脑上如下:
2,编写模块的源程序和其Makefile文件
(1)modtest.c的清单如下:
modtest.的Makefile如下:
(2)module1.c清单如下:
module1的Makefile如下:
(3) module2.c清单如下:
Module2的Makefile如下:
3 编译模块
(1)把生成modtest.ko模块时生成的Module.symvers放到module1文件夹中。

这样编译module1时,符号信息就会自动链接进去了。

(2)分别执行make命令,编译modtest.c、module1.c、module2.c
c
4 安装模块
5查看模块lsmod
查看安装是否成功,下图中可看到module1和module2的使用者数量为0,而modtest被module1和module2使用,因此其使用者数量为2。

6 看模块输出信息
7 卸载模块rmmod.因为modtest被module1和module2使用,所以必须先卸载module1和module2,最后卸载modtest。

相关文档
最新文档