图解Linux设备模型


udev实现了用户空间动态的方法管理/dev目录。/dev目录是设备目录,里面的文件就是设备文件。udev文件系统在用户空间工作,它可以根据sysfs文件系统导出的信息(设备号(dev)等),动态建立和删除设备文件。而不再需要使用mknod来手动建立设备文件,也不必为查找设备号(尤其是驱动中动态申请产生的设备号)而头疼。

从Linux2.6以后出现了udev。Udev依赖于sysfs输出到用户空间所有设备信息,以及当设备添加或者删除时,/sbin/hotplug对它的通知。当用户向系统添加或者删除设备时(kobject被创建或者被删除),会产生热插拔事件,这会导致内核调用用户空间的应用程序/sbin/hotplug,该程序是一个典型的bash脚本程序。图解Linux设备模型_第1张图片

为了能让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》。


注:

/dev,设备文件存储目录,应用程序通过对这些文件的读写和控制,可以访问实际的设备;
/sys/devices目录,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备;是文件系统管理设备的最重要的目录结构;
/sys/dev下有两个子目录,block和char,存放的是块设备和字符设备的主次号码,形式为(major:minor),它指向/sys/devices目录下的设备。

你可能感兴趣的:(设备驱动)