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