#include <linux/module.h> MODULE_LICENSE("GPL"); static int __init hellow_init(void) { struct module *mod; printk("this module: %p == %p\n", &__this_module, THIS_MODULE); printk("module state: %d\n", THIS_MODULE->state); printk("module name : %s\n", THIS_MODULE->name); list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list) printk("module name: %s\n", mod->name); return 0; } static void __exit hellow_exit(void) { printk("module state: %d\n", THIS_MODULE->state); } module_init(hellow_init); module_exit(hellow_exit);
在我们执行insmod module_name的时候系统实际上调用的是init_module,在init_module中调用load_module然后将用户传入的内核文件创建为一整个内核模块,返回一个module结构体,系统即以此表示嵌入的模块
struct module { enum module_state state; /* Member of list of modules */ struct list_head list; /* Unique handle for this module */ char name[MODULE_NAME_LEN]; /*省略下面的内容*/ }
state是一个枚举型变量,代表模块的状态
enum module_state { MODULE_STATE_LIVE, //模块存活,也就是已经加载 MODULE_STATE_COMING, //模块正在加载 MODULE_STATE_GOING, //模块正在被卸载 };
extern struct module __this_module; #define THIS_MODULE (&__this_module)
也就是在进行module初始化的时候,系统会分配一个局部的module结构体,然后对应当前的模块信息进行填充,之后放入链表中去,此时THIS_MODULE就代表了当前被加载的模块的信息
list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list) printk("module name: %s\n", mod->name);