udev(六):udev

来源:互联网 发布:手机qq数据迁移到sd卡 编辑:程序博客网 时间:2024/05/08 06:32

原创文章,转载请注明出处,谢谢!       

  作者:清林,博客名:空静渡


<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

       基于上面提到的问题,便开始了udev的项目。Udev的目标有下面几点:

       1、运行于用户空间。

       2、创建动态的/dev

       3、如果需要就提供一个固定的设备名字。

       4、提供用户API以供访问当前系统设备的信息。


       首先可以看下第一点的“运行于用户空间”,这点很容易做到,这可以通过利用任何的设备增加或从系统中移除时/sbin/hotplug都会产生一个事件的这样的机制并联合sysfs的功能来显示所有有关设备的信息。

       而其它的几个剩下的目标就使udev分成三个子系统了:

       1namedev--处理所有的设备命名。

       2libsysfs--访问系统里的设备信息的一个标准库。

       3udev--为/dev进行动态更换。


       下面来看看这三个子系统。

       

       6.1namedev


       由于需要为不同的设备进行命名,设备命名这部分就从udev中分离出来成为一个子系统。设备命名从udev从分离出来,这就允许了可插拔设备的命名可以有不同的组织来开发。设备命名子系统namedev--提供了一个标准的接口可供调用来命名一个指定的设备。

       udev的最初发行版里,namedev逻辑上是由一些链接文件,链接到udev上。在当前中只有一个命名方案,就是LANANA定义的命名表(前面说的那个)。通常由sysfs来代表设备使用这些相同的名字,这也符合当前大多数的Linux用户。

       udev项目的部分目标是为用户基于一组机制来命名设备提供一种方法。在当前的namedev版本中,提供了用户5个步骤来确定设备的名字。这些步骤是有循序的,并且在这5个步骤的过程中,任何一个步骤中检测出设备的名字的话,就用这个名字了。这5个步骤如下:

       1、标签或序列号

       2、总线设备号

       3、总线拓扑结构

       4、替换名字

       5、内核名字


       在第一步中,当一个设备增加进系统时就会基于这个设备的类型来检测,看它是否有唯一的标识符。例如,如果是usb设备,则usb序列号就会被检测;如果是scsi设备,那么uuid就会被检测;而块设备的话,就会检测文件系统的标签。如果这个由用户提供的标识符匹配的话(在配置文件中),那么这个就是最终的名字而被使用。

第二步是检测设备的总线号。对于大多数总线来说,这个号通常随着时间的推移是不会改变的,并且所有的总线号在系统里的任何时间点上都可以保证唯一性。一个好的例子就是PCI的总线号,在大多系统中基本上是不改变的(然而,升级BIOS,或者热插拔PCI控制器,那么在机子重启之后就有可能改变这个PCI总线号)。同样,如果总线号匹配用户提供的标识符,那么这个名字就会被赋给设备了。

       第三步是检测设备在总线上的位置。例如,usb设备可以通过插在哪个插口上来确定。

       第四步是简单的字符串替换。如果设备在内核中的名字与指定的名字相匹配,就于用这个指定的名字。

       第五步,如果前面的都没有确定设备名,那么设备名就用默认的内核名字。


       下图摘自udev– A Userspace Implementation of devfs


       其中,第一、二项显示怎样为设备指定序列号来控制设备的命名。第三、四项是根据总线id来命名设备,第五、六项是根据usb设备的接口位置来命名设备,第七项显示的是简单的名字替换。

 

       6.2libsysfs

       为了可以让许多的不同的程序访问到sysfs里设备的信息,需要提供通用的API接口,而不仅仅限于udev里。设备命名子系统和udev系统都需要从sysfs所描述的设备中查询许多各种不同的设备信息。因此就从sysfs中分出这个作为一个库来供使用。


       6.3udev

       udev程序使用namedev和libsysfs库来完成设备的命名机制。当/sbin/hotplug被内核调用时,udev就会运行。它是通过在/etc/hotplug.d/default目录里为自己增加一个符号连接来实现的,而这个目录由/sbin/hotplug复用器脚本(multiplexerscript)来搜索。

       /sbin/hotplug有内核调用,并输出许多设备的特定信息,这些信息是产生了什么样的动作,产生什么样的设备类型动作以及是sysfs目录树中的哪个设备。udev就根据这些信息调用namedev来确定这个设备应该怎么命名。如果这是个新增加进来的设备,udev就会使用libsysfs来确定这个设备的设备文件应该用什么主次设备号,并在/dev目录下创建为设备创建一个合适的设备文件名和分配主次设备号。如果这个设备是从系统里移除的,那就相应的从/dev目录下移除它的设备文件。

 

 

参考文章:《udev – A Userspace Implementation of devfs》

 

来源:http://blog.csdn.net/fjb2080/archive/2009/11/25/4871033.aspx

原创粉丝点击