THIS_MODULE的一点见解

module加载过程

在驱动程序的编写过程中,我们会碰到.owner = THIS_MODULE;这样的语句,但是却不知道这究竟是什么意思,下面一段代码来大概解释下


#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,		//模块正在被卸载
};


例如我们上面的程序运行之后得到的结果就是
#insmod by_module_test.ko
this module: bf000420 == bf000420
module state: 1
module name : by_module_test
module name : by_module_test
#rmmod by_module_test
module state: 2

其中 module state分别就会对应上面枚举变量的后两个

extern struct module __this_module;
#define THIS_MODULE (&__this_module)

这两句就将 __this_module的地址宏定义给 THIS_MODULE,所以执行结果会出现 this module: bf000420 == bf000420

也就是在进行module初始化的时候,系统会分配一个局部的module结构体,然后对应当前的模块信息进行填充,之后放入链表中去,此时THIS_MODULE就代表了当前被加载的模块的信息


list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list)
	printk("module name: %s\n", mod->name);

THIS_MODULE->list.prev会将当前已经加载的模块地址递交给 mod,由于当前只有一个模块,所以只有一个显示项目,但是如果之前加载过部分模块,则运行此模块加载的时候会将全部之前加载过的模块名称给显示出来,如果加上 state选项进行显示就会看到之前加载上去的模块为0,也就是已加载状态
使用 rmmod的时候,系统就会调用 delete_module来进行模块的删除,同时置 state位为 GOING模式,也就是正在卸载。
对应运行结果中的 module state: 2

你可能感兴趣的:(linux,驱动,THIS_MODULE)