原文: http://hi.baidu.com/woaimuxiaoyizhong/blog/item/909cbb7b847913e10ad187f5.html
结构体structmodule在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释:
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; };
#include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { unsigned int cpu = get_cpu(); struct module *mod; printk(KERN_ALERT "this module: %p==%p\n", &__this_module, THIS_MODULE ); printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state ); printk(KERN_ALERT "module name: %s\n", THIS_MODULE->name ); list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list ) printk(KERN_ALERT "module name: %s\n", mod->name ); return 0; } static void hello_exit(void) { printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state ); } module_init(hello_init); module_exit(hello_exit);