我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊?
lsmod中已经没有我写的驱动模块了。
是因为设备号没能正确释放么?
linux字符设备驱动求助:设备号无法释放
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- yf519997834 2015-05-20 14:31关注
当应用程序打开设备节点时,内核调用相应驱动程序的open()函数。可以在shell中执行以下代码来触发cmos_open()的执行:
bash> cat /dev/cmos/0
当应用程序关闭一个已经打开的设备时,内核调用release()函数。因此当读取CMOS存储体0的内容后,cat关闭和/dev/cmos/0关联的文件描述符,内核调用cmos_release()。
下面的代码显示了cmos_open()和cmos_release()的具体实现:
/*- open CMOS bank / int cmos_open(struct inode *inode, struct file *file) { struct cmos_dev *cmos_devp; / 有两点值得关注。首先是cmos_dev的获取。cmos_open()的输入参数inode包含cdev结构在初始化过程中分配的地址。cdev定义与cmos_dev中。为了获取容器结构cmos_dev的地址,cmos_open()使用了内核的辅助函数container_of() / / Get the per-device structure that contains this cdev */ cmos_devp = container_of(inode->i_cdev, struct cmos_dev, cdev);
/*
另一个值得关注的第二个输入参数--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;
}
解决 无用评论 打赏 举报