为啥要建立联系?
前提是有些模块需要动态卸载,如果其它模块需要引用它导出的符号,那么就会产生错误。
如何建立联系?
在第一节我们知道了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;
}