1 代碼是一個完整的 "hello world"模塊:
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT "Hello, world\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT "Goodbye, cruel world\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
這個模塊定義了兩個函數, 一個在模塊加載到內核時被調用( hello_init )以及 一個在模塊被去除時被調用( hello_exit ). moudle_init 和 module_exit 這幾 行使用了特別的內核宏來指出這兩個函數的角色. 另一個特別的宏 (MODULE_LICENSE) 是用來告知內核, 該模塊帶有一個自由的許可證; 沒有這樣 的說明, 在模塊加載時內核會抱怨
2 核心模塊與應用程序的基本區別
(1)驅動程序類似事件驅動編程,它初始化時候,註冊一些設施,服務於系統調用
(2)應用程序運行在用戶空間,驅動程序運行在內核空間
(3)應用程序可使用標準的庫函數,而驅動程序連接到內核,只能使用內核導出的符號和函數
(4)應用程序錯誤,一般只會殺死進程,而驅動程序錯誤,會造成系統不穩定,或者崩潰
(5)應用程序擁有很大的棧空間,而內核棧很小,一般只有4KB
3 內核中併發的來源
(1)對稱多處理器
(2)可延時機制timer、tasklet、workqueue
(3)大多數設備能夠中斷處理器,而中斷處理程序異步運行
4 當前進程
(1)asm.current.h,current
(2)linux/sched.h,struct task_struct
5 一些細節
(1)具有前綴__的函數名稱通常是接口的底層組件,應謹慎使用
(2)內核代碼不能實現浮點數運算
6 編譯和裝載模塊
(1)/proc/modules
(2)/sys/module
(3)編譯模塊
(4)Makefile
module-objs :=file1.o file2.o
obj-m := module.o
make -C /usr/src/kernels/2.6.10/ M=`pwd` modules
7 裝載和卸載模塊
(1)insmod和ld有些類似,將模塊的代碼和數據裝入內核,然後使用內核的符號表解析模塊中任何未解析的符號
(2)與鏈接器不同,內核不會修改模塊的磁盤文件,而僅僅修改內存中的副本
(3)依賴定義在kernel/module.c中的一個系統調用
(4)sys_init_module給模塊分配內核內存
(5)只有系統調用的名字前帶有sys_前綴
(7)modprobe
(8)rmmod
(9)lsmod
(10)lsusb
8 版本依賴
(1)linux/versi(2)linux/module.h
UTS_RELEASE
LINUX_VERSION_CODE
KERNEL_VERSION(major,minor, release)
9 內核符號表
(1) Linux內核頭文件提供了一個方便的方法來管理符號對模塊外部的可見性,從而減少了可能造成的名字空間污染
(2)EXPORT_SYMBOL(name);
(3)EXPORT_SYMBOL_GPL(name);
10 其他知識
(1)頭文件:函數、數據類型和變量的定義
(2)所有模塊代碼中都包含的代碼
#include<linux/module.h>
#include<linux/init.h>
module.h包含有可裝載模塊需要的大量符號和函數的定義
init.h的目的是指定初始化和清除函數
內核能夠識別的許可證
- GPL
- GPL v2
- GPL and additional rights
- Dual BSD/GPL
- Dual MPL/GPL
- Proprietary
如果一個模塊沒有地標記爲上述內核可識別的許可證,則會被假定是專有的
(3) 描述性定義
- MODULE_AUTHOR
- MODULE_DESCRIPTION
- MODULE_VERSION
- MODULE_ALIAS
- MODULE_DEVICE_TABLE
(4)模塊參數
- moduleparam.h
- module_param
- 變量的名稱、類型以及用於sysfs入口項的訪問許可掩碼
- 內核支持的模塊參數類型
- bool
- invbool
- charp
- int
- long
- short
- uint
- ulong
- ushort
- module_param_array(name, type, num, perm);
- moduleparam.h