Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Linux 设备与驱动(Devices & Drivers)

下面是一份 「Linux 内核核心子系统:设备与驱动(Devices & Drivers)」的系统级、内核级完整梳理

定位是:硬件 -> 内核抽象 -> 驱动模型 -> 总线 -> 设备 -> 驱动 -> 用户态,并与前面已经系统梳理过的 Process / Memory / FS / Networking / NUMA / 容器 / 虚拟化 无缝衔接。

一、为什么“设备与驱动”是 Linux 内核的骨架之一

没有驱动,内核只是一段不能和现实世界交互的代码。

设备与驱动子系统解决的是:

  • 内核如何“发现”硬件
  • 内核如何“管理”硬件
  • 驱动如何“绑定”设备
  • 用户态如何“访问”设备

📌 Linux 的核心哲学:统一抽象 + 模块化驱动

二、Linux 设备模型(Device Model)总览

Linux 采用 统一设备模型(Unified Device Model)

Bus(总线)
 ├── Device(设备)
 │     └── Driver(驱动)
 └── Class(设备类别)

核心对象:

对象 内核结构
总线 struct bus_type
设备 struct device
驱动 struct device_driver
struct class

📌 sysfs 正是这个模型的“可视化映射”

三、设备的本质是什么?

设备 = 可被内核管理的硬件实体或虚拟实体

设备类型

类型 示例
物理设备 磁盘、网卡、GPU
虚拟设备 loop、veth、tap
伪设备 null、zero
平台设备 SoC 内部设备

四、总线(Bus)

1️⃣ 常见总线类型

总线 特点
PCI / PCIe 自动枚举
USB 热插拔
I2C / SPI 嵌入式
Platform 非可枚举
Virtio 虚拟化

2️⃣ 总线的职责

  • 枚举设备
  • 匹配驱动
  • 维护设备树

📌 总线是“设备与驱动的媒婆”

3️⃣ 设备与驱动匹配

  • PCI:Vendor ID / Device ID
  • USB:VID / PID
  • Platform:name / DT

五、驱动(Driver)

1️⃣ 驱动的核心职责

  • 初始化硬件
  • 注册设备节点
  • 提供 file_operations
  • 处理中断 / DMA

2️⃣ 字符设备 / 块设备

字符设备(cdev)

  • 字节流
  • 无缓存
  • 例:tty、null

块设备(bdev)

  • 块访问
  • 有缓存
  • 例:磁盘

3️⃣ file_operations

struct file_operations {
  .open
  .read
  .write
  .ioctl
  .mmap
}

📌 用户态访问设备的“接口合同”

六、设备节点(/dev)

/dev 不是设备,是设备的“入口”

  • 由 udev 动态创建
  • 映射 major / minor
crw-rw---- 1 root disk 8, 0 /dev/sda

七、sysfs(/sys)

内核设备模型的“导出视图”

/sys
 ├── bus
 ├── devices
 ├── class
 └── module

用途:

  • 查看设备状态
  • 调整参数
  • 调试驱动

📌 比 /proc 更结构化

八、中断子系统(Interrupt)

1️⃣ 中断类型

类型 特点
硬中断 实时响应
软中断 延迟处理
tasklet 软中断
workqueue 进程上下文

2️⃣ MSI / MSI-X

  • 现代 PCIe 设备
  • 高性能网卡必备

3️⃣ IRQ 亲和性

echo 3 > /proc/irq/XX/smp_affinity

📌 NUMA / 高性能必调

九、DMA(直接内存访问)

设备绕过 CPU 直接读写内存

1️⃣ DMA 关键点

  • IOMMU
  • bounce buffer
  • cache coherency

2️⃣ DMA API

dma_alloc_coherent()
dma_map_single()

📌 错用 DMA = 随机崩溃

十、驱动模块(Modules)

1️⃣ 内核模块

  • .ko 文件
  • 动态加载
modprobe e1000

2️⃣ 模块生命周期

init -> probe -> remove -> exit

3️⃣ 模块依赖

lsmod
modinfo

十一、udev 与设备管理

用户态设备管理守护进程

职责:

  • 创建设备节点
  • 设置权限
  • 触发脚本

📌 云 / 容器高度依赖 udev

十二、虚拟化与设备

1️⃣ Virtio

  • 半虚拟化设备
  • 高性能
类型 设备
virtio-net 网卡
virtio-blk 磁盘

2️⃣ SR-IOV

  • 硬件虚拟化
  • VF / PF

📌 数据库 / 高吞吐必选

十三、容器与设备

1️⃣ 容器如何使用设备

  • namespace
  • cgroup device controller
  • bind mount /dev

2️⃣ 安全限制

cgroup devices.allow

十四、驱动性能瓶颈地图

常见问题
IRQ 单核瓶颈
DMA IOMMU
Driver
Bus 带宽
用户态 copy

十五、调试与排障工具

工具 用途
dmesg 驱动日志
lspci / lsusb 设备
udevadm 事件
perf 性能
ftrace 跟踪

十六、设备与驱动一句话总结

Linux 设备与驱动子系统,是一个通过总线模型,将现实世界的硬件,抽象为内核对象,并通过统一接口提供给用户态的系统。

十七、与前面子系统的“联动关系”

子系统 关联
Process 驱动运行在内核
Memory DMA / MMIO
FS /dev / sysfs
Networking NIC 驱动
NUMA 中断 / DMA
容器 虚拟设备