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

udev(一)– 什么是udev

2013年05月19日 ⁄ 综合 ⁄ 共 3584字 ⁄ 字号 评论关闭

 什么是udev,在网上搜索一下可以得到很多关于udev的信息,个人总结如下。





 一、什么是udev

《system:udev原理分析》 :http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=system:udev%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90):



     在linux系统中,/dev目录用来保存设备文件的.每个文件指向一个系统设备.用户的程序可以通过使用这些设备文件,

对真实的硬件的设备进行操作.如: hda是第1个IDE硬盘,sda是第1个SCSI硬盘.

     在2.4内核时代,在/dev下保存了所有kernel可以支持的硬件设备的设备文件,将近有1万个.而这些设备中,大多数

是没有连接的设备.这样就大大的浪费了系统资源,而且/dev目录也显得非常混乱.

     udev

就是用了解决这些问题的.在2.6内核中,采用udev

方式来管理/dev目录.它可以动态的建立/删除设备文件(设备

连接到系统时,它会自动建立相应的设备文件,设备断开连接后,它会自动删除相应的设备文件).这样使/dev目录

简化了许多.而且,udev

还可以允许用户编写命名规则,为不同设备指定设备文件名.这样,对设备的管理也方便了

许多.

     例如:你有2个U盘,1个容量是1G的,1个容量是2G的.一般情况下,你先接上的U盘会是sdb,后接上的U盘会是sdc.这样对

使用很不方便.每次U盘的设备名可能不一样.但通过udev

命名规则,你可以自己指定的设备命名,可以将1G的U盘命名为

1g,将2G的U盘命名为2g.设备名不会再变化.使用和管理都会很方便.



《udev实现原理》--

李先静(http://blog.csdn.net/absurd/archive/2007/04/27/1587938.aspx)


 

        相对于
linux

来说,
udev

还是一个新事物。然而,尽管它
03

年才出现,尽管它很低调
(

J

)

,但它无疑已经成为
linux

下不可或缺的组件了。
udev

是什么?它是如何实现的?最近研究
Linux

设备管理时,花了一些时间去研究
udev

的实现。

 


         udev

是什么?
u

是指
user space


dev

是指
device


udev

是用户空间的设备驱动程序吗?最初我也这样认为,调试内核空间的程序要比调试用户空间的程序复杂得多,内核空间的程序的
BUG

所引起的后果也严重得多,
device driver

是内核空间中所占比较最大的代码,如果把这些
device driver

中硬件无关的代码,从内核空间移动到用户空间,自然是一个不错的想法。

 


但我的想法并不正确,
udev

的文档是这样说的,

1.
        

dynamic replacement for /dev

。作为
devfs

的替代者,传统的
devfs

不能动态分配
major


minor

的值,而
major


minor

非常有限,很快就会用完了。
udev

能够像
DHCP

动态分配
IP

地址一样去动态分配
major


minor



 


2.
        

device naming

。提供设备命名持久化的机制。传统设备命名方式不具直观性,像
/dev/hda1

这样的名字肯定没有
boot_disk

这样的名字直观。
udev

能够像
DNS

解析域名一样去给设备指定一个有意义的名称。

 


3.
        

API to access info about current system devices

。提供了一组易用的
API

去操作
sysfs

,避免重复实现同样的代码,这没有什么好说的。

 


       我们知道,用户空间的程序与设备通信的方法,主要有以下几种方式,

1.
        


通过
ioperm

获取操作
IO

端口的权限,然后用
inb/inw/ inl/ outb/outw/outl

等函数,避开设备驱动程序,直接去操作
IO

端口。(没有用过)

2.
        



ioctl

函数去操作
/dev

目录下对应的设备,这是设备驱动程序提供的接口。像键盘、鼠标和触摸屏等输入设备一般都是这样做的。

3.
        



write/read/mmap

去操作
/dev

目录下对应的设备,这也是设备驱动程序提供的接口。像
framebuffer

等都是这样做的。

 


         上面的方法在大多数情况下,都可以正常工作,但是对于热插拨
(hotplug)

的设备,比如像
U

盘,就有点困难了,因为你不知道:什么时候设备插上了,什么时候设备拔掉了。这就是所谓的
hotplug

问题了。



二、为什么使用udev


红旗工程师大讲堂:掌握udev》:http://linux.chinaitlab.com/administer/782422.html



在此之前的设备文件管理方法(静态文件和devfs)有几个缺点:

  ◆不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。
一个可能称为
/dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为他
可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一设
备文件来映射。但是静态文件和devfs都无法做到这点。

  ◆没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号,另外一个是辅设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。

  ◆/dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。

  ◆命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。;

  ◆内核内存使用,devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)

  udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。



三、udev的使用



《linux udev的认识》:http://www.91linux.com/html/article/network_memory/20090603/17070_2.html#

 

问:udev怎样做到不管设备连接的顺序而维持一个统一的设备名?
答:实际上,udev是通过对内核产生的设备名增加别名的方式来达到上述目的的。前面说过,udev是用户模式程序,不会更改内核的行为。因此,内核依然会我行我素地产生设备名如sda,sdb 等。但是,udev可以根据设备的其他信息如总线(bus),生产商(vendor)等不同来区分不同的设备,并产生设备文件。udev只要为这个设备文件取一个固定的文件名就可以解决这个问题。在后续对设备的操作中,只要引用新的设备名就可以了。但为了保证最大限度的兼容,一般来说,新设备名总是作为一个对内核自动产生的设备名的符号链接(link)来使用的。
例如:内核产生了sda设备名,而根据信息,这个设备对应于是我的内置硬盘,那我就可以制定udev规则,让udev除了产生/dev/sda设备文件外,另外创建一个符号链接叫/dev/internalHD。这样,我在 fstab文件中,就可以用/dev/internalHD来代替原来的 /dev/sda了。下次,由于某些原因,这个硬盘在内核中变成了sdb设备名了,那也不用着急,udev还会自动产生/dev/internalHD这个链接,并指向正确的/dev/sdb设备。所有其他的文件像fstab等都不用修改。

 

==============================================================

 

基于上面的引用,读者大概都可以知道什么是udev和udev有什么用这些基本的概念了。

更进一步的udev的信息,可以通过在linux下运行:man 7 udev查看。

 

注:由于比较懒,网络上有人已经说的就不想在自己写了,所以就引用过来,并给出引用出处,有些出处并不知道谁是作者,如果侵犯了你什么的版权,就告诉一声,再作出处理。

抱歉!评论已关闭.