modinfo () эквивалентно ВНУТРЕННЕМУ ядру? - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть два модуля A, B. A имеет функцию f (), которая доступна глобально, т.е. экспортируется символ f ().B может захотеть иногда вызывать f ().Но B должен вызывать f () только если модуль A загружен.Как B лучше всего определить, загружен ли A?

Часть b к этому вопросу, есть ли способ проверить, экспортируется ли f ()?

Я не уверен, какой метод более эффективен.

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Я предполагаю, что вы сначала загружаете модуль B, а затем опционально модуль A. Моя стратегия заключается в том, чтобы при первой инициализации A регистрировать набор функций с помощью B.B хранит статически размещенный указатель на функцию (или указатель на структуру, полную указателей на функции) и предоставляет экспортированные функции для регистрации и отмены регистрации обработчика.Когда A загружается, он регистрирует свою функцию (или структуру функций) с B. Когда A выгружается, он отменяет регистрацию своих функций.

Это может выглядеть примерно так:

Bh

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

Bc

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;
}

Ac

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);
}
0 голосов
/ 03 февраля 2011

Если B использует хотя бы один из символов A, то к моменту загрузки B модуль, обеспечивающий требуемый символ (ы) (другими словами, такой модуль, как A), также уже загружен.*

Часть b к этому вопросу: есть ли способ проверить, экспортируется ли f ()?

Если символ недоступен, вы не сможете загрузить запрашивающий его модуль (B).

...