list.h list_del () выдаёт ошибку подкачки ядра

0

Я пытаюсь реализовать системный вызов ядра, чтобы удалить первый элемент из очереди. Я получаю SEGKILL при отладке в gdb, с линией в журналах ядра: BUG: не удается обработать запрос подкачки ядра на....

Моя структура для очереди выглядит следующим образом:

typedef struct msgQueue
{
    long len;
    void *data;
    struct list_head queue;
} msgQueue;

Как вы можете видеть, он содержит указатель на блок данных, длину в байтах этих данных и объект struct list_head из списка. H.

Я инициализирую объект типа msgQueue (выше) с этими строками:

myQueue = (struct msgQueue *) kmalloc(sizeof(struct msgQueue), GFP_KERNEL);
INIT_LIST_HEAD(&myQueue->queue);

Я реализую функцию записи, которая правильно работает. Очередь не пуста, когда я пытаюсь удалить ее. Здесь инициализация новой очереди, которую я добавляю, и строки для ее добавления:

Заголовок функции:

asmlinkage long sys_writeMsgQueue(const void __user *data, long len)

Другие линии:

tempQueue = (struct msgQueue *)kmalloc(sizeof(struct list_head), GFP_KERNEL);
tempQueue->data = kmalloc((size_t)len, GFP_KERNEL);
tempQueue->len = len;

uncopiedBytes = __copy_from_user(tempQueue->data, data, len);
list_add_tail(&(tempQueue->queue), &(myQueue->queue));

Я не могу вставить все, даже мои функции чтения, потому что это для кучера, который я принимаю. Но вот то, что я надеюсь, это соответствующие части:

asmlinkage long sys_readMsgQueue(void __user *data, long len)
{
    long uncopiedBytes;
    uncopiedBytes = __copy_to_user(myQueue, data, len);
    printk("REMOVING FROM QUEUE AND FREEING\n\n\n");
    list_del(&(myQueue->queue));
}

Когда я реализую эту базовую функциональность этого в автономной программе c в eclipse, чтобы попытаться ее отладить, она работает нормально. Разумеется, я должен настроить его для кода пользовательского пространства, поэтому все конкретные вещи ядра удаляются/меняются (malloc вместо kmalloc, никакого синтаксиса для системного вызова и т.д.). Я включил list.h, который я загружаю, поэтому я использую все те же функции и, что касается list.h.

Что-нибудь выделяется на вас, что приведет к ошибке подкачки ядра в моих журналах ядра?

Теги:
linux-kernel
kernel

1 ответ

1
tempQueue = (struct msgQueue *)kmalloc(sizeof(struct list_head), GFP_KERNEL);

выглядит неправильно; вы, вероятно, хотите

tempQueue = kmalloc(sizeof *tempQueue, GFP_KERNEL);
  • 0
    Ой, этот двойной дель был несчастным случаем. исправлено.
  • 0
    Это не сработало. Что-нибудь еще приходит на ум?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню