insmod: ОШИБКА: не удалось вставить модуль: нет дочерних процессов

Я пытаюсь запустить модуль ядра Linux в ядре Linux. Но что происходит, иногда это удается и запускается, иногда вставка модуля завершается с ошибкой:

insmod: ERROR: could not insert module netlinkKernel.ko: No child processes

и журналы ядра показывают, что он не работает при печати

Error creating socket nl_sk

Я думаю, что это распространенная ошибка, и я не думаю, что это связано с модулем.

Я просто создаю два сокета netlink в модуле. когда я комментирую вторую строку создания сокета, с одним сокетом netlink, модуль работает нормально, но с двумя, как вставлено в коде ниже, он alywas выдает эту ошибку, затем снова, когда я пытаюсь модуль с одним сокетом netlink, затем он также не удается, и я должен перезагрузить систему.

static int __init hello_init(void) {

printk("Entering: %s\n",__FUNCTION__);
// This is for 3.6 kernels and above.
struct netlink_kernel_cfg cfg = {
    .input = hello_nl_recv_msg,
};


struct netlink_kernel_cfg cfg1 = {
    .input = hello_nl_recv_msg1,
};

nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
//nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0,     hello_nl_recv_msg,NULL,THIS_MODULE);
if(!nl_sk)
{

    printk(KERN_ALERT "Error creating socket nl_sk.\n");
    return -10;

}


if(!nl_sk1)
{

    printk(KERN_ALERT "Error creating socket nl_sk1.\n");
    return -10;

}

return 0;
}

Кто-нибудь может пролить свет на это?

2 ответа

NB: я (пока) не являюсь мастером кодирования ядра.

Если я правильно понимаю ваш запрос, этот модуль будет вставлен правильно, пока 3-й netlink_kernel_create строка закомментирована. Если это так, то скорее всего потому, что, как только сокет Netlink создан для конкретного устройства (NETLINK_USER), он должен быть освобожден с помощью netlink_kernel_release прежде чем он может быть воссоздан снова с другим netlink_kernel_create, По этой же причине вы не можете загрузить модуль после того, как он уже не загрузился; Вы никогда не освобождаете выделенные сокеты netlink. Кроме того, 3-й вызов netlink_kernel_create неверно для ядер после 3.7.

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

nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
if(!nl_sk)
{
  printk(KERN_ALERT "Error creating socket nl_sk.\n");
  return -10;
}

nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
if(!nl_sk1)
{
  printk(KERN_ALERT "Error creating socket nl_sk1.\n");
  netlink_kernel_release(nl_sk);
  return -10;
}

Кроме того, вы должны включить соответствие netlink_kernel_release звонки в вашем module_exit функция

Хорошо, я изменил значение для #define NETLINK_USER1 32 с 32 на 30, и все работало нормально. Оба сокета созданы. Нужно увидеть fn прототип

netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);

чтобы проверить, какие возможные значения он ожидает в качестве среднего аргумента.

Другие вопросы по тегам