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