Я пытаюсь реализовать системный вызов ядра, чтобы удалить первый элемент из очереди. Я получаю 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.
Что-нибудь выделяется на вас, что приведет к ошибке подкачки ядра в моих журналах ядра?
tempQueue = (struct msgQueue *)kmalloc(sizeof(struct list_head), GFP_KERNEL);
выглядит неправильно; вы, вероятно, хотите
tempQueue = kmalloc(sizeof *tempQueue, GFP_KERNEL);