Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1484203
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2014-01-09 14:31:48

结构体struct  module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一部分。
内核中对应的系统调用为kernel/module.c中如下函数:
SYSCALL_DEFINE3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs)
函数中调用 mod = load_module(umod, len, uargs); 把用户空间传入的整个内核模块文件创建成一个内核模块,返回一个struct  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, // 模块正在被卸载
};
load_module函数中完成模块的部分创建工作后,把状态置为MODULE_STATE_COMING。
sys_init_module函数中完成模块的全部初始化工作后(包括把模块加入全局的模块列表,调用模块本 身的初始化函数),把模块状态置为MODULE_STATE_LIVE。
当使用rmmod工具卸载模块时,会调用系统调用delete_module,会把模块的状态置为MODULE_STATE_GOING。
这是模块内部维护的一个状态。

所有的内核模块都通过list成员,被维护在一个全局链表中。链表头是一个全局变量struct module *modules。
任何一个新创建的模块,都会被加入到这个链表的头部,通过modules->next即可引用到。

name是模块的名字,一般会拿模块文件的文件名作为模块名,它是这个模块的一个标识。

宏THIS_MODULE定义如下
#define THIS_MODULE  (&__this_module),__this_module是一个struct  module变量,代表当前模块,类似current。可以通过THIS_MODULE宏来引用模块的struct  module结构。

阅读(1474) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~