现在的位置: 首页 > 综合 > 正文

udev(六):udev

2013年12月02日 ⁄ 综合 ⁄ 共 2249字 ⁄ 字号 评论关闭

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

  作者:清林,博客名:


空静渡



<!--
@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/archive/2009/11/25/4871033.aspx

抱歉!评论已关闭.