我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊?
lsmod中已经没有我写的驱动模块了。
是因为设备号没能正确释放么?
当应用程序打开设备节点时,内核调用相应驱动程序的open()函数。可以在shell中执行以下代码来触发cmos_open()的执行:
bash> cat /dev/cmos/0
当应用程序关闭一个已经打开的设备时,内核调用release()函数。因此当读取CMOS存储体0的内容后,cat关闭和/dev/cmos/0关联的文件描述符,内核调用cmos_release()。
下面的代码显示了cmos_open()和cmos_release()的具体实现:
/*
/*
另一个值得关注的第二个输入参数--file结构中的private_data域的使用。你可以使用此数据域来存储cmos_dev地址。阅读cmos_release()(以及其它函数)可以发现如何用private_data来直接获取属于相应CMOS存储体的cmos_dev结构体的处理程序
/
/ Easy access to cmos_devp from rest of the entry points */
file->private_data = cmos_devp;
/* Initialize some fields */
cmos_devp->size = CMOS_BANK_SIZE;
cmos_devp->current_pointer = 0;
return 0;
}
/*
*Release CMOS bank
*/
int cmos_release (struct inode *inode, struct file *file)
{
struct cmos_dev *cmos_devp = file->private-data;
/* Reset file pointer */
cmos_devp->current_pointer = 0;
return 0;
}
一定是哪里读模块的引用计数泄漏了,还是把代码贴出来看看吧。