Linux 内核设备模型与驱动框架解析 ——以 rk-pcie 为例

Linux 内核设备模型与驱动框架解析 ------以 rk-pcie 为例

1. 内核设备模型 (Device Model)

Linux 内核提供了一套统一的 设备模型 ,用于管理硬件设备与驱动的关系。它的核心思想是 设备与驱动分离,通过总线 (bus) 来完成匹配。

  • device:设备对象,代表一个具体硬件(如 PCIe 网卡、I²C 传感器)。
  • driver:驱动对象,代表能管理某类设备的软件模块。
  • bus:总线对象,负责在设备和驱动之间做匹配(PCI、USB、I²C、SPI、platform 等)。

这种抽象使得设备和驱动可以独立开发、加载和卸载,支持热插拔和统一的 sysfs 管理。


2. 驱动框架 (Driver Framework)

不同类型的总线和设备有各自的驱动框架,提供统一的 API 和开发规范:

  • PCI 驱动框架:负责 PCI/PCIe 设备的枚举、资源分配、驱动绑定。
  • USB 驱动框架:负责 USB 设备的枚举、配置、驱动绑定。
  • I²C/SPI 驱动框架:负责总线设备的地址匹配、驱动绑定。
  • Platform 驱动框架:负责 SoC 内部片上外设(GPIO、UART、PCIe 控制器等)。

👉 可以理解为:驱动框架就是行业标准接口,不同总线类型的驱动都按各自的框架来写。


3. Platform 驱动框架

Platform 驱动是 Linux 内核里的一类特殊驱动,用来管理 SoC 内部的片上外设。这些外设没有统一的标准总线协议,因此需要通过设备树 (Device Tree, DTS) 或 ACPI 静态描述。

  • 特点

    • 没有标准化的枚举机制。
    • 驱动和设备是一一对应,加载时自动绑定。
    • 通常不暴露 bind/unbind 文件,因为不需要用户态手动操作。
  • 例子

    • rk-pcie → Rockchip SoC 的 PCIe 控制器驱动。
    • dw-mmc → DesignWare 的 SD/MMC 控制器驱动。
    • uart-pl011 → ARM SoC 的 UART 控制器驱动。

👉 可以理解为:platform 驱动框架是 Linux 内核对非标准片上外设的一种统一抽象。


4. rk-pcie 的角色

rk-pcie 驱动是一个 platform 驱动,它的作用是初始化 Rockchip SoC 内部的 PCIe 控制器,并把它接入到标准的 PCI 总线框架。

  • 流程
    1. rk-pcie 驱动加载 → 初始化 PCIe 控制器。
    2. 在 PCI 总线框架里注册一个 root port(总线入口)。
    3. PCI 总线开始枚举下游设备 → /sys/bus/pci/devices/ 下出现设备对象。
    4. PCI 驱动匹配这些设备 → 功能节点出现(如 /sys/class/net/eth0/sys/class/block/nvme0n1)。

👉 rk-pcie 驱动的作用是 把 SoC 内部的 PCIe 控制器挂到标准 PCI 总线上,而不是直接管理所有 PCIe 外设。


5. bind/unbind 的意义与差异

  • bind/unbind 文件 :位于 /sys/bus/<bus>/drivers/<driver>/,用于手动绑定或解绑设备与驱动。
  • PCI/USB 驱动:常见,支持动态匹配,方便测试和切换。
  • Platform 驱动 :通常固定绑定,不暴露 bind/unbind;部分新版本内核可能提供 unbind

6. Driver Core 的变化

Driver core 是内核里管理设备与驱动关系的核心模块(源码在 drivers/base/)。它的演进会影响 sysfs 接口的表现。

  • 变化内容

    • 是否生成 bind/unbind 文件。
    • 匹配机制改进(支持 DTS/ACPI 更灵活的匹配)。
    • 热插拔支持增强。
    • 接口统一化。
  • 版本差异

    • Linux 5.1:rk-pcie 驱动存在,但通常不暴露 bind/unbind。
    • Linux 6.1 :driver core 改动后,部分 platform 驱动目录可能出现 unbind

7. 总结

  • 设备模型:统一框架,设备和驱动分离,通过总线匹配。
  • 驱动框架:不同总线/设备类型的开发规范。
  • Platform 驱动:专门管 SoC 内部非标准片上外设,靠 DTS/ACPI 静态绑定。
  • rk-pcie:Rockchip SoC 的 PCIe 控制器驱动,是 platform 驱动,负责把控制器接入标准 PCI 总线。
  • bind/unbind 差异:PCI 驱动常见,platform 驱动通常没有;不同内核版本 driver core 的变化会影响是否暴露。

8. 流程图

👉 一句话总结:Platform 驱动负责初始化 SoC 内部的片上外设,如果这个外设是总线控制器(如 rk-pcie),它会把自己挂到标准总线框架上,由标准总线去枚举和管理下游设备。

相关推荐
程序猿阿伟几秒前
《突破训练瓶颈:参数服务器替代架构效率优化指南》
运维·服务器·架构
一条代码鱼1 分钟前
修复Nacos namespaces未授权访问漏洞【原理扫描】
java·运维·spring cloud
了不起的云计算V2 分钟前
内存/SSD、CPU供应链压力传导,服务器整机或迎新一轮涨价潮
运维·服务器
WJ.Polar3 分钟前
华为OSPF配置实战详解
运维·网络
咕咕嘎嘎10243 分钟前
Socket编程
linux·服务器·网络
_OP_CHEN8 分钟前
【Linux系统编程】(十九)深入 Linux 文件与文件 IO:从底层原理到实战操作,一文吃透!
linux·运维·操作系统·系统文件·系统调用·c/c++·文件i/o
杜子不疼.2 小时前
【Linux】基础IO(二):系统文件IO
linux·运维·服务器
郝学胜-神的一滴2 小时前
深入理解网络IP协议与TTL机制:从原理到实践
linux·服务器·开发语言·网络·网络协议·tcp/ip·程序人生
松涛和鸣2 小时前
DAY61 IMX6ULL UART Serial Communication Practice
linux·服务器·网络·arm开发·数据库·驱动开发
Justice link10 小时前
K8S基本配置
运维·docker·容器