C++ list.h list_del()给出内核分页错误

C++ list.h list_del()给出内核分页错误,c++,c,linux,linux-kernel,kernel,C++,C,Linux,Linux Kernel,Kernel,我试图实现一个内核系统调用,以从队列中删除第一个元素。在gdb中调试时,我得到了一个SEGKILL,内核日志中有一行:BUG:无法在…处理内核分页请求 我的队列结构如下所示: typedef struct msgQueue { long len; void *data; struct list_head queue; } msgQueue; 如您所见,它包含指向数据块的指针、该数据的字节长度以及list.h中的list_head struct对象 我使用以下行初始化ms

我试图实现一个内核系统调用,以从队列中删除第一个元素。在gdb中调试时,我得到了一个SEGKILL,内核日志中有一行:BUG:无法在…处理内核分页请求

我的队列结构如下所示:

typedef struct msgQueue
{
    long len;
    void *data;
    struct list_head queue;
} msgQueue;
如您所见,它包含指向数据块的指针、该数据的字节长度以及list.h中的list_head struct对象

我使用以下行初始化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));
我不能粘贴所有的函数,即使只是我的read函数,因为这是我正在使用的一个库。但我希望以下是相关部分:

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));
}
当我在eclipse中的一个自包含的c程序中实现这个基本功能来调试它时,它运行得很好。当然,我必须根据用户空间代码对其进行调整,以便删除/更改所有特定于内核的内容(malloc而不是kmalloc,没有特定于系统调用的语法,等等)。我包括了我下载的list.h,所以我使用了所有相同的函数,比如list.h

您是否发现了任何可能导致我的内核日志中出现内核分页错误的问题

tempQueue = (struct msgQueue *)kmalloc(sizeof(struct list_head), GFP_KERNEL);
看起来不对;你可能想要

tempQueue = kmalloc(sizeof *tempQueue, GFP_KERNEL);

哎呀,那个双德尔是个意外。固定的。