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

list.h list_del() giving kernel paging error

本文关键字:list 内核 分页 错误 del      更新时间:2023-10-16

我正在尝试实现内核系统调用以从队列中删除第一个元素。 在 gdb 中调试时,我得到一个 SEGKILL,内核日志中有一行:错误:无法在 ....

我的队列结构如下:

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));

我甚至不能粘贴所有读取功能,因为这是我正在拍摄的库尔。 但我希望这是相关部分:

asmlinkage long sys_readMsgQueue(void __user *data, long len)
{
    long uncopiedBytes;
    uncopiedBytes = __copy_to_user(myQueue, data, len);
    printk("REMOVING FROM QUEUE AND FREEINGnnn");
    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);