驱动模块加载过程分析
/****************************************************************************************************************/
insmod依赖 kernel/module.c 中的 sys_init_module();系统调用。
int sys_init_module()
{
权限检查
/* Must have permission */
if (!capable(CAP_SYS_MODULE))
return -EPERM;
检测加载模块数
/* Only one module load at a time, please */
if (down_interruptible(&module_mutex) != 0)
return -EINTR;
启动load_module();分配内存(依赖于vmalloc();函数) 并且copy模块到内存并进行重定位
/* Do all the hard work */
mod = load_module(umod, len, uargs);
if (IS_ERR(mod)) {
up(&module_mutex);
return PTR_ERR(mod);
}
中间是通过内核符号表解析模块中的内核引用
/* Flush the instruction cache, since we've played with text */
if (mod->module_init)
flush_icache_range((unsigned long)mod->module_init,
(unsigned long)mod->module_init
+ mod->init_size);
flush_icache_range((unsigned long)mod->module_core,
(unsigned long)mod->module_core + mod->core_size);
/* Now sew it into the lists. They won't access us, since
strong_try_module_get() will fail. */
spin_lock_irq(&modlist_lock);
list_add(&mod->list, &modules);
spin_unlock_irq(&modlist_lock);
/* Drop lock so they can recurse */
up(&module_mutex);
down(¬ify_mutex);
notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod);
up(¬ify_mutex);
启动模块
/* Start the module */
if (mod->init != NULL)
ret = mod->init();
启动模块失败是这么一句话。。。。。: 初始化例程失败:中止。试着保护我们不受垃圾食品的影响。
if (ret < 0) {
/* Init routine failed: abort. Try to protect us from
buggy refcounters. */
mod->state = MODULE_STATE_GOING;
synchronize_kernel();
if (mod->unsafe)
printk(KERN_ERR "%s: module is now stuck!\n",
mod->name);
else {
module_put(mod);
down(&module_mutex);
free_module(mod);
up(&module_mutex);
}
return ret;
}
/* Now it's a first class citizen! */
down(&module_mutex);
mod->state = MODULE_STATE_LIVE;
/* Drop initial reference. */
module_put(mod);
module_free(mod, mod->module_init);
mod->module_init = NULL;
mod->init_size = 0;
mod->init_text_size = 0;
up(&module_mutex);
最后返回一个0表示失败;
return 0;
/****************************************************************************************************************/