模块是如何依赖到一起的

文章讲述了Linux内核模块中如何管理相互依赖的模块。通过`source_list`和`target_list`结构体,建立模块间的联系,防止动态卸载时产生错误。`add_module_usage`函数用于在找到对应符号时创建连接,确保模块间的引用正确。若内存不足,可能会导致加载失败。
摘要由CSDN通过智能技术生成
为啥要建立联系?

前提是有些模块需要动态卸载,如果其它模块需要引用它导出的符号,那么就会产生错误。

如何建立联系?

在第一节我们知道了kernel module中有:

//用于管理相互依赖的模块
/* What modules depend on me? */
struct list_head source_list;
/* What modules do I depend on? */
struct list_head target_list;

这么两个对象,它们就是用于建立那些相互引用对方导出符号的模块之间的连接。

当调用resolve_symbol找到对应的符号时,同时也会调用add_module_usage利用上面的两个对象,将它们建立好联系。

static int add_module_usage(struct module *a, struct module *b)
{
	struct module_use *use;

	pr_debug("Allocating new usage for %s.\n", a->name);
	use = kmalloc(sizeof(*use), GFP_ATOMIC);
	if (!use) {
		pr_warn("%s: out of memory loading\n", a->name);
		return -ENOMEM;
	}

    //建立联系
	use->source = a;
	use->target = b;
	list_add(&use->source_list, &b->source_list);
	list_add(&use->target_list, &a->target_list);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值