Linux 设备驱动模型:从 kobject 到 udev
很多人写驱动是从 file_operations 开始的,但要真正理解一个设备如何从硬件出现到 /dev 下的节点,需要先看懂内核的统一设备模型:用一套树状结构把总线、设备、驱动组织起来,并暴露给用户态。
kobject 与 sysfs
kobject 是这套模型的原子。每个 kobject 在 /sys 下对应一个目录,属性对应目录里的文件。例如 cat /sys/class/graphics/fb0/name 读到的就是某个属性的 show 回调。kset 是 kobject 的集合,构成 sysfs 层级。
调试驱动时 /sys 往往比散落的 /proc 节点更清晰:它直接映射内核对象之间的从属关系。
bus / device / driver
- bus:总线类型(pci、usb、platform…),定义匹配规则
- device:挂在总线上的具体设备
- driver:声明自己能驱动哪些设备(id_table / of_match_table)
device 注册到 bus 后,bus 的 match() 遍历 driver;匹配成功调用 probe()。PCI 靠 vendor/device ID,platform 靠名字或设备树 compatible。
uevent 到 udev
device 注册时内核通过 netlink 发 uevent;udevd 按规则创建 /dev 节点、设权限、改名。所以多数节点是用户态根据事件建的,不是驱动里直接 mknod。
lsmod
modinfo <module>
udevadm monitor
udevadm info -a /dev/sda
把这条链路理顺,写驱动时就能清楚:注册到哪条总线、匹配什么、用户态怎样看到设备。
← index