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

📄 linux设备驱动程序学习(15)-linux设备模型(热插拔、mdev 与 firmware) - linux设备驱动程序 - tekkaman ninja.htm

📁 Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 firmware) - Linux设备驱动程序.rar
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        firmware)</B></FONT></B></FONT><BR></TD></TR>
                    <TR>
                      <TD bgColor=#d2dee2 height=1></TD></TR>
                    <TR>
                      <TD bgColor=#ffffff height=1></TD></TR>
                    <TR>
                      <TD align=middle>
                        <TABLE 
                        style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" 
                        cellSpacing=0 cellPadding=0 width="100%" border=0>
                          <TBODY>
                          <TR>
                            <TD width="100%">
                              <DIV id=art style="MARGIN: 15px" width="100%">
                              <P align=center><FONT color=#0000ff 
                              size=5><STRONG>Linux设备驱动程序学习(15)</STRONG></FONT></P>
                              <P align=center><FONT color=#0000ff 
                              size=5><STRONG>-Linux设备模型(热插拔、mdev 与 
                              firmware)</STRONG></FONT></P>
                              <DIV></DIV>
                              <DIV></DIV>
                              <P><FONT color=#0000ff 
                              size=3><STRONG>热插拔</STRONG></FONT><BR>有 2 
                              个不同角度来看待热插拔:<BR><FONT color=#0000ff>&nbsp;&nbsp; 
                              从内核角度看</FONT>,热插拔是在硬件、内核和内核驱动之间的交互。<BR><FONT 
                              color=#0000ff>&nbsp;&nbsp; 
                              从用户角度看</FONT>,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev 
                              和 mdev)的交互。 
                              当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。<BR>现在的计算机系统,要求 
                              Linux 
                              内核能够在硬件从系统中增删时,可靠稳定地运行。这就对设备驱动作者增加了压力,因为在他们必须处理一个毫无征兆地突然出现或消失的设备。</P>
                              <P></P>
                              <HR id=null>

                              <P></P>
                              <P><FONT color=#0000ff 
                              size=3><STRONG>热插拔工具<BR></STRONG></FONT>当用户向系统添加或删除设备时,内核会产生一个热插拔事件,并在 
                              <FONT 
                              color=#0000ff>/proc/sys/kernel/hotplug</FONT> 
                              文件里查找处理设备连接的用户空间程序。这个用户空间程序主要有</P>
                              <P><FONT 
                              color=#0000ff><STRONG>hotplug:</STRONG></FONT>这个程序是一个典型的 
                              <FONT color=#660099>bash 脚本</FONT>,只传递执行权给一系列位于 
                              /etc/hot-plug.d/ 目录树的程序。hotplug 脚本搜索所有的有 .hotplug 
                              后缀的可能对这个事件进行处理的程序并调用它们, 
                              并传递给它们许多不同的已经被内核设置的环境变量。(基本已被淘汰,具体内容请参阅《LDD3》)</P>
                              <DIV><FONT color=#0000ff><STRONG>udev 
                              :</STRONG></FONT><FONT 
                              color=#000000>用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。</FONT><FONT 
                              color=#000000>它通过在 sysfs 的 /class/ 和/block/ 
                              目录树中查找一个称为 dev 
                              的文件,以确定所创建的设备节点文件的主次设备号。所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和<FONT 
                              color=#000000>sculld模块中创建dev属性相同。</FONT> 
                              udev的资料网上十分丰富,我就不在这废话了,给出以下链接有兴趣的自己研究:</FONT></DIV>
                              <DIV>
                              <TABLE 
                              style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" 
                              align=center>
                                <TBODY>
                                <TR>
                                <TD>
                                <DIV>《<A name=linuxsetup>UDEV 
                                Primer</A>》(英文),地址:<A 
                                href="http://webpages.charter.net/decibelshelp/LinuxHelp_UDEVPrimer.html">http://webpages.charter.net/decibelshelp/LinuxHelp_UDEVPrimer.html</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>《udev规则编写》(luofuchong翻译),地址:<A 
                                href="http://www.cnitblog.com/luofuchong/archive/2007/12/18/37831.html">http://www.cnitblog.com/luofuchong/archive/2007/12/18/37831.html</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>《什么是udev》地址:<A 
                                href="http://blog.csdn.net/steganography/archive/2006/04/10/657620.aspx">http://blog.csdn.net/steganography/archive/2006/04/10/657620.aspx</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>《udev-FAQ 中文翻译》地址:<A 
                                href="http://gnawux.bokee.com/3225765.html">http://gnawux.bokee.com/3225765.html</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>《udev轻松上路》地址:<A 
                                href="http://www.blog.edu.cn/user1/3313/archives/2007/1635169.shtml">http://www.blog.edu.cn/user1/3313/archives/2007/1635169.shtml</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>《Udev (简体中文)》地址:<A 
                                href="http://wiki.archlinux.org/index.php/Udev_(&ccedil;&reg;&#128;&auml;&frac12;&#147;&auml;&cedil;&shy;&aelig;&#150;&#135;">http://wiki.archlinux.org/index.php/Udev_(&ccedil;&reg;&#128;&auml;&frac12;&#147;&auml;&cedil;&shy;&aelig;&#150;&#135;</A>)</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>下载地址:<A 
                                href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/">http://www.kernel.org/pub/linux/utils/kernel/hotplug/</A></DIV>
                                <DIV>&nbsp;</DIV>
                                <DIV>在《LFS》中也有介绍udev的使用,很值得参考!下载地址:<A 
                                href="http://lfs.osuosl.org/lfs/downloads/stable/">http://lfs.osuosl.org/lfs/downloads/stable/</A></DIV></TD></TR></TBODY></TABLE></DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV><FONT 
                              color=#0000ff><STRONG>mdev:</STRONG></FONT><FONT 
                              color=#000000>一个简化版的udev,是busybox所带的程序,十分适合嵌入式系统。</FONT></DIV>
                              <DIV>&nbsp;</DIV>
                              <P>因为<FONT 
                              color=#0000ff><STRONG>hotplug</STRONG></FONT><FONT 
                              color=#000000>现在也在被慢慢地淘汰,udev不再依</FONT><FONT 
                              color=#000000>赖hotplug了,所以这里不再介绍;</FONT></P>
                              <P><FONT color=#0000ff><STRONG>udev</STRONG><FONT 
                              color=#000000>较mdev复杂,不太适合嵌入式使用。(本人也有做udev的实验,交叉编译是通过了,但是使用上有问题,没有实现其功能。也许是我的文件系统没做好,以后有时间再研究和写记录。有成功高人的通知一声,交流一下经验。^_^谢谢!);</FONT></FONT></P>
                              <P><FONT color=#0000ff><STRONG>mdev</STRONG><FONT 
                              color=#000000>简单易用,比较适合嵌入式系统,实验成功。以下详细介绍mdev的使用。 
                              </FONT></FONT></P>
                              <DIV>
                              <HR id=null>
                              </DIV>
                              <DIV><FONT color=#0000ff 
                              size=4><STRONG>mdev</STRONG></FONT></DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV>在一开始建立根文件系统时,我根据 WeiBing 的博客上《UDEV on embeded 
                              Linux-2.6.19.2》(地址:<A 
                              href="http://weibing.blogbus.com/logs/4485453.html">http://weibing.blogbus.com/logs/4485453.html</A>)这篇文章的提示,开始使用mdev,但是当时只是启动时mdev 
                              -s 
                              一下,并没有深究。现在在学习了Linux设备模型之后,对于Linux中/dev目录的动态管理有了更深的认识,并认真的看了一下busybox中的mdev.txt文档并翻译了一下,做成了PDF(下载地址:<A 
                              href="http://blogimg.chinaunix.net/blog/upfile2/080111091002.pdf">http://blogimg.chinaunix.net/blog/upfile2/080111091002.pdf</A>),<FONT 
                              color=#0000ff>在看下面的内容时请先看看这篇文档。</FONT></DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV><FONT color=#ff0000 
                              size=3><STRONG>先声明一个要点:要实现设备节点文件的自动、动态的增删,必须在你自己的驱动源码中实现 
                              接口,并在类设备的目录中添加包含设备号的名为“dev”的属性文件。</STRONG></FONT></DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV><FONT color=#0000ff 
                              size=3><STRONG>mdev原理及bug</STRONG></FONT></DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV>要使用mdev,适当知道一下原理是必不可少的(能完整地研究mdev源码是最好的)。说实话起初我并没有想看mdev的源码,是在使用时发现了问题后才去研究了一下mdev的源码。现在简单介绍一下mdev的原理:</DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV><FONT color=#0000ff><STRONG>执行mdev 
                              -s</STRONG></FONT> :以‘-s’为参数调用位于 
                              /sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 
                              /sys/class 和 /sys/block 
                              中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 
                              下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。</DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV>&nbsp;<STRONG><FONT 
                              color=#0000ff>热插拔事件</FONT></STRONG>:由于启动时运行了命令:echo 
                              /sbin/mdev &gt; /proc/sys/kernel/hotplug 
                              ,那么当有热插拔事件产生时,内核就会调用位于 
                              /sbin目录的mdev。这时mdev通过环境变量中的&nbsp;ACTION 和 
                              DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 
                              下创建设备节点文件。</DIV>
                              <DIV>&nbsp;</DIV>
                              <DIV>
                              <TABLE 
                              style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" 
                              align=center>
                                <TBODY>
                                <TR>
                                <TD>
                                <P><FONT color=#0000ff><FONT 
                                color=#ff0000>源码的bug</FONT>(个人意见):</FONT><FONT 
                                color=#0000ff>由于mdev是通过判断“dev”属性文件的路径字符串中的第6个字符是否为‘c’,来决定设备是字符设备还是块设备【<FONT 
                                color=#ff0000>type = (path[5] == 'c' ? S_IFCHR : 
                                S_IFBLK</FONT><FONT 
                                color=#ff0000>);</FONT>例如path = 
                                "/sys/class/ldd/sculld*/"为字符设备,而<FONT 
                                face=新宋体><SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>sys<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>devices<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>ldd0<SPAN 
                                style="COLOR: rgb(0,0,204)">/sculld*/ 
                                就会被误判为块设备】</SPAN></FONT>,那么如果你在非 /sys/class 和 
                                /sys/block 
                                目录下建立了“dev”属性文件且内容是设备号(像sculld中就这样做了),那么mdev也会在/dev 
                                下创建设备节点文件。这样可能所创建的设备节点文件是错的。</FONT></P>
                                <P><FONT 
                                color=#0000ff>以我实验为例,我以上一篇的文章中的sculld为基础,加上了类接口(这样在<FONT 
                                face=新宋体><SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>sys<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>devices<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>ldd0<SPAN 
                                style="COLOR: rgb(0,0,204)">/sculld*/和<FONT 
                                face="Courier New"> /sys/class/ldd/sculld* 
                                中都有内容为设备号的“dev”属性文件</FONT></SPAN></FONT>)。在运行时发现一直会将有的sculld*创建为块设备节点文件。郁闷死了,难道我的驱动有错???最后研究了mdev源码之后发现,只要在 
                                /sys中建立了“dev”属性文件且内容是设备号,mdev就会以所在的目录为名在/dev 
                                下创建设备节点文件。像sculld模块,mdev会为一个设备创建两次设备文件,由于文件名一样,第二次的文件会覆盖第一次的。如果第二次是因为<FONT 
                                face=新宋体><SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>sys<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>devices<SPAN 
                                style="COLOR: rgb(0,0,204)">/</SPAN>ldd0<SPAN 

⌨️ 快捷键说明

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