1. 内核模块
通常我们说的内核模块全称是可加载内核模块(loadable kernel modules)。如果没有 内核模块的话,那么对Linux这种单内核系统而言,所有模块需要全部放在内存中,而且每次更改都需要重新编译,重新启动系统,有了它则避免了以上问题,可以在需要的时候加载内核中。
2. 内核模块基本结构
基本结构包括,头文件,模块信息,初始化及退出清理模块函数。
//hello world
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
/*模块信息*/
MODULE_AUTHOR("newand");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Hello Module");
/*初始化模块*/
static int __init hello_init(void)
{
//netfilter注册模块函数
//nf_register_hook(&nf_out_modify);
printk("<1>Hello World module init\n");
return 0;
}
/*清理模块*/
static void __exit hello_exit(void)
{
//netfilter卸载模块函数
//nf_unregister_hook(&nf_out_modify);
printk("<1>Hello World module exit\n");
}
/*模块初始化入口*/
module_init(hello_init);
/*模块卸载时出口*/
module_exit(hello_exit);
第2行:所有模块必须有,内核模块的标志
第3行:常用内核函数
第4行:头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
第7-9行:内核模块信息
第11-18行:加载内核模块时由第28行进入,调用此处init。
第20-25行:模块退出时进行的清理工作在这里调用处理。
3. makefile
#Makefile2.6 in ubuntu
obj-m += hellomod.o # 产生hellomod 模块的目标文件
CURRENT_PATH := $(shell pwd) #模块所在的当前路径
LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) #Linux内核源代码的绝对路径
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理
4. 运行
运行主要涉及到四个命令
insmod:加载模块(root运行)
rmmod:卸载模块(root运行)
dmesg:查看内核信息(调试时,printk的信息会显示在此)
lsmod:显示所有已加载模块
5. Linux编程时常用命令
编程时需要查找某个函数,某个结构体,字符串等信息,除了搜索引擎外,还可以使用以下几个命令。
4.1 man 可以查看一些方法的使用
如:
~$ man printf
4.2 locate 可以定位到输入文件名的位置,它搜索一个系统每日更新的包含文件信息的数据库。
如:
~$ locate skbuff.c
/home/***/文档/linux network program/src file/19/sip_skbuff.c
/home/***/ns/nsc-0.5.3/linux-2.6/net/core/skbuff.c
/home/***/ns/nsc-0.5.3/linux-2.6.18/net/core/skbuff.c
4.3 grep -n '查找字符串' 位置
如果想要查找某个字符串在哪些文件中出现过,可以用这个命令,比较方便。
如:
~$ grep -n 'NF_IP6_PRI_FIRST' /usr/include/linux/*
/usr/include/linux/netfilter_ipv6.h:61: NF_IP6_PRI_FIRST = INT_MIN,
参考
[1] linux内核之旅,http://www.kerneltravel.net/?page_id=8
[2] http://en.wikipedia.org/wiki/Loadable_kernel_module
[3] Peter Jay Salzman ,Michael Burian ,Ori Pomerantz 《The Linux Kernel Module Programming Guide 》
注:[3]这本书值得看一下。