freeBSD核心模組編寫初級
預備知識:
freeBSD模組事件型別:
typedef enum modeventtype {
MOD_LOAD, //模組載入使用此值
MOD_UNLOAD,//模組解除安裝使用此值
MOD_SHUTDOWN,//系統關閉使用此值
MOD_QUIESCE //模組即將解除安裝使用此值
} modeventtype_t;
在系統中註冊一個載入模組和模組事件處理程式
DECLARE_MODULE(name, data, sub, order)
name:模組的名字
data:是一個moduledata_t型別的結構 並且各個欄位都進行了初始化
typedef struct moduledata
{
const char *name; /* 模組名 */
modeventhand_t evhand; /* 模組事件處理程式 typedef int (*modeventhand_t)(module_t mod, int event, void *arg); */
void *priv; /* 私有資料 */
} moduledata_t;
sub:模組所屬於的核心子系統
enum sysinit_sub_id{
SI_SUB_DRIVERS 裝置驅動程式子系統
.....
}
order: 模組在子系統中初始化次序
enum sysinit_elem_order {
SI_ORDER_FIRST = 0x0000000, /* first*/
SI_ORDER_SECOND = 0x0000001, /* second*/
SI_ORDER_THIRD = 0x0000002, /* third*/
SI_ORDER_FOURTH = 0x0000003, /* fourth*/
SI_ORDER_MIDDLE = 0x1000000, /* 中間的某個位置 */
SI_ORDER_ANY = 0xfffffff /* last*/
};
過程:
(1)編寫Makefile如下
KMOD = netlink #模組名
SRCS=netlink.c #編譯的c檔案
.include <bsd.kmod.mk>
(2)寫c程式碼netlink.c
#include <sys/param.h> #include <sys/module.h> #include <sys/kernel.h> #include <sys/systm.h> static int test_handler(struct module *module, int event, void *arg) { int e = 0; switch (event) { case MOD_LOAD://模組載入執行 printf("hello first module \n");//在dmesg 中檢視訊息列印 break; case MOD_UNLOAD://模組解除安裝執行 uprintf("bye first module\n"); //可在終端檢視訊息列印 break; default: e = EOPNOTSUPP; break; } return(e); } static moduledata_t test_conf = { "netlink", /* 模組名 */ test_handler, /* 處理事件 */ NULL /* extra data */ }; //定義模組 DECLARE_MODULE(netlink, test_conf, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
(3)載入模組
make load 或者 kldload ./netlink.ko
(4)解除安裝模組
make unload或者 kldunload netlink.ko