免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2667 | 回复: 18
打印 上一主题 下一主题

内核驱动如何被不同用户空间共享? [复制链接]

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-07 12:48 |只看该作者 |倒序浏览
假定有20个用户程序在20个不同的空间,他们都要调用i2c驱动读系统电压。如何让驱动被这些用户高效可靠地共享?
让每个用户程序单干, 自己直接调用驱动,通过read系统调用去读?估计没有几人愿意这么做。
在内核内,加一个资源管理线程,用户通过送消息给内核资源管理线程,让内核线程调用驱动读取所需信息,再返回用户。这样做应该可行,但有一些问题:message communication,还有消息排队,其引起的延迟有多大?不知应用和内河的通信,有什么现成好办法可用?
不知到高手门有没有高招?

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2012-03-07 20:09 |只看该作者
内核中有把I2C接口暴露出来的选项,这样进程只要打开文件结点,通过IOCTRL就可以向设备发消息读消息。同步的问题应该在文件结点接口的驱动里解决了。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
3 [报告]
发表于 2012-03-07 20:38 |只看该作者
回复 2# tempname2
哪一个选项? /sys 下? 这样做和fd=open(dev,..)有什么区别?每次读写要不要通过系统调用最终实现?多谢

   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
4 [报告]
发表于 2012-03-07 20:57 |只看该作者
本帖最后由 tempname2 于 2012-03-07 20:57 编辑

是的,实现的文件好像是i2c-dev.c,跟open dev没区别,只是让用户态有了操纵I2C控制器的能力而已,数据传输当然要通过系统调用。按你的想法,可以只开一个进程去读这个文件,其它进程用socket与之通信。不过IPC最终还是要用系统调用。不管怎么样总是要涉及系统调用,你想优化哪一块?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
5 [报告]
发表于 2012-03-08 07:46 |只看该作者
本帖最后由 linuxfellow 于 2012-03-08 07:49 编辑

回复 4# tempname2
如果让所有的用户程序都一竿子捅到底,这样的framework不算优化。我的意思是要有一个好的构架,需要层次, 通过一个中间件来协调;用户程序向中间件发出请求,由中间件来协调,并执行用户请求,取得数据,送给用户。
前一种方法,应用程序和驱动是多对多的mesh关联
后一种方法变成应用程序和中间件的多对一,以及中间件和驱动的一对多的关联
后一种方法的关联关系要清晰一些,编程不容易出错,便于维护。


   

论坛徽章:
0
6 [报告]
发表于 2012-03-08 09:48 |只看该作者
回复 5# linuxfellow

前一种方法即用即取;后一种方法“中间件”一直运行;
要看服务的进程的数量和频率了;
   

论坛徽章:
0
7 [报告]
发表于 2012-03-08 10:26 |只看该作者
回复 1# linuxfellow


    其实这个问题产生的性能问题应该不大。
    你的意思是想只要一个人去真正的读数据,其他的直接获取数据好了?


    我建议尝试一下input和evdev驱动,如果你的需求符合的话。


注册一个电压device到input,随之会自动创建一个handle同evdev handler关联起来,并且创建一个evdev结构体,这个evdev结构体管理了一个client数组,每个代开这个设备文件的进程都对应一个client。
当有事件发生时,evdev的所有client都会收到一份数据。当然如果你的进程在阻塞的read的话,这个时候会将他们唤醒。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [报告]
发表于 2012-03-08 11:06 |只看该作者
回复 7# blake326
你的这个想法也不错。
内核里可以用一个线程收集实时信息,按你说的办法定期发送给各用户。只是要监控的量不少,传送的数据不会太小(前面的电压问题,只是一个例子)。比较普遍的是256~1000字节左右。不知是否可行。
我的目的是在应用程序和内核资源之间加上一层中间件, 不希望每个用户程序都直接和底层打交道。用一个比较合理的构架实现。

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2012-03-08 13:24 |只看该作者
wangjianchangdx 发表于 2012-03-08 09:48
回复 5# linuxfellow

前一种方法即用即取;后一种方法“中间件”一直运行;

前一种方法数据流,事件显得紊乱,我认为是下策。
后一种方法,有两种实现方式:
1。守护线程定期启动运行,向上送数据或接收传下来的数据。
2。守护线程由事件驱动,接到消息或事件就响应;没事就睡觉。上面来的消息应该就是get/set之类的指令,接到这样的指令后执行,回送消息就行了。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
10 [报告]
发表于 2012-03-08 13:42 |只看该作者
设计中间件还有一个目的就是便于移植。应用程序有用linux,还有用其他操作系统。写应用程序的人都是大爷。他们希望他们的程序不经任何改动,或很少很少的改动,只要在新的操作系统下重新编译一下就能运行。中间件起到包装操作系统或底层硬件的作用。给应用程序提供标准统一接口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP