驱动模块加载过程分析

驱动模块加载过程分析
/****************************************************************************************************************/

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(&notify_mutex);

notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod);

up(&notify_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;

/****************************************************************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值