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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章