【译】《心悟内核:先懂设计,再读代码》—9、内核设备模型:硬件如何映射为 /dev
作者Moon Hee Lee原文 The Kernel in the Mind心悟内核:先懂设计再读代码——内核设备模型硬件如何映射为 /dev磁盘驱动器本身并不知道 /dev/sda 是什么网卡也不清楚 eth0 的含义而内核本就不会要求硬件具备这类认知。与之相反内核维护一套结构化模型一套分层抽象体系用以弥合物理硬件与用户态可见逻辑接口之间的鸿沟。从总线、中断到文件描述符与套接字接口该模型定义了设备的探测、命名与使用规范。一切始于总线。PCIe、USB、I²C这些是设备上报自身的传输通道。内核各类总线子系统如 drivers/pci/、drivers/usb/ 等会扫描整条总线轮询检测已接入设备。若设备上报可识别的厂商信息与设备类型内核便会创建对应的内部对象例如 pci_dev、usb_device、i2c_client并完成设备注册。设备脱离驱动将无法工作。设备被探测识别后内核会将设备与驱动完成匹配驱动程序即为操控硬件的专用代码。块设备驱动可为 PCIe NVMe 固态硬盘注册通用磁盘对象USB 驱动可为串口适配器提供 TTY 接口网络驱动则注册网络设备结构体并为报文收发准备队列。驱动无需关心上层应用如何使用设备只需保证硬件正常工作。在驱动层之上内核将设备划分为不同设备类块设备、字符设备、网络设备。抽象能力在此层级进一步强化。驱动绑定至对应设备类内核向上提供统一接口例如 /dev/sda、/dev/ttyUSB0、eth0屏蔽底层总线与硬件细节差异。针对块设备内核管理请求队列针对字符设备通过 file_operations 完成系统调用的路由分发针对网络设备内核将其整合至 IP 协议栈、套接字层与流量控制模块。以上接口即是用户态所能直接感知的形态/dev 目录下的设备文件、/sys/class/net/ 下的设备条目、调用 open() 后返回的文件描述符。上层应用无需关心存储设备基于 SATA、NVMe 还是 USB 大容量存储协议这正是抽象设计的核心价值。内核将复杂的物理硬件封装为稳定、可访问、标准化的逻辑实体。简洁的上层接口之下是一套精密的协同调度机制。DMA 映射、IOMMU 地址转换、中断路由保障数据传输高效且安全。一次对 /dev/sda 的写入操作会串联起一系列内存操作、请求队列排队、DMA 传输最终落地为设备 I/O。发往 eth0 的网络报文会封装为 sk_buff 结构体递交至网卡驱动、完成 DMA 地址映射最终通过物理链路发送整套复杂流转过程对应用完全透明。内核设备模型实现了这一切。它将设备本身与工作原理解耦将硬件接入方式与上层使用方式隔离。设备依次经过探测、命名、驱动匹配、多层抽象最终以可用形态呈现给用户空间。这就是 /dev/sda 得以存在的原因。并非由硬件自行定义而是由内核抽象构造而来。如本文对你有些许帮助欢迎大佬支持我一下点赞收藏关注、关注公众号等您的支持是我持续创作的竭动力支持我的方式