Linux设备驱动模型中的热插拔机制

Linux设备驱动模型中的热插拔机制

ID:43515595

大小:23.00 KB

页数:3页

时间:2019-10-09

Linux设备驱动模型中的热插拔机制_第1页
Linux设备驱动模型中的热插拔机制_第2页
Linux设备驱动模型中的热插拔机制_第3页
资源描述:

《Linux设备驱动模型中的热插拔机制》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、热插拔(hotplug,打这个词的时候我常常想到热干面)不一定非要指类似U盘那样的插入拔出,此处的热插拔广义上讲,是指一个设备加入系统,内核如何通知用户空间。举个简单的例子,如果你的电脑中有块PCI网卡,针对该网卡的驱动程序以内核模块的形式被编译(obj-m),那么Linux系统在启动过程中是如何自动加载该网卡的驱动模块呢?大家都知道现在udev负责干这事,其实除了udev,还可以有其他的手法,你自己就可以这样做。我们先讨论udev,udev最关键的东西是当系统发现一个设备时,它要能够被通知该事件,一旦它知道了这件事,那么余下的事情就都好说了,无非是个如何查找模块并加载的过程。所以我们看

2、到,这里的关键是热插拔事件的通知机制。Linux的设备模型为此提供了非常完美的支持,其原理其实发源于kset这一层,对此在《深入Linux设备驱动程序内核机制》一书中有详细的描述,虽然这部分看起来蛮复杂,貌似挺能吓唬住一些新手,其实说白了,要点就是通过sysfs建立关系,沟通内核与用户空间,然后就是uevent,也就是下面要说的热插拔事件。当然设备驱动程序一般不会和这些太底层的kobject/kset家伙打交道,因为更高层次的device,bus和driver把kobject/kset那一层的细节实现都给封装了起来。所以设备热插拔的uevent事件最终的源头来自于device_add,本

3、帖这里肯定不会讨论device与driver如何绑定那一摊子事情。下面看看device_add的源码,是如何实现uevent机制的:intdevice_add(structdevice*dev){...kobject_uevent(&dev->kobj,KOBJ_ADD);...}复制代码热插拔的核心实现就那一个函数调用,这里device_add对应的是KOBJ_ADD,那么移除设备自然对应KOBJ_REMOVE了。kobject_uevent函数最终调用的是kobject_uevent_env,后者才是真正干事的伙计。下面给出kobject_u

4、event_env函数的核心框架:intkobject_uevent_env(structkobject*kobj,enumkobject_actionaction,char*envp_ext[]){...#ifdefined(CONFIG_NET)/*sendnetlinkmessage*/...#endif/*calluevent_helper,usuallyonlyenabledduringearlyboot*/if(uevent_helper[0]&&!kobj_usermode_filter(kobj)){char*argv[3];argv[0]=uevent_helper;a

5、rgv[1]=(char*)subsystem;argv[2]=NULL;retval=add_uevent_var(env,"HOME=/");if(retval)gotoexit;retval=add_uevent_var(env,"PATH=/sbin:/bin:/usr/sbin:/usr/bin");if(retval)gotoexit;retval=call_usermodehelper(argv[0],argv,env->envp,UMH_WAIT_EXEC);}...}复制代码怎么样,够简洁吧,其实看实际的代码比这要郁闷地多,不过骨架清晰就行了。代码中的netlinkme

6、ssage就不用多说了吧,给udev发通知用(有时间的话可以分析分析udev的代码)。本帖重点讨论后半段的if(uevent_helper[0]&&!kobj_usermode_filter(kobj))代码,这里的核心调用是call_usermodehelper,这个函数最有意思的地方就在于在内核空间调用用户空间的程序,它的详细实现机制在书中已经讲得很多,这里就不再赘述了。call_usermodehelper在kobject_uevent_env函数中要调用的用户空间程序由uevent_helper[0]来指定,所以如果我们能控制这个uevent_helper[0],就能接收到设备加

7、入系统移出系统等事件。那个if中的kobj_usermode_filter条件一般都会满足(除非这是个特别注意个人隐私的设备,那就不好说了,人家偷偷加入系统就是不想让你知道你也没有办法,但是udev还是能知道的)。下面看看uevent_helper[0]来自何处:charuevent_helper[UEVENT_HELPER_PATH_LEN]=CONFIG_UEVENT_HELPER_P

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。