Linux设备模型热插拔、mdev与firmware

上传人:人*** 文档编号:456659845 上传时间:2023-08-10 格式:DOC 页数:10 大小:104KB
返回 下载 相关 举报
Linux设备模型热插拔、mdev与firmware_第1页
第1页 / 共10页
Linux设备模型热插拔、mdev与firmware_第2页
第2页 / 共10页
Linux设备模型热插拔、mdev与firmware_第3页
第3页 / 共10页
Linux设备模型热插拔、mdev与firmware_第4页
第4页 / 共10页
Linux设备模型热插拔、mdev与firmware_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Linux设备模型热插拔、mdev与firmware》由会员分享,可在线阅读,更多相关《Linux设备模型热插拔、mdev与firmware(10页珍藏版)》请在金锄头文库上搜索。

1、Linux设备驱动程序学习(15 )-Linux 设备模型(热插拔、mdev 与 firmware )热插拔有2个不同角度来看待热插拔:从内核角度看,热插拔是在硬件、内核和内核驱动之间的交互。从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev和mdev )的交互。当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。现在的计算机系统,要求 Linux内核能够在硬件从系统中增删时,可靠稳定地运行。这就对设备驱动作 者增加了压力,因为在他们必须处理一个毫无征兆地突然出现或消失的设备。热插拔工具当用户向系统添加或删除设备时,内核会产生一个热插拔

2、事件,并在/proc/sys/kernel/hotplug文件里查找处理设备连接的用户空间程序。这个用户空间程序主要有hotplug: 这个程序是一个典型的 bash脚本,只传递执行权给一系列位于 /etc/hot-plug.d/目录树的程序。hotplug 脚本搜索所有的有.hotplug 后缀的可能对这个事件进行处理的程序并调用它们,并传递给它们许多不同的已经被内核设置的环境变量。(基本已被淘汰,具体内容请参阅 LDD3)udev :用于Iinux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。它通过在sysfs的/class/ 和/block/

3、目录树中查找一个称为 dev的文件,以确定所创建的设备节点文件的主次设备号。所以要使用udev,驱动必须为设备在 sysfs中创建类接口及其 dev属性文件,方法和sculld模块中创建dev属性相同。udev的资料网上十分丰富,我就不在这废话了,给出以 下链接有兴趣的自己研究:UDEV Primer(英文),地址:http:/ UDEVPrimer.htmludev规则编写(luofuchong 翻译),地址:http:/ udev地址:http:/ 中文翻译地址:http:/ 轻松上路地址:http:/ (简体中文)地址:http:/wiki.archlinux.org/index.php

4、/Udev%28%E7%AE%80%E4%BD%93%E4%B8%AD %E6%96%87)Udev 官方主页:http:/www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html下载地址:http:/www.kernel.org/pub/linux/utils/kernel/hotplug/在LFS中也有介绍udev的使用,很值得参考!下载地址:http:/lfs.osuosl.org/lfs/downloads/stable/ mdev : 一个简化版的udev,是busybox 所带的程序,十分适合嵌入式系统。因为hotplug现在也

5、在被慢慢地淘汰,udev不再依赖hotplug 了,所以这里不再介绍;udev较mdev复杂,不太适合嵌入式使用。(本人也有做udev的实验,交叉编译是通过了,但是使用上有问题,没有实现其功能。也许是我的文件系统没做好,以后有时间再研究和写记录。有成功高人的通 知一声,交流一下经验。A_A谢谢!);mdev 简单易用,比较适合嵌入式系统,实验成功。以下详细介绍mdev的使用。mdev在一开始建立根文件系统时,我根据WeiBing的博客上UDEV on embeded Linux-2.6.19.2(地址:http:/ mdev -s一下,并没有深究。现在在学习了Linux设备模型之后,对于 Li

6、nux中/dev目录的动态管理有了更深的认识,并认真的看了一下busybox 中的mdev.txt 文档并翻译了一下,做成了PDF (下载地址:http:/ 类 接口,并在类设备的目录中添加包含设备号的名为“dev”的属性文件。mdev 原理及bug要使用mdev,适当知道一下原理是必不可少的(能完整地研究 mdev源码是最好的)。说实话起初我并 没有想看mdev的源码,是在使用时发现了问题后才去研究了一下mdev的源码。现在简单介绍一下 mdev的原理:执行mdev -s :以,-s?为参数调用位于/sbin目录写的mdev (其实是个链接,作用是传递参数给/bin目录下的busybox 程

7、序并调用它),mdev扫描/sys/class 和/sys/block中所有的类设备目录,如果在目录中含有名为“dev的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次“mdev -s”。热插拔事件:由于启动时运行了命令: echo /sbin/mdev /proc/sys/kernel/hotplug,那么当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了 /sys中的那个目录。接着会看看这个目录中是否有“

8、dev的属性文件,如果有就利用这些信息为这个设备在/dev下创建设备节点文件。源码的bug (个人意见):由于 mdev是通过判断“dev”属性文件的路径字符串中 的第6个字符是否为,c?,来决定设备是字符设备还是块设备【type = (path5=c ? S_IFCHR : S_IFBLK); 例如 path = /sys/class/ldd/sculld*/为字符设备,而/ sys / devices / ldd0 /sculld*/就会被误判为块设备】,那么如果你在非/sys/class 和/sys/block目录下建立了 “ dev属性文件且内容是设备号(像sculld中就这样做了),

9、那么 mdev也会在/dev 下创建设备节点文件。这样可能 所创建的设备节点文件是错的。以我实验为例,我以上一篇的文章中的sculld为基础,加上了类接口 (这样在/ sys/ devices / ldd0 /sculld*/ 和 /sys/class/ldd/sculld*中都有内容为设备号的“dev”属性文件)。在运行时发现一直会将有的sculld*创建为块设备节点文件。郁闷死了,难道我的驱动有错? ?最后研究了 mdev源码之后发现,只要在 /sys中建立了 “ dev属性文件且内容是设备号,mdev就会以所在的目录为名在 /dev下创建设备节点文件。像sculld模块,mdev会为一个

10、设备创建两次设备文件,由于文件名一样,第二次的文件会覆盖第一次的。如果第二次是因为/ sys/ devices / ldd0 /sculld*/dev产生的设备节点文件,那么设备节点文件就会被错误地创建为块设备。我认为这个bug的解决办法有如下两种:(1 )在你写驱动的时候,只在/sys/class 和/sys/block 中的类设备目录中存在包含设备号的“dev”属性文件。(你无法保证被人的驱动会这么做)(2 )修正mdev 源码:修改 /busybox-1.9.0/util-linux/mdev.c文件的第 328 行:if (! strcmp (action , remove) make

11、_device (temp, 1 );else if (! strcmp (action , add) if (en v_path2=T) make_device(temp,0); /tekkama nninjaif (ENABLE_FEATURE_MDEV_LOAD_FIRMWAREload firmware(gete nv( FIRMWAREtemp);也就是在增加设备节点文件之前检查/sys/目录下的路径是否为/c l ass和/b l ock (通过检查路径字符串的第3个字符是否为,l?)o本人推荐第二种做法!mdev 使用mdev的使用在busybox 中的mdev.txt 文档已经

12、将得很详细了。但作为例子,我简单讲讲我的使用过程:(1 )在编译时加上对 mdev的支持(我是使用的是 busybox1.9.0 ):Linux System Utilities-* mdev* Support /etc/mdev.conf* Support command execution at device addition/removal(2 )在启动时加上使用 mdev的命令:我在自己创建的根文件系统(nfs )中的/linuxrc 文件中添加了如下指令:#挂载/sys为sysfs文件系统echo mount /sys as sysfs/ bin / mount -1 tmpfs m

13、dev / dev/ bin / mount -1 sysfs sysfs / sysecho Start ing mdev/ bin / echo / sbin / mdev / proc/ sys/ kernel / hotplug mdev - s注意:是/bin / echo /sb in / mdev / proc/sys/ ker nel / hotplug , 并非 /bin / echo/bin / mdev / proc / sys/ ker nel /hotplug。busybox 的文档有错!(3 )在你的驱动中加上对类设备接口的支持,并在类设备目录下添加包含设备号的名为

14、“dev”的属性文件。(4 )至于/etc/mdev.conf文件,可有可无,不影响使用,只是添加了些功能。为了实验我在/etc仓U建了 mdev.conf文件并输入了:sculld 0-1 0:0 666 * echo tekkaman / tmp/ mdev这样,在挂载和卸载 sculld.ko 时,在/tmp/下会出现 mdev文件,里面字符为 tekkaman具体的实验源码和现象在文章后面有。firmware硬件市场的激烈竞争,使得制造商连一点用于设备控制固件的EEPROM的成本都不愿意花费。因此固件一般发布在和硬件配套的驱动包中,由操作系统(其实是驱动程序)负责传送固件到设备。内核固件接口获

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号