首页 理论教育Linux内核与设备驱动:设备分类需求汇总

Linux内核与设备驱动:设备分类需求汇总

【摘要】:通常的分类方式是将设备分为字符设备、块设备和网络设备。这样的分类方式只是在高级抽象层中对主设备相关的分类,对具体的设备究竟如何划分并没有涉及。谈到设备分类,还会想到Linux内核中的drivers目录,drivers目录下的子目录本身就是对设备驱动的分类。图3-12驱动层次看过Webcam的例子后,再重新考虑设备分类的问题,硬件通过各种总线实现层次扩展。那么按照这种层次的需要进行设备分类,一定会有全新的视角。

通常的分类方式是将设备分为字符设备、块设备和网络设备。这种分类方式在Linux内核的层次分析中已经讨论过,三种设备面向完全不同的三种应用,并且它们的数据组织形式以及数据特点还是有着明显的差别的。字符设备的数据可以认为是流式时变的;块设备的数据是以块为数据单元的;网络设备的数据组织形式是和数据链路层的数据组织相关的。这样的分类方式只是在高级抽象层中对主设备相关的分类,对具体的设备究竟如何划分并没有涉及。

谈到设备分类,还会想到Linux内核中的drivers目录,drivers目录下的子目录本身就是对设备驱动的分类。图3-10是2.6.37 Linux内核drivers目录下的子目录,目录中可以看到抽象的设备(如char、block),也可以看到具体的设备(如media、rtc等),有些是和设备以及电源管理框架相关(如base、power、cpuidle、cpufreq、thermal等),还有基于代码维护考虑创建的目录(如staging该目录下的驱动还没有确认合并进代码主干)。看到这么多子目录并不清楚drivers目录下的驱动究竟是以什么原则进行子目录的设计,究竟应该如何将设备进行分类。由于Linux内核中drivers目录下子目录设置有代码管理的原因,每个子目录都对应着Linux内核的一个project。由于Linux内核是分布式开发的,通过porject进行目录的定义对代码管理来说是比较好的方式。随着Linux内核的发展,目录也在不断地增加,有时也会对目录进行整理移动,比如音频相关的框架和驱动就移动到内核的根目录下的sound

978-7-111-49426-3-Chapter03-10.jpg

图3-10 2.6.37 Linux内核drivers目录子目录

目录中。

还有一种设备分类,就是看看内核自己是怎么分的。这就要看看内核开放给我们的接口sys文件系统。新的Linux内核在提供信息方面已经做得比较完善,相应的设备信息可以通过sys文件系统一探究竟。下面是sys/class中的信息。

978-7-111-49426-3-Chapter03-11.jpg

978-7-111-49426-3-Chapter03-12.jpg

从中可以发现,sys/class的信息很多和drivers目录下的信息相似,而且信息量更大,细节更多。比如scsi就有四个相关的条目,spi也有三个相关的条目。这是由于总线中会有多种类型设备来保证设备互连。其他部分有些是横切功能(如dma、gpio等),有些是用户接口功能(如sound、graphic等),总之是包含所有类型的信息。(www.chuimin.cn)

讨论过数据操作形式的设备分类、驱动目录的分类以及sys文件系统分类等方法后,读者对实际设备如何工作、驱动如何实现仍然十分模糊,而且对实际设备的实现层次没有清晰的认识。这里首先来看看PC上的硬件层次。PC上的硬件层次如图3-11所示。

978-7-111-49426-3-Chapter03-13.jpg

图3-11 硬件层次图

以图中Webcam为例,硬件上从CPU到Webcam经过了PCI总线和USB总线,然后才连接Webcam,这样硬件实际就是Webcam、USB、PCI三层。硬件上有了层次的概念,同样的在驱动框架中也应该有对应的层次概念。驱动的层次如图3-12所示。图3-12中圈起来的部分是实现Webcam功能相关的模块,video_device是Webcam视频功能的驱动框架,uvc_driver则是Webcam的具体实现驱动,相应的usb_driver就是硬件层中USB的具体实现。这里有个问题,为什么没有PCI呢?PCI如何体现呢?驱动软件中已经将PCI封装到具体的USB总线实现中,毕竟USB设备本身并不关心其所在的PCI总线的实现细节,通过USB的实现屏蔽PCI的细节,可以让开发者只关注直接关联的接口实现,降低实现的复杂度。对硬件的层次关系与驱动的层次关系进行比较可以发现,硬件的层次关系是站在从设备互联的角度从处理器到功能设备,而软件驱动的层次角度是从功能到设备互联,刚好是反向过程。这样从硬件的层次需求出发来理解设备驱动会更清晰、更明确。

978-7-111-49426-3-Chapter03-14.jpg

图3-12 驱动层次

看过Webcam的例子后,再重新考虑设备分类的问题,硬件通过各种总线实现层次扩展。那么按照这种层次的需要进行设备分类,一定会有全新的视角。再考虑Webcam软件驱动的层次,首先是功能的抽象,然后是设备连接的抽象,这正好符合设备的两个基本需求———功能和互联。设备分类完全可以从这两个层次需求的角度考虑。