內核模塊中__init,__exit的作用

 

內核模塊的初始化函數,撤消函數通常是這樣的形式:
        static int __init xxx-init(.....);        //函數沒有參數就寫void,init前是兩個_
        static void __exit xxx-exit(....);
        其中__init屬性標誌, 表明該段代碼位於代碼段的子段初始化段,初始化段的程序只執行一次,執行完後它所佔用的內存空間將被回收。當模塊加載時, __init屬性的函數就被執行;
          __exit修飾詞標記函數只在模塊卸載時使用,如果模塊被直接編進內核則該函數就不會被調用。如果內核編譯時沒有包含該模塊,則此標記的函數將被簡單地丟棄。
 
瞭解:
      內核中多個struct module結構體模塊的集合會形成一個鏈表,通過insmod(實際執行module_init系統調用)把本模塊插入集合,相當於插入鏈表當中。
struct module
    {
        enum module_state state;
        struct list_head list;
        char name[MODULE_NAME_LEN];
        struct module_kobject mkobj;
        struct module_param_attrs *param_attrs;
        const char *version;
        const char *srcversion;
        const struct kernel_symbol *syms;
        unsigned int num_syms;
        const unsigned long *crcs;
        const struct kernel_symbol *gpl_syms;
        unsigned int num_gpl_syms;
        const unsigned long *gpl_crcs;
        unsigned int num_exentries;
        const struct exception_table_entry *extable;
        int (*init)(void);
        void *module_init;
        void *module_core;
        unsigned long init_size, core_size;
        unsigned long init_text_size, core_text_size;
        struct mod_arch_specific arch;
        int unsafe;
        int license_gplok;
#ifdef CONFIG_MODULE_UNLOAD
        struct module_ref ref[NR_CPUS];
        struct list_head modules_which_use_me;
        struct task_struct *waiter;
        void (*exit)(void);
#endif
#ifdef CONFIG_KALLSYMS
        Elf_Sym *symtab;
        unsigned long num_symtab;
        char *strtab;
        struct module_sect_attrs *sect_attrs;
#endif
        void *percpu;
        char *args;
    };

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