Linux kernel linux内核字符驱动程序

Linux kernel linux内核字符驱动程序,linux-kernel,driver,Linux Kernel,Driver,我已经使用apiregister\u chrdrv()注册了一个字符驱动程序 驱动程序在/dev/myfile中创建一个条目。用户空间应用程序可以通过打开/dev/myfile来访问我的驱动程序。现在我想让我的角色驱动程序,只有一个用户空间的应用程序可以访问我的驱动程序的时间;只有当用户空间应用程序关闭文件时,另一个用户空间程序才能访问我的驱动程序 这可以在内核级别完成吗 我无法控制在用户空间中运行的应用程序的数量,因此我只能在内核级别进行更改。对于内核字符设备,通常有以下方法 .open .r

我已经使用api
register\u chrdrv()
注册了一个字符驱动程序

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

这可以在内核级别完成吗


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

对于内核字符设备,通常有以下方法

.open
.read
.write
.release
(将在方法寄存器中使用的结构文件\u操作fops\u chrdev(…,&fops)。)

我会以一种方式创建您的客户机,让他们在启动时打开设备,然后在退出时释放。这样,您就可以轻松处理/阻止在此设备上执行读写操作的新(第二)程序


可能还有其他可能性。

根据您的问题,您希望同步应用程序,以便一次只有一个进程可以访问它。您可以选择内核中的
信号量
或驱动程序中的
锁定方法
,这可能会对您有所帮助。您可以在驱动程序的打开方法中引用此内容: 使用全局标志说明设备是否正在使用。关闭时取消设置(在释放方法中)。 伪代码:

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如果我让我的角色驱动程序可重入,这意味着多个用户空间应用程序现在可以一次访问驱动程序,它是线程安全的,它不是线程安全的,我是正确的还是遗漏了什么。我同意,如果内核在内部逐个处理请求,那么它是线程安全的。我的意思是,就像queueHey@user3597661一样。如果答案是正确的,请将其标记为这样!:)注册您的评论/qs:编写可重入安全代码是驱动程序作者的责任;这意味着在适当的情况下使用互斥锁(或自旋锁,无论什么),可能使用'file->private_data'指针作为Kmallock'位置来保存每个进程的状态信息,等等。如果这些细节对您来说是新的,请阅读本主题——(旧的)LDD Rubini书籍,(新的)基本Linux设备驱动程序书籍肯定会有所帮助!谢谢kaiwan你的答案是正确的我如何标记你的答案正确我是这个stackoverflow的新手。com单击正确答案左边的勾号。谢谢