Использование сокетов netlink с дополнениями для Linux
Я создал следующий код в модуле ядра:
DECLARE_COMPLETION(comp);
void nl_send (struct sk_buff* skb) {
reinit_completion(&comp);
NETLINK_CB(skb).portid = 0;
if (nlsk){
netlink_unicast(nlsk, skb, pid, MSG_DONTWAIT);
debug(KERN_NOTICE"Supposed to Send to userspace\n");
}
}
void nl_recv(struct sk_buff *skb) {
struct nlmsghdr *nlh;
complete(&comp);
if (skb == NULL) {
return;
}
nlh = (struct nlmsghdr *) skb->data;
pid = nlh->nlmsg_pid;
}
void send_context() {
//some logic
nl_send(skb);
wait_for_completion(&comp);
}
в пользовательском пространстве у меня есть следующая логика:
while(1) {
recv_fromkernel();
send_to_kernel(pid);
}
когда я пытаюсь провести стресс-тестирование моего модуля ядра (путем создания 1000 новых потоков с использованием netcat), bash (выполнение сценария оболочки для запуска цикла netcat) завершается с ошибкой общей защиты. Как только я снимаю завершение, скрипт работает нормально.
Я использую Ubuntu 14.04 LTS с ядром 3.13.0-79.
ошибки
В BASH USERSPACE
bash: ../nptl/sysdeps/unix/sysv/linux/x86_64/../fork.c:141: __libc_fork: Assertion `({ __typeof (self->tid) __value; if (sizeof (__value) == 1) asm volatile ("movb %%fs:%P2,%b0" : "=q" (__value) : "0" (0), "i" (__builtin_offsetof (struct pthread, tid))); else if (sizeof (__value) == 4) asm volatile ("movl %%fs:%P1,%0" : "=r" (__value) : "i" (__builtin_offsetof (struct pthread, tid))); else { if (sizeof (__value) != 8) abort (); asm volatile ("movq %%fs:%P1,%q0" : "=r" (__value) : "i" (__builtin_offsetof (struct pthread, tid))); } __value; }) != ppid' failed. Aborted (core dumped)
IN KERNEL LOG
traps: bash[3219] general protection ip:7f9fce597227 sp:7ffdd2c61d40 error:0 in libc-2.19.so[7f9fce55d000+1bb000]`