操作系统实验---内核模块实现

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

实验报告

实验题目:内核模块实现

姓名:

学号:

课程名称:操作系统

所在学院:信息科学与工程学院

专业班级:计算机

任课教师:

module_init(初始函数名);

module_exit(退出函数名 );

MODULE_LICENSE("GPL");//模块通用公共许可证

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。

4、进入管理员权限,cd到目录下。输入如下命令:

5、输入make命令以编译:

6、编译成功后,输入insmod命令安装自己的内核模块:

7、查看内核模块:

可以看到自己的time模块安装成功。

8、输入dmesg命令,找到自己的内核模块,查看日志:

也可以用dmesg |grep time快速筛选到自己的内核模块。

9、卸载内核模块,输入如下命令即可:

可以再用lsmod命令查看内核模块,以验证是否删除。

(二)实现数据包过滤功能的简单内核模块

1、编写实现该模块的程序,并将该文件命名为PackageFilter.c

#include

#include

#include

#include

#include

#include

#include

static struct nf_hook_ops nfhook;//定义nf_hook_ops结构体nfhook

static unsigned char *drop = "\x73\xef\xd3\x70";

//baidu的ip地址115.239.211.112

unsigned int hook_func( const struct nf_hook_ops *ops,

struct sk_buff *skb,

const struct net_device *in,

const struct net_device *out,

int (*okfn)(struct sk_buff*))

//钩子函数

{

struct iphdr *ip = ip_hdr(skb);//提取数据包ip首部

if(ip->saddr == *(unsigned int *)drop)//与定义ip地址进行比对

{

printk("DROP PACKET FROM %d.%d.%d.%d\n",drop[0],drop[1],drop[2],drop[3]);

//如果符合,丢弃

return NF_DROP;//返回丢弃信号

}

else//否则打印该网址

{

unsigned char *p = (unsigned char *)&(ip->saddr);

printk ("ALLOWED PACKET FROM %d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);

return NF_ACCEPT;//返回接受信号

}

}

static int __init hook_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

return 0;

}

static void __exit hook_exit(void)//退出该模块

{

nf_unregister_hook(&nfhook);

}

module_init(hook_init);

module_exit(hook_exit);

MODULE_LICENSE("Dual BSD/GPL");

2、编辑Makefile文件:

ifneq ($(KERNELRELEASE),)

obj-m:=PackageFilter.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

3、将以上两个文件(PackageFilter.c和Makefile)放在同一个目录mykernel下。

4、进入管理员权限,cd到目录下。输入如下命令:

相关文档
最新文档