目录
应用层操控硬件的两种方式:1.设备节点 2.sysfs 文件系统
1 设备节点
Linux 系统下,一切皆文件!
应用层是通过文件 I/O 的方式来实现操控底层硬件,
设备文件是各种硬件设备向应用层提供的一个接口,
应用层通过对设备文件的 I/O
操作来操控硬件设备。
所以设备文件其实是与硬件设备相互对应的。
设备文件通常在/dev/
目录下,我们也把
/dev
目录下的文件称为设备节点。
2 sysfs 文件系统
sysfs 是一个基于内存的文件系统,同
devfs
、
proc
文件系统一样,称为虚拟文件系统;
它的作用是
将内核信息以文件的方式提供给应用层使用。
sysfs 文件系统的主要功能便是对系统设备进行管理,
它可以产生一个包含所有系统硬件层次的视图。
sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件,展示设备驱动模型中各组件的层次关系。
sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,
以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。
sysfs 与/sys
sysfs 文件系统挂载在/sys 目录下
系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而 /sys/bus、/sys/class、/sys/dev 分别将设备按照挂载的总线类型、功能分类以及设备号的形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices 中。
设备的一些属性、数据通常会通过设备目录下的文件体现出来,也就是说设备的数据、属性会导出到用户空间,以文件形式为用户空间提供对这些数据、属性的访问支持,可以把这些文件称为属性文件;读这些属性文件就表示读取设备的属性信息,相反写属性文件就表示对设备的属性进行设置、以控制设备的状态。
3 总结
应用层想要对底层硬件进行操控,通常可以通过两种方式:
- /dev/目录下的设备文件(设备节点);
- /sys/目录下设备的属性文件。
具体使用哪种方式需要根据不同功能类型设备进行选择,
有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;
当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间
sysfs
文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED
、
GPIO
等。
但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD
等、触摸屏、摄像头等。
4 标准接口与非标准接口
Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念;
Linux
针对各种常见的设备进行分类,譬如 LED
类设备、输入类设备、
FrameBuffer
类设备、
video
类设备、
PWM
设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架,这个就叫做
设备驱动框架
。
设备驱动框架为驱动开发和应用层提供了一套
统一的接口规范
,譬如对 LED
类设备来说,内核提供了 LED
设备驱动框架,驱动工程师编写
LED
驱动时,使用
LED
驱动框架来开发自己的
LED
驱动程序,这样做的好处就在于,能够对上层应用层提供统一、标准化的接口、同时又降低了驱动开发工程师的难度。
编写 LED
驱动程序并不仅仅只能使用内核设计的
LED
设备驱动框架,不用内核的
LED
驱动框架也是可以开发出 LED
驱动程序的,但如果你这样写,使用这个驱动程序注册的
LED
那就不是标准设备了,因为该驱动程序向应用层提供的接口并不是统一、标准化接口。
除此之外,还有很多硬件外设,尤其是嵌入式系统中所使用到的这些硬件外设,它们可能并不属于
Linux 系统所规划的设备分类当中的任何一种设备类型,譬如在 Linux
系统中,有一种设备类型叫杂散
/
杂项类设备
(misc device
),大家可以想一想为啥叫杂散类设备,说明这种设备既不属于这种设备类型、又不属于另一种设备类型,无奈只能把它归为杂项类。
因为一个计算机系统所能够连接、使用的外设实在太多了,不可能每一种外设都能够精准地分类到某一个设备类型中,通常把这些无法进行分类的外设就称为杂项设备,杂项设备驱动程序向应用层提供的接口通常都不是标准化接口、它是一种
非标准接口
,具体如何去操控这个设备通常只有驱动工程师知道。所以在嵌入式系统中,很多硬件外设的驱动程序都是定制的。