图解Linux设备模型
udev实现了用户空间动态的方法管理/dev目录。/dev目录是设备目录,里面的文件就是设备文件。udev文件系统在用户空间工作,它可以根据sysfs文件系统导出的信息(设备号(dev)等),动态建立和删除设备文件。而不再需要使用mknod来手动建立设备文件,也不必为查找设备号(尤其是驱动中动态申请产生的设备号)而头疼。
从Linux2.6以后出现了udev。Udev依赖于sysfs输出到用户空间所有设备信息,以及当设备添加或者删除时,/sbin/hotplug对它的通知。当用户向系统添加或者删除设备时(kobject被创建或者被删除),会产生热插拔事件,这会导致内核调用用户空间的应用程序/sbin/hotplug,该程序是一个典型的bash脚本程序。
为了能让udev能够正常工作,一个设备驱动程序要做的事情是:通过sysfs将驱动程序所控制设备的主设备号和此设备号导出到用户空间。对于那些使用子系统分配主设备号和次设备号的驱动程序,该工作已经有子系统完成,驱动程序不做任何事情。这样的子系统有:tty,misc,usb,input,scsi,block,i2c,network,framebuffer子系统。如果驱动程序通过调用cdev_init函数,自己处理获得主设备号和次设备号,那么为了能正确的使用udev,需要对驱动程序进行修改。Udev在sysfs中的/class/目录树下搜索名为dev的文件,这样内核通过/sbin/hotplug接口调用它的时候,就能获得分配给特定设备的主设备号和次设备号。
在图中可以直观看出udev的工作过程。
该图来源《essential Linuxdevice driver》,文字主要参考《Linux device driver》。