Linux kernel Linux内核模块在卸载期间挂起

Linux kernel Linux内核模块在卸载期间挂起,linux-kernel,linux-device-driver,kernel-module,Linux Kernel,Linux Device Driver,Kernel Module,我正试图从《操作系统概念》一书的第一章开始做一个编程项目。任务是编写Linux内核模块,它使用内核列表数据结构迭代结构。我编写了以下代码: #包括 #包括 #包括 #包括 #包括 结构生日{ 国际日; 整月; 国际年; 结构列表\标题列表; }; 结构列表\u头生日\u列表; 结构生日*创建生日(整数天、整数月、整数年) { 结构生日*person=kmalloc(sizeof(结构生日),GFP_内核); 人->天=天; 人->月=月; 人->年=年; 返回人; } 无效打印信息(字符*str

我正试图从《操作系统概念》一书的第一章开始做一个编程项目。任务是编写Linux内核模块,它使用内核列表数据结构迭代结构。我编写了以下代码:

#包括
#包括
#包括
#包括
#包括
结构生日{
国际日;
整月;
国际年;
结构列表\标题列表;
};
结构列表\u头生日\u列表;
结构生日*创建生日(整数天、整数月、整数年)
{
结构生日*person=kmalloc(sizeof(结构生日),GFP_内核);
人->天=天;
人->月=月;
人->年=年;
返回人;
}
无效打印信息(字符*str)
{
printk(内核信息“操作系统模块:%s”,str);
}
int simple_init(void)
{
结构生日*person=CreateBirth(13,41987);
结构生日*ptr;
printInfo(“加载模块”);
名单头(生日名单);
列表\添加\尾部(&人员->列表,&生日\列表);
个人=生日(1987年4月14日);
列表\添加\尾部(&人员->列表,&生日\列表);
个人=生日(1987年4月15日);
列表\添加\尾部(&人员->列表,&生日\列表);
个人=生日(1987年4月16日);
列表\添加\尾部(&人员->列表,&生日\列表);
个人=生日(1987年4月17日);
列表\添加\尾部(&人员->列表,&生日\列表);
每个条目的列表(ptr和生日列表,列表){
printk(内核信息“操作系统模块:日%d.%d.%d\n”,ptr->日,ptr->月,ptr->年);
}
返回0;
}
void简单_退出(void)
{
结构生日*tmp;
结构列表_head*ptr,*next;
printInfo(“正在删除模块”);
如果(列表为空(&生日列表)){
printInfo(“列表为空”);
返回;
}
为每个保险柜列出(ptr、下一个和生日清单){
tmp=列表\输入(ptr、结构生日、列表);
printk(内核信息“操作系统模块:删除%d.%d.%d\n”,tmp->day,tmp->month,tmp->year);
列表删除(ptr);
kfree(tmp);
}
//列出每个条目的安全列表(ptr、下一个和生日列表、列表){
//printk(内核信息“操作系统模块:删除%d.%d.%d\n”,ptr->day,ptr->month,ptr->year);
//列表删除(&ptr->列表);
//kfree(ptr);
//}
printInfo(“模块已删除\n”);
}
模块_init(简单_init);
模块退出(简单退出);
模块许可证(“GPL”);
模块描述(“简单模块”);
模块作者(“MP”);
安装和删除模块后,我没有看到有关删除模块的消息

~/kernelModule $ sudo insmod simple.ko
~/kernelModule $ sudo rmmod -f simple
~/kernelModule $ dmesg | grep 'OS Module'
[  386.590198] OS Module: Loading Module
[  386.590201] OS Module: Day 13.4.1987
[  386.590202] OS Module: Day 14.1.1964
[  386.590203] OS Module: Day 2.6.1964
[  386.590204] OS Module: Day 13.8.1986
[  386.590204] OS Module: Day 10.6.1990
[  396.647828] OS Module: Removing Module
~/kernelModule $ sudo rmmod -f simple
rmmod: ERROR: ../libkmod/libkmod-module.c:769 kmod_module_remove_module() could not remove 'simple': Device or resource busy
rmmod: ERROR: could not remove module simple: Device or resource busy

据我所知,我的模块在删除过程中挂起。我不明白为什么。两个释放代码(也有注释)使模块挂起。

使用
INIT\u列表头(&birth\u列表)
而不是
列表头(birth\u列表)
有助于解决这个问题。

您是否尝试添加更多的
printk
跟踪以找出代码挂起的确切代码行?在
simple\u init
函数中,您需要使用
LIST\u HEAD\u init
而不是
LIST\u HEAD
:后者声明并初始化局部变量,而不是初始化全局变量一.可以使用INIT_LIST_HEAD(&birth_LIST)或LIST_HEAD_INIT@Tsyvarev.@@GauthamKantharaju感谢,
INIT_LIST_HEAD
帮助