Linux内核模块编程

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]这本书值得看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值