Linux是一个宏内核,包括了各类设备的驱动。为了减少设备多样性带来的Linux内核驱动开发的复杂度,以及处理热插拔和电源管理等,在Linux内核中引入了设备模型,抽象出一套标准的数据结构和接口,简化Linux内核驱动的开发。
Linux内核设备模型位于/sys
目录下,sysfs文件系统针对设备模型向用户空间展示驱动设备的层次结构。
root@linaro-alip:/sys# ls
block bus class dev devices firmware fs kernel module power rk8xx
Linux内核设备模型包括:总线(BUS)、设备(Device)、驱动(Driver)和设备类(Class)。
image.png1、总线(BUS)
用于连接设备(Device)和驱动(Driver),提供与总线相关的设备和驱动注册方法。bus
位于linux系统的/sys
目录下,包含了内核中各种总线类型的平面目录布局。
root@linaro-alip:/sys/bus# ls
amba container i2c mipi-dsi pci_express serio workqueue
cec cpu iio mmc platform snd_seq
clockevents event_source mdio_bus nvmem scsi spi
clocksource hid media pci sdio usb
每个总线目录(例:i2c、platform
等)都包含devices/
和drivers/
。
2、设备(Device)
包含了系统中出现的每个设备的符号链接,指向/sys/devices
下的设备目录,对应系统中的硬件,用于描述设备的名称、资源、属性等信息。
root@linaro-alip:/sys/bus/platform/devices# ls -l
total 0
lrwxrwxrwx 1 root root 0 Nov 3 17:16 alarmtimer -> ../../../devices/platform/alarmtimer
lrwxrwxrwx 1 root root 0 Nov 3 17:16 amba -> ../../../devices/platform/amba
lrwxrwxrwx 1 root root 0 Nov 3 17:16 armv7sec.0 -> ../../../devices/platform/armv7sec.0
lrwxrwxrwx 1 root root 0 Nov 3 17:16 cpufreq-dt -> ../../../devices/platform/cpufreq-dt
lrwxrwxrwx 1 root root 0 Nov 3 17:16 ddr_timing -> ../../../devices/platform/ddr_timing
lrwxrwxrwx 1 root root 0 Nov 3 17:16 display-subsystem -> ../../../devices/platform/display-subsystem
lrwxrwxrwx 1 root root 0 Nov 3 17:16 dummy_cpll -> ../../../devices/platform/dummy_cpll
3、驱动(Driver)
包含了每个已为特定总线上的设备而挂载的驱动程序的目录,对应硬件设备的驱动程序。包括:探测、初始化、设备基本操作、电源管理等。
root@linaro-alip:/sys/bus# find . -name drivers
./cec/drivers
./cpu/drivers
./i2c/drivers
./hid/drivers
./iio/drivers
./mmc/drivers
./pci/drivers
./spi/drivers
./usb/drivers
./amba/drivers
./scsi/drivers
./sdio/drivers
./clocksource/drivers
./media/drivers
./nvmem/drivers
./serio/drivers
./event_source/drivers
./workqueue/drivers
./snd_seq/drivers
./container/drivers
./mipi-dsi/drivers
./pci_express/drivers
./platform/drivers
./mdio_bus/drivers
./clockevents/drivers
4、设备类(Class)
为了简化复杂设备驱动开发,可使用设备类实现这些设备驱动的的公共部分。
root@linaro-alip:/sys/class# ls
arvo dma iommu net rkvdec spi_transport
ata_device drm isku nvme rkvr spidev
ata_link dvb kone pci_bus rkwifi switch
ata_port extcon koneplus phy rtc thermal
backlight gpio konepure power_supply ryos tpm
bdi graphics kovaplus pps savu tty
block hidraw leds ptp scsi_device udc
bluetooth hwmon mdio_bus pwm scsi_disk usbmon
bsg i2c-adapter mem pyra scsi_host vc
devcoredump i2c-dev misc rc sound video4linux
devfreq ieee80211 mmc_host regulator spi_host vpu_service
devfreq-event input mtd rfkill spi_master vtconsole
注:本文基于RockPI 4A的Debian系统。
参考:
1、Documentation/zh_CN/filesystems/sysfs.txt
网友评论