实 验 报 告
实验题目:内核模块实现
姓名: 学号: 课程名称: 所在学院: 专业班级: 任课教师:
操作系统 信息科学与工程学院
计算机
实验项目名称 内核模块实现 一、实验目的与要求: 1、熟悉Linux内核模块实现过程。 2、掌握内核模块实现的方法,在Ubuntu系统上完成指定功能的内核模块。 二、实验设备及软件: 一台PC(Linux系统) 三、实验方法(原理、流程图) 1、模块的定义 模块是具有独立功能的程序它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。 2、内核模块的相关操作命令 a)加载内核模块:insmod b)卸载内核模块:rmmod c)查看内核模块:lsmod(可用grep筛选) 3、查看日志操作命令 dmesg 查看日志 dmesg|head -10 看前10行 dmesg|tail -10 看后10行 4、模块函数编写基本操作 static int __init 初始函数名(void)//初始化函数 { return 0; } static void __exit 退出函数名 (void)//退出函数 { } module_init(初始函数名); module_exit(退出函数名 );
MODULE_LICENSE(\模块通用公共许可证
5、makefile文件内容基本格式 ifneq ($(KERNELRELEASE),) obj-m:=xxx.o else
KDIR:=/lib/modules/$(shell uname -r)/build PWD:=$(shell pwd) all:
make -C $(KDIR) M=$(PWD) modules clean:
rm -rf *.o *.ko *.mod.c *.cmd *.markers *.order *.symvers .tmp_versions
endif
说明:
1) KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量。 ifneq($(KERNELRELEASE),) 判断该变量是否为空。
2) KDIR := /lib/modules/$(shell uname -r)/build 是给KDIR这个变量赋值,值为当前linux运行的内核源码。
3) 当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。
4) 我们可以把上述的Makefile文件作为一个模板,只需要改动obj-m := hello.o这条语句就可以了:obj-m=XXX.o。
四、实验过程、步骤及内容 实验内容: 1、输出内核时间的简单内核模块。 2、实现数据包过滤功能的简单内核模块(至少有数据包丢弃功能,事先熟悉Netfilter Hook),或简单的字符设备设备驱动模块,或其他有意义的内核功能模块。 实验步骤: (一)输出内核时间的简单内核模块 1、编写实现该模块的程序,并将该文件命名为time.c #include