当前位置: 技术问答>linux和unix
到底设备文件是什么
来源: 互联网 发布时间:2017-01-14
本文导语: 最近在看ioctl,对设备文件很疑惑,就是 真实的硬件设备和/dev/下的设备是怎样的关系 比如我们对硬件的读写一般就是通过iic,读写寄存器, 而对/dev下的设备文件read或write就不是对真实的硬件寄存器读或写 驱动为...
最近在看ioctl,对设备文件很疑惑,就是
真实的硬件设备和/dev/下的设备是怎样的关系
比如我们对硬件的读写一般就是通过iic,读写寄存器,
而对/dev下的设备文件read或write就不是对真实的硬件寄存器读或写
驱动为何创建这样的设备文件,有时一个硬件还创建多个设备文件,如config control什么的。
看了ldd中的例子scull,就是对内存操作,但这个例子是没有真实硬件设备对应的,并没介绍和
真实硬件关系9也许是我没有看到0,请大侠解惑
真实的硬件设备和/dev/下的设备是怎样的关系
比如我们对硬件的读写一般就是通过iic,读写寄存器,
而对/dev下的设备文件read或write就不是对真实的硬件寄存器读或写
驱动为何创建这样的设备文件,有时一个硬件还创建多个设备文件,如config control什么的。
看了ldd中的例子scull,就是对内存操作,但这个例子是没有真实硬件设备对应的,并没介绍和
真实硬件关系9也许是我没有看到0,请大侠解惑
|
1、设备文件是Linux里对硬件的抽象。
2、因为最早的Unix系统就是从一个文件系统演变而来的,这也是类Unix系统的一个独到之处。
3、从面相对象思想来考虑,设备在OS内必须抽象出来,又加上前边诞生的背景,造就了这一现状。不单单是设备被抽象成了文件,还有很多系统服务程序(进程)也被抽象成了文件(比如/proc下的好多东西)。
4、以文件形式统一管理,使得接口比较统一,操作设备可以和一般文件一样(不是很不可思议么?),不需要定义其它的操作标准。使得整个OS展现也比较简洁。
5、linux分的有内核态和用户态,内核态可以访问用户态,但是用户态却不可以直接访问内核态(可以系统调用),此时,通过文件来实现,也方便了用户空间和系统空间的交互(从某种意义上来说)。
6、通过同一以文件形式管理,使得驱动的实现接口也比较统一,如file_operation中定义的,这也是内核与驱动对接的地方,统一又简洁,不用为不同的硬件实现不同的接口。
我是这么理解的,希望我的回答对您有用。。。。。呵呵
2、因为最早的Unix系统就是从一个文件系统演变而来的,这也是类Unix系统的一个独到之处。
3、从面相对象思想来考虑,设备在OS内必须抽象出来,又加上前边诞生的背景,造就了这一现状。不单单是设备被抽象成了文件,还有很多系统服务程序(进程)也被抽象成了文件(比如/proc下的好多东西)。
4、以文件形式统一管理,使得接口比较统一,操作设备可以和一般文件一样(不是很不可思议么?),不需要定义其它的操作标准。使得整个OS展现也比较简洁。
5、linux分的有内核态和用户态,内核态可以访问用户态,但是用户态却不可以直接访问内核态(可以系统调用),此时,通过文件来实现,也方便了用户空间和系统空间的交互(从某种意义上来说)。
6、通过同一以文件形式管理,使得驱动的实现接口也比较统一,如file_operation中定义的,这也是内核与驱动对接的地方,统一又简洁,不用为不同的硬件实现不同的接口。
我是这么理解的,希望我的回答对您有用。。。。。呵呵
|
最后会关联上硬件的,就像你讲的像寄存器写值,以前写过一个简单led驱动,会根据应用程序中ioctl中关键字不一样而在驱动中用witch,case,区分像寄存器中写入不同的值来控制led
|
针对Linux kernel 2.6.X来说:
1. 设备文件是Linux里对硬件的抽象,是由kernel 启动完成后创建了init(PID = 1)的用户进程,
init再执行/etc/init.d/rcS等配置文件里启动了udevd或者mdevd服务程序(是kernel space里的进程), udevd扫描/sys目录(sysfs)中的uevent文件(linux驱动模型)而自动管理(在/dev目录创建或者删除)的设备文件。
2. 驱动创建设备文件的目的是让application调动驱动提供的服务,因为kernel space里,CPU工作在保护模式,不能直接访问硬件。一个驱动当然可以创建多个设备文件,只要驱动开发者愿意。
3. LDD, ULK是经典的好收,多看看,多思考,多调试。
1. 设备文件是Linux里对硬件的抽象,是由kernel 启动完成后创建了init(PID = 1)的用户进程,
init再执行/etc/init.d/rcS等配置文件里启动了udevd或者mdevd服务程序(是kernel space里的进程), udevd扫描/sys目录(sysfs)中的uevent文件(linux驱动模型)而自动管理(在/dev目录创建或者删除)的设备文件。
2. 驱动创建设备文件的目的是让application调动驱动提供的服务,因为kernel space里,CPU工作在保护模式,不能直接访问硬件。一个驱动当然可以创建多个设备文件,只要驱动开发者愿意。
3. LDD, ULK是经典的好收,多看看,多思考,多调试。
|
ioctl一般是字符设备操作。你就理解为那是一个文件,用户空间和内核空间都可以读,写,就可以了。这个名字是很迷惑人,哈哈。关键是理解它的模型。
|
设备文件就是与设备通信的接口,通过设备文件中的主次设备号以及其他信息可以找到对应的设备,然后可以进行具体的操作!
|
这个是肯定的,驱动和内核说到底是软件,还得通过硬件起作用
|
看看驱动是怎么写的,
file_operation
实现的read write ioctl 都由驱动提供,
用记打开一个/dev/xx文件夹, 然后read write ioctl 实现会调驱动提供的接口。
驱动的read write ioctl等可能就对寄存器进行操作了。
file_operation
实现的read write ioctl 都由驱动提供,
用记打开一个/dev/xx文件夹, 然后read write ioctl 实现会调驱动提供的接口。
驱动的read write ioctl等可能就对寄存器进行操作了。
|
和楼主一样,大家回到的很多书上都讲过,我觉得还没有真正回答楼主的问题。
同学习中。。。
我也有和楼主一样打破沙锅问到底的习惯。
|
PS,Linux里的文件分为:正规文件,设备文件,链接文件。设备类型分为:字符设备,块设备,网络设备(只有网络设备没有设备文件,因为由于历史原因,网络是socket接口,这由于tcp/ip协议栈最早是BSD系统中实现(Unix-like)。
知识量比较大,深入的理解需要系统的全面的知识!慢慢来,以后,你会理解的。
知识量比较大,深入的理解需要系统的全面的知识!慢慢来,以后,你会理解的。