当前位置: 技术问答>linux和unix
求助!linux字符设备驱动开发
来源: 互联网 发布时间:2017-04-06
本文导语: 刚接触linux驱动开发,看了宋宝华老师的《linux设备驱动开发详解》,关于内核模块的加载、驱动注册等流程都基本清楚了,也知道设备驱动和设备文件是通过设备号关联起来的,但是有一点很困惑的,那就是设备驱...
刚接触linux驱动开发,看了宋宝华老师的《linux设备驱动开发详解》,关于内核模块的加载、驱动注册等流程都基本清楚了,也知道设备驱动和设备文件是通过设备号关联起来的,但是有一点很困惑的,那就是设备驱动程序是如何跟硬件设备关联起来的,驱动程序如何让操作系统知道自己是适合哪个硬件设备的驱动呢?
我知道windows下的驱动程序会有一个表,表里包含硬件厂商、设备类型等信息,操作系统会根据这些信息去匹配相关硬件,但是linux下的字符驱动里面我没找到相似的信息,书上也到处找不到,希望高手可以帮忙解答一下。
我知道windows下的驱动程序会有一个表,表里包含硬件厂商、设备类型等信息,操作系统会根据这些信息去匹配相关硬件,但是linux下的字符驱动里面我没找到相似的信息,书上也到处找不到,希望高手可以帮忙解答一下。
|
应用层和驱动层是通过设备文件这个东西来联系的。你打开对应的设备文件,由于之前驱动程序注册时也和这个设备文件建立了联系,所以你在打开这个对应的设备文件时,Linux的文件系统会把相应的驱动程序和你的应用层建立联系。不会说你要打开串口的,结果成了打开键盘的。
如果要问驱动程序怎么和硬件设备怎么联系的,这个就有些难了。有的驱动简单,能比较容易懂,有的复杂了,文件系统就可能会参与。这块我也没有深究,不敢瞎说,但是对于初学者,建议不要纠缠这块,先学会用再说,不要管原理(不会原理也不会影响你的学习流程),用多了,再看看内核源代码就清楚了。
如果要问驱动程序怎么和硬件设备怎么联系的,这个就有些难了。有的驱动简单,能比较容易懂,有的复杂了,文件系统就可能会参与。这块我也没有深究,不敢瞎说,但是对于初学者,建议不要纠缠这块,先学会用再说,不要管原理(不会原理也不会影响你的学习流程),用多了,再看看内核源代码就清楚了。
|
字符设备需要先建立访问的设备文件,可利用mknod或者MAKEDEV工具创建设备文件,而每个设备文件拥有主设备号和从设备号。二者共同形成一个唯一的号码,内核可由此查找对应的设备驱动程序。内核采用主从设备号来标识匹配的驱动程序,即主设备号相同的字符设备是同类设备(使用同一驱动程序)。你可以在内核代码里找/drivers/char/目录下的源码来看看就明白了。
|
你说的windows下的驱动里的表是指设备的DeviceId和VenderId表吧,这些Id是对应实际硬件的Id的,Linux如果要驱动这些设备,也要写入这些信息的,不同的是windows驱动可以写在ini文件里,但是linux驱动是写在源程序里的。你说的linux驱动里找不到对应的表是因为那些例子驱动的设备都是虚拟设备,不是真实的设备,没有真实的id,所以没有。