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

时间:2013-10-30 00:25:10

标签: 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结构对象。

我使用以下行来初始化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));

我无法粘贴所有甚至只是我的阅读功能,因为这是我正在采取的一个coure。但这是我希望的相关部分:

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。

在我的内核日志中是否会引起内核分页错误?

1 个答案:

答案 0 :(得分:1)

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

看起来不对;你可能想要

tempQueue = kmalloc(sizeof *tempQueue, GFP_KERNEL);