#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void){
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit hello exit(void){
printk("KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
與一般user space不同,由於module運行於kernel space,所以並不連結一般的lib,所以類似printf就不能使用,只能使用printk,KERN_ALERT是一個macro,後面沒有逗點,module_init點出insmod module就運行的function,相對的module_exit則是rmmod的時候
設計module必須考量到
- 是kernel space or user space(有些驅動程式是可以為user space,但是有好有壞)
- module變數的race condition
- module必須是reentrant
- module的lifetime幾乎等同kernel,從insmod到rmmod(往往就是開機到關機),中間變數一直存在,並不隨著被服務的process結束而結束
- module的記憶體有限,堆疊不可能配置太大的空間
- module往往跟目前服務的process有很大的關係,可以使用struct task_struct中的current指向目前的process
- module的相依性處理不完全在於程式,在於管理者必須知道使用modprobe來追蹤,但是這也表示module往往跟版本有很大的關係
在headers內定義了許多macro是供給modinfo用的
- MODULE_LICENSE : 是使用GPL or BSD還是其他
- MODULE_AUTHOR : 作者資訊
- MODULE_VERSION : 版本,通常表示支援的kernel version等等
- MODULE_DESCRIPTION : 描述
- MODULE_ALIAS : alias name
- MODULE_DEVICE_TABLE : 支援的device
有些關鍵字是C語言內沒有的,例如__init跟__exit,這是給compiler用的,分別表明該函數是初始化以及結束時該呼叫的,另外還有__initdata與__exitdata表示初始配置資料的函數跟離開時後歸還空間的函數,往往用於hotplug
其他關於編譯的細節以及一些版本號碼控管有空再說,本身這是一章節談論到很多關於kernel module的觀念
這本書每章節後面都會簡單的summary這章節的內容,蠻有幫助的
沒有留言:
張貼留言