内核模块开发文档.doc
文本预览下载声明
内核模块开发
一 内核模块开发
1.1 内核模块与应用程序区别
1.1.1 执行过程中的不同:
大多数小规模及中规模应用程序是从头到尾执行单个任务,而模块却只是预先注册自己以便服务于将来的某个请求,然后它的初始化函 数就立即结束。换言之,模块初始化函数的任务就是为以后调用模块函数预先做准备。最后在退出时,应用程序可以不管资源的释放或者其他的清除工作。但是模块 必须仔细撤销初始化函数所做的一切,否则,在系统重新启动之前某些东西就会残留在系统中。
调用函数的不同:
应用程序可以调用它未定义的函数,因为应用程序可以在连接过程中解析外部引用从而使用适当的函数库。可是反观模块,它仅仅被连接到内核,因此只能调用由内核导出的函数,不存在任何可连接的函数库。
Yum install gcc -y
安装make
Yum install make -y
安装内核头文件,编译内核
yum install Kernel-headers kernel-devel -y
1.3 简单的内核测试模块代码
#include linux/init.h
#include linux/module.h
/*版权声明*/
MODULE_LICENSE(Dual BSD/GPL);
/*模块初始化*/
/*
加载模块的时候执行该函数
*/
static int hello_init(void)
{ ? ? ?
printk(KERN_ALERT Hello, World\n);
? ? ?return 0;
}
/*
模块被卸载时调用该函数
*/
static int hello_exit(void)
{ ? ? ?
printk(KERN_ALERT Goodbye, cruel world\n);
}
module_init(hello_init); //模块加载
module_exit(hello_exit); //模块卸载
MODULE_AUTHOR(chen bin); //声明模块作者
MODULE_DESCRIPTION(flowhijack DEMO); //模块名称
MODULE_VERSION(0.0.1); //模块版本号
MODULE_ALIAS(ex17.2); //模块别名
以下是具体的特殊宏的说明
????????????????????????? 特殊宏 ??????????????????????? 说明 ??????????????????? MODULE_AUTHOR(author) 描述模块作者 MODULE_DESCRIPTION(description) 说明模块用途的简短描述 MODULE_VERSION(version_string) 代码修订号 MODULE_DEVICE_TABLE(table_info) 告诉用户空间模块所支持的设备 MODULE_ALIAS(alternate_name) 模块的别名 insmod hello.ko
卸载模块 rmmod hello.ko
查看模块信息 modinfo hello.ko
查看是否加载成功 lsmod | grep hello.ko
二 netfilter架构
2.1 概述
Netfilter为多种网络协议(IPv4、IPv6、ARP等)各提供了一套钩子函数。
在IPv4中定义了5个钩子函数,这些钩子函数在数据包流经协议栈的5个关键点被调用。
这就像有5个钓鱼台,在每个钓鱼台放了一个鱼钩(钩子函数),把经过的数据包钓上来,
然后根据自定义的规则,来决定数据包的命运:可以原封不动的放回IPv4协议,继续向上层递交;可以进行修改,再放回IPv4协议;也可以直接丢弃。
Netfilter主要采用连接跟踪(Connection Tracking)、包过滤(Packet Filtering)、地址转换(NAT)、包处理(Packet Mangling)四种技术。
Netfilter 的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。
IP层的五个HOOK点的位置如下图所示
[1]:NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验
和等检测), 目的地址转换在此点进行;
[2]:NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;
[3]:NF_IP_FORWARD:要转发的包通过此检测点,FORWARD包过滤在此点进行;
[4]:NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装
显示全部