list.h list_del() 给出内核分页错误
list.h list_del() giving kernel paging error
我正在尝试实现内核系统调用以从队列中删除第一个元素。 在 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);
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- CUDA内核和数学函数的显式命名空间
- 重载Singly Linked List中的赋值运算符
- 码头化的C++应用程序是否向后兼容早期的内核版本
- C++内核出现Jupyter笔记本错误
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 内存围栏是否涉及内核
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- list.h list_del() 给出内核分页错误