udev(一)-- 什么是udev

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

什么是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 spacedev是指deviceudev是用户空间的设备驱动程序吗?最初我也这样认为,调试内核空间的程序要比调试用户空间的程序复杂得多,内核空间的程序的BUG所引起的后果也严重得多,device driver是内核空间中所占比较最大的代码,如果把这些device driver中硬件无关的代码,从内核空间移动到用户空间,自然是一个不错的想法。

 

但我的想法并不正确,udev的文档是这样说的,

1.         dynamic replacement for /dev。作为devfs的替代者,传统的devfs不能动态分配majorminor的值,而majorminor非常有限,很快就会用完了。udev能够像DHCP动态分配IP地址一样去动态分配majorminor

 

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查看。

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

来源:http://blog.csdn.net/fjb2080/archive/2009/11/20/4842814.aspx

原创粉丝点击