【问题标题】:linux kernel character driverslinux内核字符驱动
【发布时间】:2014-05-02 20:57:07
【问题描述】:

我已经使用apiregister_chrdrv()注册了一个字符驱动。

驱动程序在/dev/myfile 中创建一个条目。用户空间应用程序可以通过打开 /dev/myfile 来访问我的驱动程序。现在我想让我的角色驱动程序一次只有一个用户空间应用程序可以访问我的驱动程序;只有当该用户空间应用程序关闭文件时,另一个用户空间程序才能访问我的驱动程序。

这可以在内核级别完成吗?

我无法控制在用户空间中运行的应用程序的数量,因此我只能在内核级别进行更改。

【问题讨论】:

    标签: linux-kernel driver


    【解决方案1】:

    在驱动程序的 open 方法中: 使用全局标志来说明设备是否正在使用中。关闭时取消设置(在 release 方法中)。 伪代码:

    am_open=False
    
    open() method:
    if (!am_open)
      am_open=True
      ...proceed...
    else
      return -EAGAIN; // try again later
     -or-
      return -EBUSY;
    
    
    release() method:
      am_open=False
    

    话虽如此,驱动程序(通常)应该是 100% 可重入 :)

    【讨论】:

    • 感谢 kaiwan rohit 和 user3387542
    • 感谢 kaiwan rohit 和 user3387542 如果我让我的角色驱动程序可重入,这意味着多个用户空间应用程序现在可以一次访问驱动程序它是线程安全的它不是线程安全的我是正确的还是我错过了某物 。如果内核在内部逐一处理请求,我同意它是线程安全的,我的意思是就像队列一样
    • 嘿@user3597661,如果答案是正确的,请标记它! :) 注册您的评论/qs:编写可重入安全代码是驱动作者的责任;这意味着在适当的情况下使用互斥锁(或自旋锁等),可能使用“file->private_data”指针作为 kmalloc 的位置来保存每个进程状态信息等。如果这些细节对您来说是新的,请阅读紧跟主题——(较旧的)LDD Rubini 书籍,(较新的)Essential Linux Device Drivers 书籍肯定会有所帮助!
    • 谢谢 kaiwan 你的回答是正确的 我如何标记你的回答正确我是这个 stackoverflow.com 的新手
    • 点击正确答案左边的勾号。谢谢。
    【解决方案2】:

    使用内核字符设备通常有以下方法。

    .open
    .read
    .write
    .release
    

    (struct file_operations fops 将在方法 register_chrdev(...,&fops) 中使用。)

    我会创建您的客户端,让他们在启动时打开设备,并在退出时释放它。像这样,您可以轻松地处理/阻止在此设备上执行读取和写入的新(第二个)程序。

    可能还有其他可能性。

    【讨论】:

      【解决方案3】:

      根据您的问题,您希望同步您的应用程序,以便一次只有一个进程可以访问它。你可以去semaphore in kernellocking methods in drivers 这可能对你有帮助。你可以参考这个http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/kernel/semaphore.c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-05
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多