Chinaunix

标题: Driver处理多个用户访问的问题? [打印本页]

作者: real_me    时间: 2006-11-23 19:10
标题: Driver处理多个用户访问的问题?
请教下,
在driver里,大家是怎么处理多个用户访问的情况的?
就是说由多个用户态程序同时调用driver,读里面的数据,怎么区分多个用户?
例如,本来应该给用户A的数据不要发给了B.
我觉得大多数driver里都没有考虑这个问题。
谢谢。
作者: siasd    时间: 2006-11-23 23:06
一般都考虑了啦。比如说最简单的情况,每个用户进程要访问设备,肯定得open那个设备啦,这个时候驱动不就能区分了吗,在open的时候给不同的进程分配不同的资源(比如说状态信息、buffer之类的)就可以了。
作者: real_me    时间: 2006-11-24 00:42
那就是说文件描述符指向的private_data是用户相关,而不是设备相关了?
这样的话,在一个用户使用多个设备,而且一个设备被多个用户使用的情况下不是很难处理?
作者: siasd    时间: 2006-11-24 10:59
private_data应该是设备相关的。
总之呢,在设备驱动里面是完全可以支持多用户访问的情况的,当然这样的话,可能会复杂些。
如果只想在某一时刻只有一个用户能访问设备,可以在open借口里面来实现,或者让open设备的进程睡眠,或者返回“设备忙”的错误信息。
作者: real_me    时间: 2006-11-24 23:42
这是比较简单的情况,
如果driver里完全不存在用户信息的话,如何能真正做到支持多用户
用户去取数据的时候,总得通过某种方式读属于自己的数据,而不是有什么就去拿什么吧。
我想借鉴一下别人的做法。
作者: siasd    时间: 2006-11-25 14:24
原帖由 real_me 于 2006-11-24 23:42 发表
这是比较简单的情况,
如果driver里完全不存在用户信息的话,如何能真正做到支持多用户
用户去取数据的时候,总得通过某种方式读属于自己的数据,而不是有什么就去拿什么吧。
我想借鉴一下别人的做法。


觉得driver里应该不会回不存在任何的进程信息吧?

你可以看看很多官方的driver,借鉴一下阿
作者: real_me    时间: 2006-11-25 15:27
是的,我大概看了下自带的那些driver源码,确实没有什么用户信息
但是我觉得单单从用户空间来区分多用户,比较困难。
毕竟内核只有一个地址空间,大家都要调进来。
不是很有经验,多谢你的建议。
作者: yc200405    时间: 2006-11-27 14:25
Driver也分几种嘛,有的是设备驱动,有的是协议驱动,你说的那种情况属于协议驱动,看看控制台驱动程序栈或许有帮助
作者: real_me    时间: 2006-11-27 19:17
多谢,你说的控制台驱动程序栈是不是就是tty driver,这个算是协议驱动么?
稍微看了一下,也没有发现很明显的用户data。
作者: connet    时间: 2006-11-28 08:55
原帖由 real_me 于 2006-11-24 00:42 发表
那就是说文件描述符指向的private_data是用户相关,而不是设备相关了?
这样的话,在一个用户使用多个设备,而且一个设备被多个用户使用的情况下不是很难处理?


用户使用几个设备是用户自己的事情。
驱动只需要处理 多用户使用的情况即可。
作者: yc200405    时间: 2006-11-28 12:49
原帖由 real_me 于 2006-11-27 19:17 发表
多谢,你说的控制台驱动程序栈是不是就是tty driver,这个算是协议驱动么?
稍微看了一下,也没有发现很明显的用户data。


还有行规程驱动,比如Ctrl+C如何转换成SIGINT;;
然后这个信号怎么发送给当前进程,而不是所有进程,
我觉得和你的要求比较靠近了
作者: real_me    时间: 2006-11-28 19:47
又一个新鲜名词,没听说过行规程驱动.
不过举的这个例子只是在内核执行,跟用户态似乎没什么关系
这是和设备驱动的不同之处。
作者: zu_xf    时间: 2006-11-29 09:01
同意。
驱动里面需要做的就是为每个打开它的用户进程分配一个标志和一套资源,并用filep->private_data保存;然后在用户进程select和读取数据的时候根据向不同的标志和缓冲区指针来取定是否返回和返回什么样的数据。


原帖由 connet 于 2006-11-28 08:55 发表


用户使用几个设备是用户自己的事情。
驱动只需要处理 多用户使用的情况即可。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2