udev(六):udev

长平狐 发布于 2013/01/11 10:33
阅读 91
收藏 0

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

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


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

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

        1 、运行于用户空间。

        2 、创建动态的 /dev

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

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


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

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

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

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

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


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

       

        6.1 namedev


        由于需要为不同的设备进行命名,设备命名这部分就从 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.2 libsysfs

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


        6.3 udev

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

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

 

 

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

 


原文链接:http://blog.csdn.net/fjb2080/article/details/4871033
加载中
返回顶部
顶部