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);
чтобы проверить, какие возможные значения он ожидает в качестве среднего аргумента.