Linux节点创建API与路径对应关系
以下是包含 软连接(符号链接) 在内的完整节点创建API与节点(含链接)对应关系,覆盖sysfs核心关联、设备树映射、总线/模块链接等场景,明确每个链接的创建机制、路径及作用:
一、sysfs 核心节点与软连接(最关键的设备模型关联)
sysfs通过软连接构建设备“逻辑-物理-总线”的关联网络,这些链接由内核自动创建(无需驱动显式调用API),是设备模型的核心特性。
创建机制/API | 节点/链接路径 | 类型 | 说明 |
---|---|---|---|
1. 设备类与物理设备的链接 | |||
device_create(cls, ..., name) | /sys/class/[cls_name]/[dev_name]/device → 指向 /sys/devices/[phys_dev_path] | 软连接 | 逻辑设备节点(类目录下)通过device 链接指向其对应的物理设备节点(/sys/devices/ 下),实现“逻辑分类→物理实体”的追溯。例如:/sys/class/net/eth0/device → /sys/devices/pci0000:00/.../eth0 。 |
2. 物理设备与总线的链接 | |||
bus_register(bus) + 设备注册 | /sys/devices/[phys_dev_path]/subsystem → 指向 /sys/bus/[bus_name] | 软连接 | 物理设备节点通过subsystem 链接指向所属总线目录,表明设备挂载的总线类型。例如:USB设备的subsystem → /sys/bus/usb 。 |
3. 总线设备与类的链接 | |||
总线驱动框架自动创建 | /sys/bus/[bus_name]/devices/[dev_name] → 指向 /sys/devices/[phys_dev_path] | 软连接 | 总线目录下的devices 子目录通过链接映射/sys/devices/ 下的设备,方便按总线枚举设备。例如:/sys/bus/pci/devices/0000:00:1f.0 → /sys/devices/pci0000:00/0000:00:1f.0 。 |
4. 设备树与物理设备的链接 | |||
设备树解析 + 物理设备注册 | /sys/devices/[phys_dev_path]/of_node → 指向 /sys/firmware/devicetree/base/[dts_node] | 软连接 | 若设备由设备树描述,物理设备节点通过of_node 链接指向对应的设备树节点,实现“物理设备→DTS定义”的关联。例如:/sys/devices/platform/12340000.uart/of_node → /sys/firmware/devicetree/base/uart0@12340000 。 |
5. 驱动与设备的链接 | |||
driver_register(drv) | /sys/bus/[bus_name]/drivers/[drv_name]/[dev_name] → 指向 /sys/devices/[phys_dev_path] | 软连接 | 总线驱动目录下的设备链接,表明该驱动绑定的设备。例如:/sys/bus/usb/drivers/usb-storage/sda → /sys/devices/.../sda 。 |
二、sysfs 节点创建API与对应实体节点(含属性)
以下API直接创建sysfs的实体节点(目录/文件),软连接基于这些节点自动生成:
API | 实体节点路径 | 类型 | 关联的软连接 |
---|---|---|---|
kobject_create_and_add(name, parent_kobj) | /sys/[parent_path]/name/ (如 parent_kobj=kernel_kobj 时为 /sys/kernel/name/ ) | 目录 | 无自动链接(自定义节点,需手动创建属性)。 |
sysfs_create_file(kobj, &attr) | /sys/[kobj_path]/attr_name | 属性文件 | 无链接,直接作为节点的属性(如 /sys/kernel/my_node/val )。 |
class_create(owner, name) | /sys/class/name/ | 类目录 | 类目录下的设备节点通过device 链接指向物理设备(见上表1)。 |
device_create(...) | /sys/class/[cls_name]/[dev_name]/ | 设备逻辑节点 | 含device (指向物理设备)、subsystem (指向类目录)等链接。 |
platform_device_register(pdev) | /sys/devices/platform/[dev_name]/ | 物理设备节点 | 含subsystem (指向platform总线)、of_node (指向设备树节点,若有)等链接。 |
bus_register(bus) | /sys/bus/[bus_name]/ (含devices/ 和drivers/ 子目录) | 总线目录 | devices/ 下的链接指向/sys/devices/ 设备(见上表3)。 |
三、设备树节点(无显式API,内核自动生成链接)
设备树节点由内核解析DTS生成,其链接用于关联物理设备:
创建机制 | 节点/链接路径 | 类型 | 说明 |
---|---|---|---|
内核解析DTS | /sys/firmware/devicetree/base/[dts_node]/ (如 /sys/firmware/devicetree/base/uart0@12340000/ ) | 目录 | 含compatible 、reg 等静态属性文件(只读)。 |
物理设备注册时自动创建 | /sys/firmware/devicetree/base/[dts_node]/device → 指向 /sys/devices/[phys_dev_path] | 软连接 | 设备树节点通过device 链接指向对应的物理设备节点(若设备已被内核探测并初始化),实现“DTS定义→物理实例”的映射。 |
四、模块(module)相关节点与链接
内核模块加载后会在sysfs生成节点,链接指向模块的代码段、依赖等:
创建机制 | 节点/链接路径 | 类型 | 说明 |
---|---|---|---|
模块加载(insmod ) | /sys/module/[mod_name]/ | 模块目录 | 含sections/ (代码段链接)、drivers/ (关联的驱动链接)等子目录。 |
模块自动创建 | /sys/module/[mod_name]/sections/.text → 指向模块.text段在内存中的地址 | 软连接 | 暴露模块代码段的内存位置,用于调试(如kallsyms 定位符号)。 |
模块绑定驱动 | /sys/module/[mod_name]/drivers/[bus]:[drv_name] → 指向 /sys/bus/[bus]/drivers/[drv_name] | 软连接 | 模块目录通过链接关联其注册的驱动,表明模块与驱动的从属关系。 |
五、/dev 设备文件与软连接(udev/mdev 生成)
/dev
下的软连接由udev规则定义,基于sysfs信息创建:
触发机制 | 节点/链接路径 | 类型 | 说明 |
---|---|---|---|
device_create(...) + udev | /dev/[dev_name] (如 /dev/ttyUSB0 ) | 设备文件 | 由udev基于sysfs的dev 文件(设备号)创建,无自动链接(需手动通过udev规则定义)。 |
udev规则(SYMLINK+="xxx" ) | /dev/[symlink_name] → 指向 /dev/[dev_name] | 软连接 | 自定义符号链接(如 /dev/usbserial → /dev/ttyUSB0 ),方便用户通过固定名称访问设备。 |
六、proc/debugfs 中的节点(无自动软连接,可手动创建)
proc和debugfs以功能为主,软连接较少,通常手动创建:
API | 节点路径 | 类型 | 软连接说明 |
---|---|---|---|
proc_create(name, ...) | /proc/[name] (如 /proc/myproc ) | 文件 | 无自动链接,可通过ln -s 手动创建(如 /proc/self → /proc/[pid] ,内核默认创建)。 |
debugfs_create_file(...) | /sys/kernel/debug/[dir]/name (如 /sys/kernel/debug/my_debug/val ) | 文件 | 无自动链接,调试用,通常不创建链接。 |
总结:软连接的核心作用
- 关联多维度信息:通过
device
、subsystem
、of_node
等链接,将“逻辑分类(class)→物理设备(devices)→总线(bus)→设备树(DTS)”串联,形成完整的设备关系网。 - 简化访问路径:总线目录下的设备链接(如
/sys/bus/pci/devices/
)、模块与驱动的链接,让用户/工具无需遍历整个/sys/devices/
即可找到目标设备。 - 追溯设备根源:
of_node
链接让物理设备可追溯到DTS定义,subsystem
链接明确设备所属总线,为调试和驱动绑定提供关键线索。
所有软连接均由内核或udev自动维护,驱动无需显式调用API创建,只需正确注册设备/类/总线,内核会自动生成这些关联,确保sysfs的“可导航性”。