⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udev文件系统的使用和基本工作原理分析 - colorant的专栏 - csdn博客.htm

📁 ARM平台上蓝牙协议栈Bluez的移植使用和配置 .rar
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0061)http://blog.csdn.net/colorant/archive/2008/01/09/2031721.aspx -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客</TITLE>
<META content=彩色蚂蚁 name=author>
<META content=Csdn name=Copyright>
<META 
content=Udev相关的文章很多,本文的主要目的不是提供一个完整的教学文档,对其使用,只是给出网上现有的主要资源。着重分析其基本工作原理以及在使用中遇到的一些README文档没有明确说明的问题。 
name=description>
<META http-equiv=Content-Type content="text/html; charset=utf-8"><LINK 
href="http://profile.csdn.net/colorant/picture/1.ico" rel="Shortcut Icon"><LINK 
media=all 
href="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/Cogitation_1.css" 
type=text/css rel=stylesheet><LINK media=all 
href="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/csdn_favbykimi.css" 
type=text/css rel=stylesheet>
<SCRIPT 
src="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/jquery-1.2.3.pack.js" 
type=text/javascript></SCRIPT>

<SCRIPT 
src="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/jquery.highlighter.js" 
type=text/javascript></SCRIPT>

<SCRIPT src="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/highlighter.js" 
type=text/javascript></SCRIPT>
<LINK title=RSS href="http://feeds.feedsky.com/csdn.net/colorant" 
type=application/rss+xml rel=alternate>
<META content="MSHTML 6.00.2900.3527" name=GENERATOR></HEAD>
<BODY id=defaultuser>
<DIV id=csdnblog_allwrap>
<FORM id=Form1 name=Form1 action=2031721.aspx method=post><INPUT 
id="&#13;&#10;__VIEWSTATE" type=hidden name=__VIEWSTATE> 
<DIV id=csdnblog_midwrap>
<DIV id=csdnblog_header>
<H1><A id=Header1_HeaderTitle 
href="http://blog.csdn.net/colorant/">colorant的专栏</A></H1>
<H2>彩色蚂蚁的Linux博客</H2>
<UL id=personalnav>
  <LI><A href="http://hi.csdn.net/my.html" target=_blank>欢迎 
zhenwenxian!</A></LI>
  <LI><A href="http://writeblog.csdn.net/Signout.aspx">退出</A></LI>
  <LI><A href="http://blog.csdn.net/zhenwenxian">我的博客</A></LI>
  <LI><A href="http://writeblog.csdn.net/configure.aspx" 
  target=_blank>配置</A></LI>
  <LI><A href="http://writeblog.csdn.net/PostEditPlain.aspx" 
  target=_blank>写文章</A></LI>
  <LI><A href="http://writeblog.csdn.net/PostList.aspx" 
  target=_blank>文章管理</A></LI>
  <LI><A href="http://blog.csdn.net/" target=_blank>博客首页</A></LI></UL>
<UL id=blogsearchsty>
  <LI><INPUT class=bolgsearch id=inputSearch 
onkeydown="return keyb(event)"></LI>
  <LI class=selectsty><SELECT id=Search_ddlSearchScope 
  name=Search:ddlSearchScope><OPTION value=all selected>全站</OPTION><OPTION 
    value=colorant>当前博客</OPTION></SELECT></LI>
  <LI><INPUT class=bolggobtn onclick=checkNull() type=button value=搜索></LI></UL>
<UL id=menu>
  <LI><A href="http://hi.csdn.net/colorant">空间</A></LI>
  <LI><A class=on href="http://blog.csdn.net/colorant">博客</A></LI>
  <LI><A 
  href="http://hi.csdn.net/colorant/profile/contactlist/1.html">好友</A></LI>
  <LI><A href="http://album.hi.csdn.net/" target=_blank>相册</A></LI>
  <LI><A class=last 
  href="http://hi.csdn.net/colorant/profile/notebook/1.html">留言</A></LI></UL></DIV>
<DIV id=csdnblog_content>
<DIV class=gutter>
<DIV class=default_contents>
<DIV class=user_article>
<SCRIPT 
src="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/LoadFeedbackCount.js" 
type=text/javascript></SCRIPT>

<H1 class=title_txt><IMG height=16 alt=原创 
src="udev文件系统的使用和基本工作原理分析 - colorant的专栏 - CSDN博客.files/authorship.gif" width=15 
border=0>&nbsp;udev文件系统的使用和基本工作原理分析<CITE class=fav_csdnstylebykimi><A 
class=fav_csdnstylebykimi title=收藏到我的网摘中,并分享给我的朋友 
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A></CITE></H1>
<DIV class=blogstory>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>

<DIV align=center><FONT size=3>作者:刘旭晖 <A href="mailto:colorant@163.com"><FONT 
color=#000080>colorant@163.com </FONT>转载请注明出处</A> </FONT></DIV>
<DIV align=center><FONT color=#000080 size=3><A 
href="http://blog.csdn.net/colorant/">http://blog.csdn.net/colorant/</A></FONT></DIV>
<DIV align=left>&nbsp;&nbsp; 
<DIV>Udev相关的文章很多,本文的主要目的不是提供一个完整的教学文档,对其使用,只是给出网上现有的主要资源。着重分析其基本工作原理以及在使用中遇到的一些README文档没有明确说明的问题。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>基本概念</FONT></STRONG></DIV>
<DIV>udev文件系统是针对2.6内核,提供一个基于用户空间的动态设备节点管理和命名的解决方案,网上关于为什么要使用udev文件系统,udev文件系统和devfs文件系统的比较,等等的文章已经很多了,如果你想了解这方面的内容,请直接搜索相关的关键字。</DIV>
<DIV>&nbsp;</DIV>
<DIV>udev的官方网址:<A 
href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html">http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html</A></DIV>
<DIV>src code的下载地址:<A 
href="http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/">http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/</A></DIV>
<DIV>&nbsp;</DIV>
<DIV>此外,关于udev的rules规则的撰写,网上也有很多文章,如果要获得最准确的版本,可以在src 
code的代码树里找到writing_udev_rules的帮助文档,这个文档其实没有逐条介绍rules的所有关键字,可以结合man udev 和 
udev自带的一些rules文件来理解如何撰写你所需要的规则文件。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>安装和启动</FONT></STRONG></DIV>
<DIV><STRONG><FONT size=5><SPAN>2.1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>安装</FONT></STRONG></DIV>
<DIV>Udev的代码树里的版本很多,我下载的最新的版本是udev-117,配合2.6.21版本的内核能够正常使用。网上很多文章介绍的可能都是稍微早期一些的版本,有些步骤包括udev的README文档似乎描述的不是很准确。</DIV>
<DIV>&nbsp;</DIV>
<DIV>基本上这个版本的udev需要注意的是,安装时只需要udevd,udevadm两个文件,其它必需的包括udevtrigger等只是udevadm的一个符号链接。udevstart不是必需的。当然Udev.conf等配置文件还是一样。</DIV>
<DIV><STRONG><FONT size=5><SPAN>2.2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>启动</FONT></STRONG></DIV>
<DIV>你可以在启动脚本中用udevd –d 
参数启动udev文件系统的守护进程,然后使用udevtrigger将buildin的设备驱动的节点创建出来,以后模块插入移除时节点的管理会自动处理。</DIV>
<DIV>&nbsp;</DIV>
<DIV>能够正常加载udev的前提,基本包括如下操作:</DIV>
<DIV>&nbsp;</DIV>
<DIV><SPAN>Ø<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>设置路径变量</DIV>
<DIV><SPAN>Ø<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>加载sysfs文件系统</DIV>
<DIV><SPAN>Ø<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>加载一个基于ram的可写的/dev目录(其实,只要提供一个可写的目录即可,目录路径本身也是可以配置的)</DIV>
<DIV><SPAN>Ø<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>/dev目录下需要有已经创建好的 console节点和null节点</DIV>
<DIV>脚本类似:</DIV>
<DIV>&nbsp;</DIV>
<DIV># Set the path</DIV>
<DIV>PATH=/bin:/sbin:/usr/bin:/usr/sbin</DIV>
<DIV>export PATH</DIV>
<DIV>&nbsp;</DIV>
<DIV># mount proc and devpts filesystem</DIV>
<DIV>/bin/mount -a</DIV>
<DIV>mknod /dev/console c 5 1</DIV>
<DIV>mknod /dev/null c 1 3</DIV>
<DIV>/sbin/udevd -d</DIV>
<DIV>/sbin/udevtrigger</DIV>
<DIV>&nbsp;</DIV>
<DIV>Mount使用的fstab文件类似:</DIV>
<DIV>&nbsp;</DIV>
<DIV>none<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/tmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
ramfs&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 
0</SPAN></DIV>
<DIV>udev<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/dev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
ramfs&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 
0</SPAN></DIV>
<DIV>none<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/proc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
proc&nbsp;&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 
0</SPAN></DIV>
<DIV>sysfs<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
sysfs&nbsp;&nbsp; defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 
0</SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV>当然,你的系统上可能还会需要预先创建一些其它的设备节点,比如串口的ttySx 
才能正常启动shell,完成以上脚本的执行,那就要看具体情况了。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>3<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>使用中的一些问题的思考</FONT></STRONG></DIV>
<DIV><STRONG><FONT size=5><SPAN>3.1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>关于规则的多次匹配</FONT></STRONG></DIV>
<DIV>帮助文档中说一个设备可以被多条规则多次匹配,不过,需要明确的一点是:</DIV>
<DIV>多次匹配只能添加多个Symlink,不能创建多个Name:</DIV>
<DIV>&nbsp;</DIV>
<DIV>例如:</DIV>
<DIV>KERNEL=="mtdblock4", NAME+="mtdbb4"</DIV>
<DIV>KERNEL=="mtdblock4", NAME+="%k"</DIV>
<DIV>就只会创建 /dev/mtdbb4 而不会创建/dev/mtdblock4</DIV>
<DIV>&nbsp;</DIV>
<DIV>而类似:</DIV>
<DIV>KERNEL=="mtdblock4", NAME+="mtdbb4"</DIV>
<DIV>KERNEL=="mtdblock4", SYMLINK+="mtdbb4link"</DIV>
<DIV>是可以正常工作的。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=5><SPAN>3.2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>关于udev.conf的语法</FONT></STRONG></DIV>
<DIV>可能大家会发现,似乎没有什么详细文档描述udev.conf的写法,实际上从udevd的代码里可以看出:</DIV>
<DIV>&nbsp;</DIV>
<DIV>udev.conf文件里面只会解析这三个参数:</DIV>
<DIV>&nbsp;</DIV>
<DIV>udev_root 定义udev的目录路径</DIV>
<DIV>udev_rules 定义udev的规则文件的目录路径</DIV>
<DIV>udev_log 定义log的级别</DIV>
<DIV>&nbsp;</DIV>
<DIV>也许以后会添加一些别的配置参数?</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>4<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>基本工作原理方面的问题</FONT></STRONG></DIV>
<DIV>这部分主要是分析了一下udev的source code,对一些自己关心的问题的理解</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=5><SPAN>4.1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>Udevd如何获取内核的这些模块动态变化的信息</FONT></STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>设备节点的创建,是通过sysfs接口分析dev文件取得设备节点号,这个很显而易见。那么udevd是通过什么机制来得知内核里模块的变化情况,如何得知设备的插入移除情况呢?当然是通过hotplug机制了,那hotplug又是怎么实现的?或者说内核是如何通知用户空间一个事件的发生的呢?</DIV>
<DIV>&nbsp;</DIV>
<DIV>答案是通过netlink socket通讯,在内核和用户空间之间传递信息。</DIV>
<DIV>&nbsp;</DIV>
<DIV>内核调用kobject_uevent函数发送netlink 
message给用户空间,这部分工作通常不需要驱动去自己处理,在统一设备模型里面,在子系统这一层面,已经将这部分代码处理好了,包括在设备对应的特定的Kobject创建和移除的时候都会发送相应add和remove消息,当然前提是你在内核中配置了hotplug的支持。</DIV>
<DIV>Netlink 
socket作为一种内核与用户空间的通信方式,不仅仅用在hotplug机制中,同样还应用在其它很多真正和网络相关的内核子系统中。</DIV>
<DIV>&nbsp;</DIV>
<DIV>Udevd通过标准的socket机制,创建socket连接来获取内核广播的uevent事件 并解析这些uevent事件。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=5><SPAN>4.2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>Udevd如何监控规则文件的变更</FONT></STRONG></DIV>
<DIV>如果内核版本足够新的话,在规则文件发生变化的时候,udev也能够自动的重新应用这些规则,这得益于内核的inotify机制, 
inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知。</DIV>
<DIV>&nbsp;</DIV>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -