1. 程式人生 > >freeBSD核心模組編寫初級

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