概念

sysfs 是 Linux 提供的一种虚拟文件系统,他以一种层次的方式组织数据,向用户空间提供内核中的信息,让用户可以通过文件系统接口访问和操作内核对象的属性.

他提供了一种统一管理的接口,通常在 /sys 目录下挂载.

  • /sys/class: 包含了设备类别的子目录.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    jvle@jvle-ThinkPad-X1-Carbon-Gen-8:~/Desktop/works/temp/linux_files/modules/kobjs$ ls /sys/class/
    accel bsg drm hwmon lirc nd platform-profile pwm scsi_device tpm vc
    ata_device devcoredump drm_dp_aux_dev i2c-dev mdio_bus net powercap rapidio_port scsi_disk tpmrm video4linux
    ata_link devfreq extcon ieee80211 mei nvme power_supply rc scsi_generic tty virtio-ports
    ata_port devfreq-event firmware input mem nvme-generic ppdev regulator scsi_host typec vtconsole
    backlight devlink firmware-attributes intel_pmt misc nvme-subsystem ppp remoteproc sound typec_mux wakeup
    bdi dma gpio intel_scu_ipc mmc_host pci_bus pps retimer spi_master usbmisc watchdog
    block dma_heap graphics iommu msr pci_epc printer rfkill spi_slave usb_power_delivery wmi_bus
    bluetooth dmi hidraw leds mtd phy ptp rtc thermal usb_role
  • /sys/devices: 包含了系统中所有设备的子目录

    1
    2
    3
    jvle@jvle-ThinkPad-X1-Carbon-Gen-8:~/Desktop/works/temp/linux_files/modules/kobjs$ ls /sys/devices/
    breakpoint cstate_core faux intel_bts isa LNXSYSTM:00 pci0000:00 pnp0 software tracepoint uncore_cbox_0 uncore_cbox_2 uncore_imc virtual
    cpu cstate_pkg i915 intel_pt kprobe msr platform power system uncore_arb uncore_cbox_1 uncore_cbox_3 uprobe
  • /sys/bus: 包含了总线类型的子目录

    1
    2
    3
    4
    5
    jvle@jvle-ThinkPad-X1-Carbon-Gen-8:~/Desktop/works/temp/linux_files/modules/kobjs$ ls /sys/bus/
    ac97 clockevents dax gpio isa mei mmc parport platform sdio snd_seq thunderbolt vme xen-backend
    acpi clocksource edac hdaudio machinecheck memory nd pci pnp serial soc typec wmi
    auxiliary container event_source hid mdio_bus memory_tiering node pci-epf rapidio serial-base soundwire usb workqueue
    cec cpu faux i2c media mipi-dsi nvmem pci_express scsi serio spi virtio xen

现在要设置 gpio,我们可以通过 /sys/class 或者 /sys/devices 来控制.

通常来说,kobj 被嵌入在各个结构体中,比如 platform, device…, 因此我们可以把这些结构体看作是 kobj 的派生类.