Linux内核模块编程

来源:互联网 发布:cn域名ns记录 编辑:程序博客网 时间:2024/04/30 22:18

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

原创粉丝点击