zsddn2003 2015-05-19 09:45 采纳率: 0%
浏览 1907
已结题

linux字符设备驱动求助:设备号无法释放

我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊?
lsmod中已经没有我写的驱动模块了。
是因为设备号没能正确释放么?

  • 写回答

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;
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用