Linux 设备与驱动(Devices & Drivers)
下面是一份 「Linux 内核核心子系统:设备与驱动(Devices & Drivers)」的系统级、内核级完整梳理。
定位是:硬件 -> 内核抽象 -> 驱动模型 -> 总线 -> 设备 -> 驱动 -> 用户态,并与前面已经系统梳理过的 Process / Memory / FS / Networking / NUMA / 容器 / 虚拟化 无缝衔接。
没有驱动,内核只是一段不能和现实世界交互的代码。
设备与驱动子系统解决的是:
- 内核如何“发现”硬件
- 内核如何“管理”硬件
- 驱动如何“绑定”设备
- 用户态如何“访问”设备
📌 Linux 的核心哲学:统一抽象 + 模块化驱动
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 内部设备 |
| 总线 | 特点 |
|---|---|
| PCI / PCIe | 自动枚举 |
| USB | 热插拔 |
| I2C / SPI | 嵌入式 |
| Platform | 非可枚举 |
| Virtio | 虚拟化 |
- 枚举设备
- 匹配驱动
- 维护设备树
📌 总线是“设备与驱动的媒婆”
- PCI:Vendor ID / Device ID
- USB:VID / PID
- Platform:name / DT
- 初始化硬件
- 注册设备节点
- 提供 file_operations
- 处理中断 / DMA
字符设备(cdev)
- 字节流
- 无缓存
- 例:tty、null
块设备(bdev)
- 块访问
- 有缓存
- 例:磁盘
struct file_operations {
.open
.read
.write
.ioctl
.mmap
}
📌 用户态访问设备的“接口合同”
/dev 不是设备,是设备的“入口”
- 由 udev 动态创建
- 映射 major / minor
crw-rw---- 1 root disk 8, 0 /dev/sda
内核设备模型的“导出视图”
/sys
├── bus
├── devices
├── class
└── module
用途:
- 查看设备状态
- 调整参数
- 调试驱动
📌 比 /proc 更结构化
| 类型 | 特点 |
|---|---|
| 硬中断 | 实时响应 |
| 软中断 | 延迟处理 |
| tasklet | 软中断 |
| workqueue | 进程上下文 |
- 现代 PCIe 设备
- 高性能网卡必备
echo 3 > /proc/irq/XX/smp_affinity
📌 NUMA / 高性能必调
设备绕过 CPU 直接读写内存
- IOMMU
- bounce buffer
- cache coherency
dma_alloc_coherent()
dma_map_single()
📌 错用 DMA = 随机崩溃
- .ko 文件
- 动态加载
modprobe e1000
init -> probe -> remove -> exit
lsmod
modinfo
用户态设备管理守护进程
职责:
- 创建设备节点
- 设置权限
- 触发脚本
📌 云 / 容器高度依赖 udev
- 半虚拟化设备
- 高性能
| 类型 | 设备 |
|---|---|
| virtio-net | 网卡 |
| virtio-blk | 磁盘 |
- 硬件虚拟化
- VF / PF
📌 数据库 / 高吞吐必选
- namespace
- cgroup device controller
- bind mount /dev
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 |
| 容器 | 虚拟设备 |