当前位置: 技术问答>linux和unix
设备驱动,到底驱动了哪个硬件设备?
来源: 互联网 发布时间:2016-08-11
本文导语: 做了一个简单的linux驱动程序 demo, 在/dev下用mknod命令声明了设备节点:mknod c 254 0 /dev/demo 主次设备号分别是254 和0 。主设备号是人为定义的,因为查看了一下/drivers/proc下 没有用到254的 ,编写了驱动程序 并在其中regi...
做了一个简单的linux驱动程序 demo, 在/dev下用mknod命令声明了设备节点:mknod c 254 0 /dev/demo 主次设备号分别是254 和0 。主设备号是人为定义的,因为查看了一下/drivers/proc下 没有用到254的 ,编写了驱动程序 并在其中register_chrdev()中将主次设备号 和file_operations 都关联进去了,写了一个应用程序,open了/dev/demo ,write了几个数据,使用这个驱动程序,完成了对这几个数据的一些变换(如 倒序排列),并又 read回来,屏幕上现实出来了。
问题是,在我创建设备节点的时候 我到底 用的是的 哪个真实的物理设备呢? 我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个 主次设备号 254 0 到底指的是哪个物理设备呢? 请高手指点迷津~ 谢谢
问题是,在我创建设备节点的时候 我到底 用的是的 哪个真实的物理设备呢? 我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个 主次设备号 254 0 到底指的是哪个物理设备呢? 请高手指点迷津~ 谢谢
|
驱动哪个设备取决于你的驱动程序内部,跟主设备号没有直接关系。主设备号注册的作用是告诉内核当用户级程序访问这个节点时,用你的驱动而不是别的驱动与设备打交道。
从楼主的描述来看,你的驱动程序没有与真实的硬件打交道。所以不能驱动任何设备,只是一个虚拟设备而已。也可以说是用户级程序“被骗了”。
这种驱动程序是有意义的。比如虚拟网卡、虚拟磁盘之类的。
从楼主的描述来看,你的驱动程序没有与真实的硬件打交道。所以不能驱动任何设备,只是一个虚拟设备而已。也可以说是用户级程序“被骗了”。
这种驱动程序是有意义的。比如虚拟网卡、虚拟磁盘之类的。
|
跟硬件打交道,其实是在和寄存器打交道。
说白了,写驱动就是设置一堆寄存器。
设备节点可以被看作是kernel space和user space的一个接口。
在Linux中所有的设备都是一个文件,这样简化了用户空间的编程。
像字符设备,可以有类似文件的open/close/read/write,还有ioctl。
但是底层到底干了什么,就要看你在file_operations里的接口是如何
实现的。换句话说,你可以在驱动里不对任何硬件操作。但这不不影响
驱动的工作机制。事实上,如何你看LDD这本书就会发现,很多例子
都是实现工作的原理,并不是与硬件真的打交道的。
说白了,写驱动就是设置一堆寄存器。
设备节点可以被看作是kernel space和user space的一个接口。
在Linux中所有的设备都是一个文件,这样简化了用户空间的编程。
像字符设备,可以有类似文件的open/close/read/write,还有ioctl。
但是底层到底干了什么,就要看你在file_operations里的接口是如何
实现的。换句话说,你可以在驱动里不对任何硬件操作。但这不不影响
驱动的工作机制。事实上,如何你看LDD这本书就会发现,很多例子
都是实现工作的原理,并不是与硬件真的打交道的。
|
问题是,在我创建设备节点的时候 我到底 用的是的 哪个真实的物理设备呢?
答:一般字符设备和块设备的驱动程序会注册设备文件到/dev/目录下,但是一些虚拟设备和网卡驱动程序并不需要注册设备文件。所以,编写设备驱动程序,需要查说硬件的data sheet,data sheet描述了硬件细节,像寄存器的地址,作用,是否可读写,中断号等。参考:LDD书。
我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个主次设备号 254 0 到底指的是哪个物理设备呢?
答:参考:http://blog.csdn.net/unbutun/archive/2009/01/08/3732343.aspx,和内核源码。当应用程序用fopen()等标准API去访问时,内核会做处理好一切。当然我们访问网卡,应用程序是创建socket,而不用fopen()API。
答:一般字符设备和块设备的驱动程序会注册设备文件到/dev/目录下,但是一些虚拟设备和网卡驱动程序并不需要注册设备文件。所以,编写设备驱动程序,需要查说硬件的data sheet,data sheet描述了硬件细节,像寄存器的地址,作用,是否可读写,中断号等。参考:LDD书。
我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个主次设备号 254 0 到底指的是哪个物理设备呢?
答:参考:http://blog.csdn.net/unbutun/archive/2009/01/08/3732343.aspx,和内核源码。当应用程序用fopen()等标准API去访问时,内核会做处理好一切。当然我们访问网卡,应用程序是创建socket,而不用fopen()API。
|
在我创建设备节点的时候 我到底 用的是的 哪个真实的物理设备呢?
我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个 主次设备号 254 0 到底指的是哪个物理设备呢?
:
你随机找到了一个没有用到的主设备号?? 你找个其他的号试试。
主设备号代表的是驱动
次设备号则标识了驱动下特定的设备
你在编写驱动的时候register_chrdev()中将主次设备号 和file_operations 都关联进去
这里是重点,也就是说你的主次设备号要与register_chrdev()时的对应,否则是不行的
我只是随机找到了一个没有用到的主设备号 并将它和 设备文件节点关联起来了 那设备文件节点 又该怎么和 真实的物理 设备关联呢? 也就是 这个 主次设备号 254 0 到底指的是哪个物理设备呢?
:
你随机找到了一个没有用到的主设备号?? 你找个其他的号试试。
主设备号代表的是驱动
次设备号则标识了驱动下特定的设备
你在编写驱动的时候register_chrdev()中将主次设备号 和file_operations 都关联进去
这里是重点,也就是说你的主次设备号要与register_chrdev()时的对应,否则是不行的