驱动该如何入门 关于file_operations和Linux设备模型

来源:互联网 发布:osi参考模型吧网络分为 编辑:程序博客网 时间:2024/04/29 20:04


楼主发表于: 2011-03-17 21:06:49
本帖最后由 laoshizhuce 于 2011-03-17 21:25:41 编辑
 
Linux驱动开发入门时,基本上市面上的书都会举这么一个例子:LED驱动

书上说编写驱动尤其是字符驱动就是实现struct file_operations中的若干函数,并且确实也是这么做的

但是发现后面的所有驱动都是基于设备模型开发的,即设备、驱动和总线,
如platform总线、USB总线等

是不是linux 2.6中基本抛弃了file_operations这种模型了,
既然抛弃了为什么用file_operations举例,是设备模型太难吗
基本上没有哪本书讲了file_operations到设备模型的转变

驱动用file_operations和用设备模型究竟有哪些区别

在用struct file_operations举例时说什么open read 等系统调用最终都是调用的file_operations中的函数,但设备模型中好像没有哪个函数或参数和file_operations相关联,如果用设备模型,read、open怎么和底层打交道

大家有什么好的驱动提高方法吗,多练多看书吗

书页看了一些,譬如那本经典的LDD3,感觉都是很虚的东西,看来看去提高不大

真诚求助,谢谢大家
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
回复次数:29
#1 得分:8回复于: 2011-03-18 11:46:28
file_operations 当然不可能被抛弃。它是字符设备的基础结构,
各种设备模型或者说总线,只是对字符设备进行了包装,你只是没看到
本质,没看明白设备模型而已。

LDD 是本好书,但光看一本书是不够的,看一遍两遍也是远远不够的。
至于说方法, 实践就是唯一的方法。
2013年4月微软MVP申请开始啦!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#2 得分:0回复于: 2011-03-18 12:08:07
谢谢pottichu

各种设备模型或者说总线只是对file_operations进行了包装  
有什么方面的资料说怎么包装的么,因为基本上没有书讲了他们之间的联系。感觉两者差别挺大的

我看了设备模型的众多函数定义和参数都没有看到file_operations有什么联系

非常谢谢先

"写给13岁的CSDN论坛"——庆祝论坛上线13周年活动
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#3 得分:2回复于: 2011-03-18 12:28:00
建议楼主多看看内核代码!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#4 得分:8回复于: 2011-03-18 12:34:38
恩 , LZ是没真正看懂设备模型的本质 。
   其实就是面向对象封装的思想 。
而且 ,真正实现的驱动 ,就是字符设备驱动程序 ,而那些总线 ,只是套一个框架上去 ,以实现总线,驱动,设备这种模型。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#5 得分:0回复于: 2011-03-18 12:57:01
楼上的可以讲讲这个脉络吗,谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#6 得分:2回复于: 2011-03-19 18:08:40
同样的困惑,本质是什么呀?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#7 得分:2回复于: 2011-03-20 09:07:27
哪位大虾在讲讲,还么懂……
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#8 得分:2回复于: 2011-03-20 22:12:54
引用 3 楼 shenfawang 的回复:
建议楼主多看看内核代码!

就是这样的.不管什么总线,pci也要,usb也好,只是一个框架
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#9 得分:0回复于: 2011-03-21 13:19:25
既然是框架,那到底file_operations和Linux设备模型有什么联系

谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#10 得分:5回复于: 2011-03-21 14:21:51
个人觉得设备模型应该是为了总线上的设备的同一管理吧,
也就是设备之间存在的关系得到体现,
但设备的驱动程序应该是原来的,或者接口上有所变化吧,

没看到源代码
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#11 得分:2回复于: 2011-03-21 22:37:49
学习下
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#13 得分:5回复于: 2011-03-24 00:19:13
引用 4 楼 vclongking 的回复:
恩 , LZ是没真正看懂设备模型的本质 。
  其实就是面向对象封装的思想 。
而且 ,真正实现的驱动 ,就是字符设备驱动程序 ,而那些总线 ,只是套一个框架上去 ,以实现总线,驱动,设备这种模型。


这个赞成。多看看内核源码吧,/Documentation里的文档需要好好看。
《精通linux驱动程序开发》我感觉这本书不错,目前看的是英文版的。

我也是初学,多多交流啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#14 得分:2回复于: 2011-03-24 09:02:25
拉拉好久不出来回答问题了。呵呵
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#16 得分:5回复于: 2011-03-31 10:37:01
本帖最后由 wenxy1 于 2011-03-31 10:37:47 编辑
LDD, ULK, ELDD都是经典的好书, 特别是ELDD在实际工作中是很好的工具书.
另外,我在X86的网站(http://www.linuxdeveloper.cn/alex/en/category/photo)上看到一本书:<<深入Linux内核架构>>, 这里有书评: http://product.china-pub.com/196739#nrjj
应当是不错的.
CSDN也有English版下载: http://download.csdn.net/source/2453825
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#17 得分:6回复于: 2011-04-01 08:57:18
我最初看设备模型时,也不明白是怎么回事,不过,通过进一步的学习,这两天终于明白了点东西。
在内核中找一个实际设备的驱动(我看的是iic的驱动,据说是比较简单的),好好看看,一定要耐心,
找相关的书看。刚开始看的时候不一定能马上找到自己想要的东西,不过,不能着急,看多了就明白了。
看代码过程中,如果觉得有哪一部分不理解,就先停止,把这部分不理解的东西弄明白后,再继续往下看。
在这个过程中,你会明白很多东西,当把整个驱动代码看完的时候,就能明白是怎么回事了。
lDD3是本很好的书,其他的很多书不会给你讲那么清楚,并且,很多地方写的很粗糙。
即使这样,也要多看些书,取其精华,去其糟粕。你在一本书中不可能找到所有你想学的东西。

file_operations是驱动中必须的东西,是驱动提供给用户空间的接口。
你说没有是因为你没有找到,还没有看到那个地方,慢慢看吧。。。。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#18 得分:3回复于: 2011-04-01 11:50:58
对于cdev类型的驱动需要理解几个概念 device ,cdev ,bus,class,这些具体是什么东东。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#19 得分:3回复于: 2011-04-01 13:26:46
不知道LZ毕业了没,如果还没,那你这样的困惑和当时还在学校的我一样。不过LZ需要注意一下几点:
1,学习linux驱动是个漫长的过程,这需要积累和沉淀
2,LDD3是本好书,现在我在工作了都还经常当工具书翻番,虽然它已经很老了
3,希望LZ能搞块开发板,或者跟着公司的项目走也可以。

LZ可以先自己调,先从稍微简答一点的驱动模型吧,platform比较简单,可以从这个开始,首选的子系统为input子系统,结合板子上的触摸屏驱动一起学习,input子系统网上的资料介绍得多点。一般按基础一般点的1到2个月应该能把input子系统的原理弄明白。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#20 得分:5回复于: 2011-04-01 14:27:25
驱动程序在系统中起到承上启下的作用,有2点:
1. 启下:管理硬件,收发硬件相关的数据。
2. 承上:对操作系统和用户空间程序提供API。用户空间的应用程序通过驱动程序访问硬件。这个API就是file_opertions。

UNIX和LINUX(实际上是类UNIX系统)是基于文件的概念构建的。所有的设备都被抽象为文件。对设备的操作被抽象为对文件的操作。为此,类UNIX系统专门定义了一套POSIX系统调用,来规范这些文件操作。《UNIX环境高级编程》就是讲这些系统调用的。这些系统调用被执行的时候,就会到内核里面去寻找支持的代码和库。具体在代码里面,层层调用,最后调用的就是file_operations里面定义的文件操作函数。

在Linux 2.4里面,只要实现了file_operations里面的那些成员函数,驱动就算写完了。到了Linux 2.6里面,把驱动分得更细了,架构更复杂一些,所以有了device ,cdev ,bus,class,这些具体东西。但实际上驱动的2点基本作用是不变的。

-------------------------------------------------
如果你觉得我的回复有价值,请进一步访问我的主页和blog。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#21 得分:0回复于: 2011-04-02 09:12:27
非常谢谢大家的精彩回复

sjsj,我会去看你的blog的,谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#22 得分:5回复于: 2011-04-14 16:49:33
LLD3只是介绍了最最基本的内核可用的结构,当然也是基础。对于这是想把LED的点亮的家伙,可以跳过这些细节,直接用LED驱动架构中的硬件接口API就可以完成任务。
但是Linux中有诸多的设备,每一类设备的代码中都会看见如xxxx_core.c的文件,这些文件都是驱动架构师在社区讨论,编写而成,这类的文件才会真正涉及LLD3中的内容。
因此,看你想成为什么人
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#23 得分:5回复于: 2011-04-15 09:35:06
如何入门这个,我专门写了一个博客,我直接贴博客的地址吧,楼主一定要好好看!

因为大多数的驱动开发人员也搞不懂 fops及驱动模型,就知道,填写回调函数啥的,针对这个问题,我特意写了个博客,期望能够解决大家的问题,也算是抛砖引玉吧!

http://blog.csdn.net/smilestone322/archive/2011/03/19/6261955.aspx



对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#24 得分:0回复于: 2011-04-18 16:49:51
smilestone322用心了 我会去看的
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#25 得分:5回复于: 2011-04-24 15:14:08
字符设备是用这个file_operations模型的,这几乎是后面其他模型的基础

个人认为学习驱动最好的办法就是不断的积累实践经验,改一些驱动程序或者自己尝试着写写简单的程序都可以让你明白这里面的流程。

LDD3虽然是一本好书,但是你不能只抱着他一本书看,这本书里面涉及到的东西很全,可以说是一本工具书遇到问题再来查找看看里面的东西会让你豁然开朗
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#26 得分:5回复于: 2011-04-25 20:08:51
谁说file_operations被抛弃了,抛弃的是devfs吧
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#27 得分:0回复于: 2011-06-03 19:32:55
快端午了,结贴

祝大家端午节快乐
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#28 得分:0回复于: 2011-07-25 17:49:47
我也不明白为什么要有,设备模型.linux 是怎样使用设备模的呢?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#29 得分:0回复于: 2011-08-31 10:41:36
我也碰到同样的问题,在看8250驱动的时候,发现里面既注册了cdev设备,也注册了platform_device设备。看了各位的发言,收益颇多啊。不过还是没有完全弄懂。

楼主发表于: 2011-03-17 21:06:49
本帖最后由 laoshizhuce 于 2011-03-17 21:25:41 编辑
 
Linux驱动开发入门时,基本上市面上的书都会举这么一个例子:LED驱动

书上说编写驱动尤其是字符驱动就是实现struct file_operations中的若干函数,并且确实也是这么做的

但是发现后面的所有驱动都是基于设备模型开发的,即设备、驱动和总线,
如platform总线、USB总线等

是不是linux 2.6中基本抛弃了file_operations这种模型了,
既然抛弃了为什么用file_operations举例,是设备模型太难吗
基本上没有哪本书讲了file_operations到设备模型的转变

驱动用file_operations和用设备模型究竟有哪些区别

在用struct file_operations举例时说什么open read 等系统调用最终都是调用的file_operations中的函数,但设备模型中好像没有哪个函数或参数和file_operations相关联,如果用设备模型,read、open怎么和底层打交道

大家有什么好的驱动提高方法吗,多练多看书吗

书页看了一些,譬如那本经典的LDD3,感觉都是很虚的东西,看来看去提高不大

真诚求助,谢谢大家
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
回复次数:29
#1 得分:8回复于: 2011-03-18 11:46:28
file_operations 当然不可能被抛弃。它是字符设备的基础结构,
各种设备模型或者说总线,只是对字符设备进行了包装,你只是没看到
本质,没看明白设备模型而已。

LDD 是本好书,但光看一本书是不够的,看一遍两遍也是远远不够的。
至于说方法, 实践就是唯一的方法。
2013年4月微软MVP申请开始啦!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#2 得分:0回复于: 2011-03-18 12:08:07
谢谢pottichu

各种设备模型或者说总线只是对file_operations进行了包装  
有什么方面的资料说怎么包装的么,因为基本上没有书讲了他们之间的联系。感觉两者差别挺大的

我看了设备模型的众多函数定义和参数都没有看到file_operations有什么联系

非常谢谢先

"写给13岁的CSDN论坛"——庆祝论坛上线13周年活动
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#3 得分:2回复于: 2011-03-18 12:28:00
建议楼主多看看内核代码!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#4 得分:8回复于: 2011-03-18 12:34:38
恩 , LZ是没真正看懂设备模型的本质 。
   其实就是面向对象封装的思想 。
而且 ,真正实现的驱动 ,就是字符设备驱动程序 ,而那些总线 ,只是套一个框架上去 ,以实现总线,驱动,设备这种模型。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#5 得分:0回复于: 2011-03-18 12:57:01
楼上的可以讲讲这个脉络吗,谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#6 得分:2回复于: 2011-03-19 18:08:40
同样的困惑,本质是什么呀?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#7 得分:2回复于: 2011-03-20 09:07:27
哪位大虾在讲讲,还么懂……
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#8 得分:2回复于: 2011-03-20 22:12:54
引用 3 楼 shenfawang 的回复:
建议楼主多看看内核代码!

就是这样的.不管什么总线,pci也要,usb也好,只是一个框架
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#9 得分:0回复于: 2011-03-21 13:19:25
既然是框架,那到底file_operations和Linux设备模型有什么联系

谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#10 得分:5回复于: 2011-03-21 14:21:51
个人觉得设备模型应该是为了总线上的设备的同一管理吧,
也就是设备之间存在的关系得到体现,
但设备的驱动程序应该是原来的,或者接口上有所变化吧,

没看到源代码
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#11 得分:2回复于: 2011-03-21 22:37:49
学习下
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#13 得分:5回复于: 2011-03-24 00:19:13
引用 4 楼 vclongking 的回复:
恩 , LZ是没真正看懂设备模型的本质 。
  其实就是面向对象封装的思想 。
而且 ,真正实现的驱动 ,就是字符设备驱动程序 ,而那些总线 ,只是套一个框架上去 ,以实现总线,驱动,设备这种模型。


这个赞成。多看看内核源码吧,/Documentation里的文档需要好好看。
《精通linux驱动程序开发》我感觉这本书不错,目前看的是英文版的。

我也是初学,多多交流啊
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#14 得分:2回复于: 2011-03-24 09:02:25
拉拉好久不出来回答问题了。呵呵
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#16 得分:5回复于: 2011-03-31 10:37:01
本帖最后由 wenxy1 于 2011-03-31 10:37:47 编辑
LDD, ULK, ELDD都是经典的好书, 特别是ELDD在实际工作中是很好的工具书.
另外,我在X86的网站(http://www.linuxdeveloper.cn/alex/en/category/photo)上看到一本书:<<深入Linux内核架构>>, 这里有书评: http://product.china-pub.com/196739#nrjj
应当是不错的.
CSDN也有English版下载: http://download.csdn.net/source/2453825
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#17 得分:6回复于: 2011-04-01 08:57:18
我最初看设备模型时,也不明白是怎么回事,不过,通过进一步的学习,这两天终于明白了点东西。
在内核中找一个实际设备的驱动(我看的是iic的驱动,据说是比较简单的),好好看看,一定要耐心,
找相关的书看。刚开始看的时候不一定能马上找到自己想要的东西,不过,不能着急,看多了就明白了。
看代码过程中,如果觉得有哪一部分不理解,就先停止,把这部分不理解的东西弄明白后,再继续往下看。
在这个过程中,你会明白很多东西,当把整个驱动代码看完的时候,就能明白是怎么回事了。
lDD3是本很好的书,其他的很多书不会给你讲那么清楚,并且,很多地方写的很粗糙。
即使这样,也要多看些书,取其精华,去其糟粕。你在一本书中不可能找到所有你想学的东西。

file_operations是驱动中必须的东西,是驱动提供给用户空间的接口。
你说没有是因为你没有找到,还没有看到那个地方,慢慢看吧。。。。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#18 得分:3回复于: 2011-04-01 11:50:58
对于cdev类型的驱动需要理解几个概念 device ,cdev ,bus,class,这些具体是什么东东。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#19 得分:3回复于: 2011-04-01 13:26:46
不知道LZ毕业了没,如果还没,那你这样的困惑和当时还在学校的我一样。不过LZ需要注意一下几点:
1,学习linux驱动是个漫长的过程,这需要积累和沉淀
2,LDD3是本好书,现在我在工作了都还经常当工具书翻番,虽然它已经很老了
3,希望LZ能搞块开发板,或者跟着公司的项目走也可以。

LZ可以先自己调,先从稍微简答一点的驱动模型吧,platform比较简单,可以从这个开始,首选的子系统为input子系统,结合板子上的触摸屏驱动一起学习,input子系统网上的资料介绍得多点。一般按基础一般点的1到2个月应该能把input子系统的原理弄明白。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#20 得分:5回复于: 2011-04-01 14:27:25
驱动程序在系统中起到承上启下的作用,有2点:
1. 启下:管理硬件,收发硬件相关的数据。
2. 承上:对操作系统和用户空间程序提供API。用户空间的应用程序通过驱动程序访问硬件。这个API就是file_opertions。

UNIX和LINUX(实际上是类UNIX系统)是基于文件的概念构建的。所有的设备都被抽象为文件。对设备的操作被抽象为对文件的操作。为此,类UNIX系统专门定义了一套POSIX系统调用,来规范这些文件操作。《UNIX环境高级编程》就是讲这些系统调用的。这些系统调用被执行的时候,就会到内核里面去寻找支持的代码和库。具体在代码里面,层层调用,最后调用的就是file_operations里面定义的文件操作函数。

在Linux 2.4里面,只要实现了file_operations里面的那些成员函数,驱动就算写完了。到了Linux 2.6里面,把驱动分得更细了,架构更复杂一些,所以有了device ,cdev ,bus,class,这些具体东西。但实际上驱动的2点基本作用是不变的。

-------------------------------------------------
如果你觉得我的回复有价值,请进一步访问我的主页和blog。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#21 得分:0回复于: 2011-04-02 09:12:27
非常谢谢大家的精彩回复

sjsj,我会去看你的blog的,谢谢
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#22 得分:5回复于: 2011-04-14 16:49:33
LLD3只是介绍了最最基本的内核可用的结构,当然也是基础。对于这是想把LED的点亮的家伙,可以跳过这些细节,直接用LED驱动架构中的硬件接口API就可以完成任务。
但是Linux中有诸多的设备,每一类设备的代码中都会看见如xxxx_core.c的文件,这些文件都是驱动架构师在社区讨论,编写而成,这类的文件才会真正涉及LLD3中的内容。
因此,看你想成为什么人
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#23 得分:5回复于: 2011-04-15 09:35:06
如何入门这个,我专门写了一个博客,我直接贴博客的地址吧,楼主一定要好好看!

因为大多数的驱动开发人员也搞不懂 fops及驱动模型,就知道,填写回调函数啥的,针对这个问题,我特意写了个博客,期望能够解决大家的问题,也算是抛砖引玉吧!

http://blog.csdn.net/smilestone322/archive/2011/03/19/6261955.aspx



对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#24 得分:0回复于: 2011-04-18 16:49:51
smilestone322用心了 我会去看的
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#25 得分:5回复于: 2011-04-24 15:14:08
字符设备是用这个file_operations模型的,这几乎是后面其他模型的基础

个人认为学习驱动最好的办法就是不断的积累实践经验,改一些驱动程序或者自己尝试着写写简单的程序都可以让你明白这里面的流程。

LDD3虽然是一本好书,但是你不能只抱着他一本书看,这本书里面涉及到的东西很全,可以说是一本工具书遇到问题再来查找看看里面的东西会让你豁然开朗
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#26 得分:5回复于: 2011-04-25 20:08:51
谁说file_operations被抛弃了,抛弃的是devfs吧
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#27 得分:0回复于: 2011-06-03 19:32:55
快端午了,结贴

祝大家端午节快乐
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#28 得分:0回复于: 2011-07-25 17:49:47
我也不明白为什么要有,设备模型.linux 是怎样使用设备模的呢?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 | TOP
#29 得分:0回复于: 2011-08-31 10:41:36
我也碰到同样的问题,在看8250驱动的时候,发现里面既注册了cdev设备,也注册了platform_device设备。看了各位的发言,收益颇多啊。不过还是没有完全弄懂。
原创粉丝点击