Как использовать find_module? - PullRequest
6 голосов
/ 20 июля 2010

Как использовать функцию ядра find_module() ядра Linux? В документации написано "должен содержать module_mutex".

  1. Значит ли это, что я должен приобрести блокировка в моем коде модуля перед поиск указателя на другого?
  2. Когда этот мьютекс заблокирован немодульный код ядра?

Context

Я отлаживаю набор модулей ядра, работающих вместе.

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

Ответы [ 2 ]

1 голос
/ 28 июля 2010

Я бы посоветовал быть немного более оборонительным в вашем коде:

#include <linux/module.h>
#include <linux/capability.h>

int do_my_work(void)
{
    struct module *mod;
    char name[MODULE_NAME_LEN];
    int ret, forced = 0;

    if (!capable(CAP_SYS_MODULE) || modules_disabled)
        return -EPERM;

    /* Set up the name, yada yada */
    name[MODULE_NAME_LEN - 1] = '\0';

    /* Unless you absolutely need an uninterruptible wait, do this. */
    if (mutex_lock_interruptible(&module_mutex) != 0) {
        ret = -EINTR;
        goto out_stop;
    }

    mod = find_module(name);
    if (!mod) {
        ret = -ENOENT;
        goto out;
    }

    if (!list_empty(&mod->modules_which_use_me)) {
        /* Debug it. */
    }

out:
    mutex_unlock(&module_mutex);
out_stop:
    return(ret);
}

module_mutex получается ядром при различных операциях над модулями.Все они находятся в / kernel / module.c и являются:

  • При инициализации каждого модуля отдельно, а также всех модулей (например, при загрузке).
  • Удаление модуля
  • Ожидание, пока на модуль никто не ссылается (не использует).
  • Когда файловой системе / proc требуется список модулей (oprofile и co. Используютthis).
  • В коде, связанном с трассировкой;итерация и обновление точек трассировки.
0 голосов
/ 24 июля 2010

1) Да.Получите module_mutex в своем модуле перед вызовом find_module()

2) Он не используется вне кода модуля

Пример:

struct module *mod;

mutex_lock(&module_mutex);

mod = find_module("MODULE_NAME");

if(!mod) {
    printk("Could not find module\n");
    return;
}

mutex_unlock(&module_mutex);
...