modinfo()等效INSIDE内核?

时间:2011-02-03 00:34:57

标签: linux-kernel linux-device-driver kernel-module

我有两个模块A,B .A有一个全局可访问的函数f(),即f()符号被导出。 B可能偶尔想要调用f()。但是如果加载了模块A,B应该只调用f()。 B判断A是否加载的最佳方法是什么?

这个问题的b部分是否有办法检查f()是否被导出?

我不确定哪种方法更有效。

2 个答案:

答案 0 :(得分:1)

我假设您首先加载模块B,然后选择加载模块A.我的策略是在A首次初始化时让A寄存器与B一起使用一组函数。 B保持静态分配的函数指针(或指向充满函数指针的结构的指针),并提供导出的函数来注册和取消注册处理程序。当A加载时,它将其函数(或函数结构)注册到B.当A卸载时,它会注销其函数。

它可能会是这样的:

B.h

typedef int (*foo_t)(int);
int B_register_foo(foo_t);
int B_unregister_foo(foo_t);

B.c

static foo_t foo = NULL;

int B_register_foo(foo_t f) {
    if (!foo) {
        foo = f;
        return 0;
    }
    return -EFOO;
}

void B_unregister_foo(foo_t f) {
    if (foo == f)
        foo = NULL;
}

EXPORT_SYMBOL(B_register_foo);
EXPORT_SYMBOL(B_unregister_foo);

void B_maybe_call_foo(int arg) {
    return (foo) ? foo(arg) : 0;
}

A.C

static int A_foo(int arg);

static int __init init_A(void) {
    if (B_register_foo(A_foo))
        return -EFOO;
    return 0;
}

static void __exit exit_A(void) {
    B_unregister_foo(A_foo);
}

答案 1 :(得分:0)

如果B使用A的至少一个符号,那么在加载B时,提供所需符号的模块(换句话说,像A这样的模块)也已加载。

  

这个问题的b部分是否有办法检查f()是否被导出?

如果符号不可用,您将无法加载请求它的模块(B)。