操作系统实验内核模块实现.docx
- 文档编号:25190606
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:11
- 大小:250.38KB
操作系统实验内核模块实现.docx
《操作系统实验内核模块实现.docx》由会员分享,可在线阅读,更多相关《操作系统实验内核模块实现.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验内核模块实现
实验报告
实验题目:
内核模块实现
姓名:
学号:
课程名称:
操作系统
所在学院:
信息科学与工程学院
专业班级:
计算机
任课教师:
实验项目名称
内核模块实现
一、实验目的与要求:
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、模块函数编写基本操作
staticint__init初始函数名(void)//初始化函数
{
return0;
}
staticvoid__exit退出函数名(void)//退出函数
{
}
module_init(初始函数名);
module_exit(退出函数名);
MODULE_LICENSE("GPL");//模块通用公共许可证
5、makefile文件内容基本格式
ifneq($(KERNELRELEASE),)
obj-m:
=xxx.o
else
KDIR:
=/lib/modules/$(shelluname-r)/build
PWD:
=$(shellpwd)
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/$(shelluname-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、实现数据包过滤功能的简单内核模块(至少有数据包丢弃功能,事先熟悉NetfilterHook),或简单的字符设备设备驱动模块,或其他有意义的内核功能模块。
实验步骤:
(一)输出内核时间的简单内核模块
1、编写实现该模块的程序,并将该文件命名为time.c
#include
#include
#include
#include
structtimespectm;
staticint__inittime_init(void)//模块初始函数
{
printk(KERN_INFO"currentkerneltimeis");//显示当前的时间
tm=current_kernel_time();
printk(KERN_INFO"tm->tv_sec:
%ld\ttm->tv_nsec:
%ld\t",tm.tv_sec,tm.tv_nsec);
return0;
}
staticvoid__exittime_exit(void)//模块退出函数
{
printk(KERN_INFO"youremovethetimemodule");//当卸载模块后的提示
}
module_init(time_init);
module_exit(time_exit);
MODULE_LICENSE("GPL");
2、编辑Makefile文件:
ifneq($(KERNELRELEASE),)
obj-m:
=time.o
else
KDIR:
=/lib/modules/$(shelluname-r)/build
PWD:
=$(shellpwd)
all:
make-C$(KDIR)M=$(PWD)modules
clean:
rm-rf*.o*.ko*.mod.c*.cmd*.markers*.order*.symvers.tmp_versions
Endif
3、将以上两个文件(time.c和Makefile)放在同一个目录mykernel下。
4、进入管理员权限,cd到目录下。
输入如下命令:
5、输入make命令以编译:
6、编译成功后,输入insmod命令安装自己的内核模块:
7、查看内核模块:
可以看到自己的time模块安装成功。
8、输入dmesg命令,找到自己的内核模块,查看日志:
也可以用dmesg|greptime快速筛选到自己的内核模块。
9、卸载内核模块,输入如下命令即可:
可以再用lsmod命令查看内核模块,以验证是否删除。
(二)实现数据包过滤功能的简单内核模块
1、编写实现该模块的程序,并将该文件命名为PackageFilter.c
#include
#include
#include
#include
#include
#include
#include
staticstructnf_hook_opsnfhook;//定义nf_hook_ops结构体nfhook
staticunsignedchar*drop="\x73\xef\xd3\x70";
//baidu的ip地址115.239.211.112
unsignedinthook_func(conststructnf_hook_ops*ops,
structsk_buff*skb,
conststructnet_device*in,
conststructnet_device*out,
int(*okfn)(structsk_buff*))
//钩子函数
{
structiphdr*ip=ip_hdr(skb);//提取数据包ip首部
if(ip->saddr==*(unsignedint*)drop)//与定义ip地址进行比对
{
printk("DROPPACKETFROM%d.%d.%d.%d\n",drop[0],drop[1],drop[2],drop[3]);
//如果符合,丢弃
returnNF_DROP;//返回丢弃信号
}
else//否则打印该网址
{
unsignedchar*p=(unsignedchar*)&(ip->saddr);
printk("ALLOWEDPACKETFROM%d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);
returnNF_ACCEPT;//返回接受信号
}
}
staticint__inithook_init(void)//hook注册函数
{
nfhook.hook=hook_func;//关联定义的函数
nfhook.hooknum=NF_INET_PRE_ROUTING;//说明hook点
nfhook.pf=PF_INET;//说明处理协议是什么,ipv4为PF_INET
nfhook.priority=NF_IP_PRI_FIRST;//说明优先级
nf_register_hook(&nfhook);//注册hook
return0;
}
staticvoid__exithook_exit(void)//退出该模块
{
nf_unregister_hook(&nfhook);
}
module_init(hook_init);
module_exit(hook_exit);
MODULE_LICENSE("DualBSD/GPL");
2、编辑Makefile文件:
ifneq($(KERNELRELEASE),)
obj-m:
=PackageFilter.o
else
KDIR:
=/lib/modules/$(shelluname-r)/build
PWD:
=$(shellpwd)
all:
make-C$(KDIR)M=$(PWD)modules
clean:
rm-rf*.o*.ko*.mod.c*.cmd*.markers*.order*.symvers.tmp_versions
endif
3、将以上两个文件(PackageFilter.c和Makefile)放在同一个目录mykernel下。
4、进入管理员权限,cd到目录下。
输入如下命令:
5、输入make命令以编译:
6、编译成功后,输入insmod命令安装自己的内核模块,再查看内核模块:
可以看到自己的time模块安装成功:
7、输入dmesg命令,找到自己的内核模块,查看日志:
(截取部分结果)
8、卸载内核模块,输入如下命令即可:
可以再用lsmod命令查看内核模块,以验证是否删除。
五、实验数据(现象)处理分析
实验现象在上面的实验步骤中已有详细说明,这里只给出实验结果:
1、输出内核时间
2、数据包过滤
六、实验结论
通过本次实验,我基本熟悉了Linux内核模块实现流程——先编写相关模块代码,编写makefile文件,编译,安装模块,查看模块,查看日志,卸载模块。
同时对Netfilter框架有了一定的了解。
明白了Netfilter的基本工作原理,和hook函数的一些简单的编写。
同时验证了编写的内核模块程序,完成了实验要求的目标。
七、教师批阅意见:
成绩评定:
教师签字:
年月日
八、备注:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 内核 模块 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)