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

标签 c++ c linux linux-kernel kernel

我正在尝试执行内核系统调用以从队列中删除第一个元素。我在 gdb 中调试时收到 SEGKILL,内核日志中有一行:BUG: unable to handle kernel paging request at ....

我的队列结构如下:

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

如您所见,它包含指向数据 block 的指针、该数据的字节长度以及来自 list.h 的 list_head 结构对象。

我用这些行初始化了一个类型为 msgQueue(above) 的对象:

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

我不能粘贴所有甚至只是我的阅读功能,因为这是我正在学习的类(class)。但这是我希望的相关部分:

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

关于c++ - list.h list_del() 给出内核分页错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671652/

相关文章:

c - 将 Tk 与 C 结合使用

c++ - Linux 上 http_request::set_body 中的 cpprestsdk 段错误

c++ - 为什么我的应用程序会出现C++ unknown reference link错误,而linux中的库却不会

c++ - 法线贴图问题

c++ - 安全地将(shared_ptr 的 vector 到对象)转换为(shared_ptr 的 vector 到常量对象)

c++ - 禁用 move 构造函数

python - 在 Linux Mint 中使用启动器和基本代码启动 Jupyter Notebook

c++ - malloc:无效指针从空闲列表中出队

编写十六进制和十进制数的简单加法的约定

c - C语言读取ID3V2 TAG