在 Linux 驱动开发过程中,经常会涉及到特定的文件系统路径,这些路径允许开发人员和系统管理员与驱动程序进行交互、配置和调试。了解这些路径对开发和调试驱动程序至关重要。以下是一些常见的路径及其作用的详细解释:
一. /sys 目录
sysfs 文件系统的挂载点,sysfs 是一个内核提供的假文件系统,它呈现内核对象及其属性,使用户空间可以通过文件系统接口与内核交互。常用子目录
1./sys/class
包含设备类(device classes)的目录,每个类代表一类设备,如 net(网络设备)、block(块设备)、tty(终端设备)等。例如,网络设备可以在 /sys/class/net/ 下找到。应用层可以操作硬件设备大部分也是通过这个目录下进行的,如gpio,pwm目录可以导出设备进而控制它
ata_device drm leds ptp tee ata_link extcon mdio_bus pwm thermal ata_port firmware mem pxp_device tty backlight gpio misc rc ubi bdi graphics mmc_host regulator udc block hwmon mtd remoteproc usb_role bluetooth i2c-dev net rtc vc devcoredump ieee80211 phy scsi_device vtconsole devlink input power_supply scsi_disk wakeup dma lcd pps scsi_host watchdog
2./sys/block
包含块设备的信息,每个块设备都有一个对应的目录。例如,磁盘设备 sda 可以在 /sys/block/sda/ 找到。
3./sys/bus
包含所有总线类型(bus types)的目录,如 pci、usb、platform 等。每个总线类型目录都包含两个子目录:devices(该总线下的所有设备)和 drivers(该总线下的所有驱动程序)。
clockevents dp-aux hid mmc rpmsg serio usb clocksource event_source i2c mmc_rpmb scsi soc virtio container genpd iio nvmem sdio tee workqueue cpu gpio mdio_bus platform serial ulpi
4./sys/bus/*/drivers
包含 * 总线的驱动程序目录,每个平台驱动程序都有一个对应的目录。例如,如果你有一个叫 my_driver 的平台驱动程序,那么它的目录可能是 /sys/bus/*/drivers/my_driver/。
在这个目录下,你可以找到与该驱动程序相关的设备符号链接和驱动程序属性文件。文件夹名字是由platform_driver.device_driver.name 决定的
root@fl-imx6ull:~# ls -alh /sys/bus/platform/drivers/leds-gpio/ --w------- 1 root root 4.0K Aug 21 05:36 bind --w------- 1 root root 4.0K Aug 21 05:36 uevent --w------- 1 root root 4.0K Aug 21 05:36 unbind
5./sys/bus/*/device=>/sys/devices/platform
包含 * 总线的驱动程序目录,该目录中的内容表示当前系统中所有通过平台总线注册的设备。每个设备都有一个对应的目录,目录名通常是设备的名称或类型。这些目录包含了一些文件和子目录,用于描述设备的属性、状态和配置,其都是软连接,指向/sys/devices/platform
ls -alh /sys/bus/platform/devices/leds lrwxrwxrwx 1 root root 0 Aug 21 05:29 /sys/bus/platform/devices/leds -> ../../../devices/platform/leds ls -alh /sys/devices/platform/leds/ drwxr-xr-x 3 root root 0 Aug 21 05:29 . drwxr-xr-x 15 root root 0 Aug 21 05:29 .. -rw-r--r-- 1 root root 4.0K Aug 21 05:52 driver_override -r--r--r-- 1 root root 4.0K Aug 21 05:52 modalias lrwxrwxrwx 1 root root 0 Aug 21 05:52 of_node -> ../../../firmware/devicetree/base/leds //设备树 drwxr-xr-x 2 root root 0 Aug 21 05:52 power lrwxrwxrwx 1 root root 0 Aug 21 05:52 subsystem -> ../../../bus/platform lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:209c000.gpio -> ../../virtual/devlink/platform:209c000.gpio--platform:leds lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:20ac000.gpio -> ../../virtual/devlink/platform:20ac000.gpio--platform:leds -rw-r--r-- 1 root root 4.0K Aug 21 05:29 uevent -r--r--r-- 1 root root 4.0K Aug 21 05:52 waiting_for_supplier
6./sys/bus/*/device=>/sys/devices/platform
包含 * 总线的驱动程序目录,该目录中的内容表示当前系统中所有通过平台总线注册的设备。每个设备都有一个对应的目录,目录名通常是设备的名称或类型。这些目录包含了一些文件和子目录,用于描述设备的属性、状态和配置,其都是软连接,指向/sys/devices/platform
ls -alh /sys/bus/platform/devices/leds lrwxrwxrwx 1 root root 0 Aug 21 05:29 /sys/bus/platform/devices/leds -> ../../../devices/platform/leds ls -alh /sys/devices/platform/leds/ drwxr-xr-x 3 root root 0 Aug 21 05:29 . drwxr-xr-x 15 root root 0 Aug 21 05:29 .. -rw-r--r-- 1 root root 4.0K Aug 21 05:52 driver_override -r--r--r-- 1 root root 4.0K Aug 21 05:52 modalias lrwxrwxrwx 1 root root 0 Aug 21 05:52 of_node -> ../../../firmware/devicetree/base/leds //设备树 drwxr-xr-x 2 root root 0 Aug 21 05:52 power lrwxrwxrwx 1 root root 0 Aug 21 05:52 subsystem -> ../../../bus/platform lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:209c000.gpio -> ../../virtual/devlink/platform:209c000.gpio--platform:leds lrwxrwxrwx 1 root root 0 Aug 21 05:52 supplier:platform:20ac000.gpio -> ../../virtual/devlink/platform:20ac000.gpio--platform:leds -rw-r--r-- 1 root root 4.0K Aug 21 05:29 uevent -r--r--r-- 1 root root 4.0K Aug 21 05:52 waiting_for_supplier
7./sys/devices
按设备的物理拓扑结构组织的目录,包括所有的设备节点。
设备根据它们在系统中的物理层次关系排列,便于了解设备之间的关联。
armv7_cortex_a7 breakpoint mmdc platform soc0 software system virtual
8./sys/kernel/debug
包含调试信息的目录,只有在内核启用了调试功能(CONFIG_DEBUG_FS)时才会出现。
开发人员可以在这个目录中找到内核和驱动程序的详细调试信息。
二. /proc 目录
/proc 目录是 procfs 文件系统的挂载点,procfs 提供了内核和进程的信息。
常用子目录
1./proc/devices
列出已注册的字符设备和块设备及其主次设备号。
2./proc/device-tree=>/sys/firmware/devicetree/base
设备树,如果要查看设备树可以通过这个文件夹进行查询
ls /sys/firmware/devicetree/base #address-cells #size-cells clock-cli cpus pmu sound clock-di0 leds pxp_v4l2 timer aliases clock-di1 memory regulators backlight clock-osc model reserved-memory chosen compatible name soc
3./proc/interrupters
显示系统中断的详细信息,包括中断向量和处理这些中断的驱动程序名称。
4./proc/ioports
列出所有已注册的 I/O 端口范围及其对应的设备。
5./proc/meminfo
提供系统内存使用情况的信息。
三. /dev 目录
/dev 目录是设备文件的挂载点,设备文件通过这些节点允许用户空间访问内核中的设备驱动程序。
/dev/sda
表示第一个 SCSI 磁盘设备。
块设备通常在 /dev 下创建对应的设备节点,用户可以通过这些设备节点与硬件交互。
四. 其他相关路径
/etc/udev/rules.d
包含 udev 规则文件,用于动态创建和管理 /dev 下的设备节点。
udev 规则可以定制化设备节点的命名和权限,甚至能触发特定的用户空间脚本。
/lib/modules/[kernel_version]
包含当前内核版本的模块(驱动程序),每个模块文件通常以 .ko 结尾。
通过 modprobe、insmod 和 rmmod 等命令加载或卸载这些模块。
在驱动开发中的应用
调试与测试:通过访问 /sys 和 /proc 下的文件,驱动开发人员可以获取实时的驱动程序和设备的状态。
配置与控制:利用 sysfs 暴露的属性文件,用户可以动态地配置和控制驱动程序的行为。
设备节点管理:通过 udev 规则和 mknod 命令,开发人员和系统管理员可以管理 /dev 下的设备节点,方便设备的访问和权限管理。
总结来说,在 Linux 驱动开发过程中,熟悉和运用这些路径能够极大地帮助开发人员进行调试、配置、测试和管理驱动程序及其关联的硬件设备。