甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
上海腾科教育干货分享Linux设备驱动模型和sysfs文件系统
发布日期:2020-09-15 10:28:57阅读次数:

上海腾科教育小编今天带领大家学习linux设备驱动模型基础知识及源代码书写方法,通过此次学习大家也能清楚知识点。

Linux内核在2.6版本中引入设备驱动模型,简化了驱动程序的编写。Linux设备驱动模型包含设备(device)总线(bus)类(class)驱动(driver),它们之间相互关联。其中设备(device)驱动(driver)通过总线(bus)绑定在一起。

Linux内核中,分别用 bus_type、 device_driver和 device结构来描述总线、驱动和设备,结构体定义详见 linux/device.h。设备和对应的驱动必须依附于同一种总线,因此 device_driver和 device结构中都包含 struct bus_type指针。

Linux sysfs 是一个虚拟的文件系统,它把连接在系统上的设备和总线组织成为一个分级的文件,可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性。

sysfs展示出设备驱动模型中各个组件的层次关系,某个系统上的sysfs顶层目录展示如下:

 1 /sys$ ll  2 total 0  3 drwxr-xr-x 2 root root 0 Aug 20 15:27 block/  4 drwxr-xr-x 29 root root 0 Aug 20 15:27 bus/  5 drwxr-xr-x 61 root root 0 Aug 20 15:27 class/  6 drwxr-xr-x 4 root root 0 Aug 20 15:27 dev/  7 drwxr-xr-x 14 root root 0 Aug 20 15:27 devices/  8 drwxr-xr-x 4 root root 0 Aug 20 15:27 firmware/  9 drwxr-xr-x 8 root root 0 Aug 20 15:27 fs/ 10 drwxr-xr-x 2 root root 0 Sep 2 17:08 hypervisor/ 11 drwxr-xr-x 8 root root 0 Aug 20 15:27 kernel/ 12 drwxr-xr-x 147 root root 0 Aug 20 15:27 module/ 13 drwxr-xr-x 2 root root 0 Aug 20 15:27 power/

重要子目录介绍:

  • block:    包含所有的块设备,如ram,sda等
  • bus:     包含系统中所有的总线类型,如pci,usb,i2c等
  • class:    包含系统中的设备类型,如input,pci_bus,mmc_host等
  • dev:     包含两个子目录:char和block,分别存放字符设备和块设备的主次设备号(major:minor),指向 /sys/devices 目录下的设备
  • devices:  包含系统所有的设备

sysfs中显示的每一个对象都对应一个 kobject结构(完整定义位于 linux/kobject.h ,结构内部包含一个 parent 指针),而另一个相联系的结构为 kset 。 kset 是嵌入相同类型结构的 kobject 对象的集合。 内核用 kobject 、 kset 和 parent 之间的关系将各个对象连接起来组成一个分层的结构体系,从而与模型化的子系统相匹配。(有机会详细介绍)

sysfs中能清晰地看出 device 、 driver 和 bus 的相互联系,以某系统上PCI总线上的igb驱动为例。  /sys/bus/pci/ 下存在 devices 和 drivers 两个目录,分别包含了依附于PCI总线上的设备和驱动。进入igb驱动目录,可以发现存在指向设备的链接。

1 /sys/bus/pci/drivers/igb$ ll 2 total 0 3 ... 0 Sep 2 17:08 0000:07:00.0 -> ../../../../devices/pci0000:00/0000:00:1c.4/0000:07:00.0/ 4 ... 0 Sep 2 17:08 0000:07:00.1 -> ../../../../devices/pci0000:00/0000:00:1c.4/0000:07:00.1/ 5 ... 

对应地,在 /sys/devices/ 目录下,可以看到设备存在一个指向igb的 driver 项:

1 /sys/devices/pci0000:00/0000:00:1c.4/0000:07:00.0$ ll 2 total 0 3 ... 4 lrwxrwxrwx 1 root root 0 Aug 20 15:27 driver -> ../../../../bus/pci/drivers/igb/ 5 ...

同样地, /sys/bus/pci/devices 目录下可以找到指向同样设备的一个链接:

1 /sys/bus/pci/devices$ ll 2 total 0 3 ... 4 ... 0 Aug 20 15:27 0000:07:00.0 -> ../../../devices/pci0000:00/0000:00:1c.4/0000:07:00.0/ 5 ... 0 Aug 20 15:27 0000:07:00.1 -> ../../../devices/pci0000:00/0000:00:1c.4/0000:07:00.1/ 6 ...

对于早期的Linux内核(2.6版本以前)来说,通常在驱动代码中xxx_driver 注册过程中调用 probe() 函数来对设备进行初始化。

引入Linux设备驱动模型下,设备和驱动可以分开注册,依赖总线完成相互绑定。系统每注册一个设备的时候,会寻找与之匹配的驱动;相反,系统每注册一个驱动的时候,会寻找与之匹配的设备。这个过程中,设备和驱动的匹配工作由总线完成。

下文中将会用关键的内核源码说明驱动和设备间匹配机制的实现,分析的过程中以platform总线为例。【如果只想了解大致过程,可提前转至最后一节:总结】

platform总线是一种虚拟的总线,与之相对应的是PCII2CSPI等实体总线。引入虚拟platform总线是为了解决某些设备无法直接依附在现有实体总线上的问题,例如SoC系统中集成的独立外设控制器,挂接在SoC内存空间的外设等等。

上海腾科教育科技有限公司聚焦ICT人才培养和教育服务、培养数字化时代的新型ICT人才、促进良性的ICT人才生态发展,提供面授教育、在线教育、IT人才培养与就业、高校专业共建与实验室建设、企业人才定制培养,以及教育科技领域内的技术开发、咨询、服务以及解决方案,专注高校ICT课程课件研发、基于华为公有云的云实验实训平台建设,致力于ICT技术在高等院校的引进、开发和推广,是一家全国性的专业ICT行业技术认证服务公司。

腾科教育是华为授权的培训合作伙伴,专业提供华为ICT技术架构认证、平台与服务认证、行业服务认证等华为职业认证服务,连续多年荣获华为年度最佳合作伙伴贡献奖、华为优秀战略合作伙伴、上海HCIE精英俱乐部伙伴,连续多年举办腾科技术嘉年华华为专场,并协办华为ICT大赛、华为生态伙伴精英赛伙伴赛分赛场、华为人才双选会上海场等活动和赛事,提供面向华为生态合作伙伴和ICT学员的人才供需双选平台及ICT学员就业通道,培养ICT行业所需创新型、融合型人才。