一种适用于Linux嵌入式系统的热插拔处理方法

文档序号:6374755阅读:236来源:国知局
专利名称:一种适用于Linux嵌入式系统的热插拔处理方法
技术领域
本发明涉及Linux嵌入式系统技术领域,尤其涉及一种适用于Linux嵌入式系统的热插拔处理方法。
背景技术
热插拔(Hot swapping或Hot plugging)即“带电插拔”,指可以在电脑运作时插上或拔除硬件。配合适当的软件,便可以在不用关闭电源,不关闭系统的情况下插入或拔除支援热插拔的周边装置,不会导致主机或周边装置烧毁并且能够即时侦测及使用新的装置。这个过程可以是取出或者更换损坏的硬盘、电源或者板卡等部件,从而提高了系统的扩展性、灵活性以及对灾难的及时恢复能力。
Linux系统支持热插拔功能,在历史上发生了很大的变化,这里简介当前使用的处
理方案。当前Linux热插拔系统,分为内核驱动和用户空间应用程序,当插入新的硬件时,Linux内核会产生一个热插拔信息,具体为硬件的位置信息即DEVPATH,所属的子系统信息即SUBSYSTEM,动作信息即ACTION等,根据这些字段,可以通过查看sysfs文件系统获取到插入或拔出的硬件的详细信息。内核通过2个方法通知应用层空间的进程。一个方法为把标识热插拔的字符信息设置成环境变量,然后执行/proc/sys/kernel/hotplug文件指定的应用层程序,具体热插拔方案把热插拔处理入口程序的名称写入/proc/sys/kernel/hotplug文件,应用层程序可以从环境变量中得知热插拔消息。另一个方法为内核通过一个称为NETLINK的socket (套接字)广播一条热插拔信息,该信息为字符串,消息的内容包括了硬件的位置即DEVPATH、所属的子系统即SUBSYSTEM字段、动作即ACTION字段等,根据这些字段,可以通过查看sysfs文件系统获取到插入或拔出的硬件的详细信息;用户空间的热插拔处理程序可建立一个PF_NETLINK类型的socket接收这些消息,然后进行处理。当前PC上使用UDEV软件包处理热插拔事件,这个软件包相当完善,可配配置性很好,很灵活,但是太大了,需要用到SHELL脚本,并不适合在对资源要求很苛刻的嵌入式系统中。在Linux嵌入式系统中,普遍配置的SHELL工具busybox有一个MDEV的热插拔处理系统,该系统是UDEV的简化版,但还是比较大,配置不灵活。—般的嵌入式热插拔代方法都是直接进行编程,即直接写一个程序,程序名写入/proc/sys/kernel/hotplug文件,或直接建立PF_NETLINK类型的socket接收热插拔消息,收到特定的消息即进行特定的处理,但是这会导致很多问题,具体有采用/proc/sys/kernel/hotplug方法时,热插拔处理不能太久,否则会阻塞内核驱动程序的进一步工作,采用监听socket方式时,会出现丢失事件等问题,并且这种简单的方法不够灵活,不便于处理不同的硬件
发明内容
本发明的目的在于提供一种适用于Linux嵌入式系统的热插拔处理方法,有较强的通用性和灵活性,且比较简单。本发明的目的是通过以下技术方案实现的。一种适用于Linux嵌入式系统的热插拔处理方法,包括步骤
设置热插拔配置文件,用于配置需要处理的热插拔事件信息及其相应的处理动作; 监听Linux的Netlink套接字发来的热插拔事件;
在监听到新的热插拔事件时,通过查询Linux的sysfs文件系统获取该热插拔事件的信息,并据此查询热插拔配置文件以判断该热插拔事件是否需要处理,如需要则建立一个子进程进行处理,并且按先后顺序串行地处理各热插拔事件。上述方法中还包括设置一个先进先出队列,用于缓存待处理的热插拔事件;所 述先进先出队列的元素为一个事件描述符,记录从Netlink套接字收到的所有字符串,包括硬件的位置信息、所属的子系统信息、动作信息、处理该热插拔事件的进程号、处理该热插拔事件的方法、处理该热插拔事件的时长。上述方法中,所述热插拔配置文件中由至少一个条目组成,所述条目包括索引、处理方法和处理时长;所述索引为所述事件描述符中记录的硬件的位置信息、所属的子系统
信息、动作信息。上述方法中,对各热插拔事件按先后顺序串行地处理的过程为
在监听到新的热插拔事件时,判断所述先进先出队列长度是否超过设定值;若未超过设定值,则判断该热插拔事件是否需要处理,如需要处理,则从所述热插拔配置文件中获取处理该热插拔事件的方法及时长,建立一个事件描述符记录该内容,并插入到先进先出队列排队等候处理;若超过设定值,则丢弃当前监听到的热插拔事件,返回监听状态;
判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。上述方法中,判断当前的热插拔事件是否需要处理的方法为
以当前的热插拔事件的硬件的位置信息、所属的子系统信息和/或动作信息的内容为索引,查找所述热插拔配置文件,若有匹配的记录,则该热插拔事件需要处理,否则不需要处理。上述方法中,还包括监听热插拔处理进程退出事件;在监听到热插拔处理进程退出事件时,删除所述先进先出队列的尾元素;
判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。上述方法中,还包括监听热插拔处理进程超时事件;在监听到热插拔处理进程超时事件时,从所述先进先出队列的尾元素中获取该事件的处理进程,杀死该处理进程,之后删除先进先出队列的尾元素;
判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。与现有技术相比,本发明实施例具有以下有益效果占用空间小,适合资源受限的嵌入式系统使用;适应性、可重用性、可扩展性强,可以满足嵌入式系统应用环境多变,外设多样化的需求;稳定性强,单个设备的热插拔处理程序崩溃不会影响整个热插拔系统。


图I是本发明实施例中适用于Linux嵌入式系统的热插拔处理方法流程图。
具体实施例方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。本发明的核心思想为建立一个热插拔后台进程,用于监听和处理Linux的Netlink套接字发来的热插拔事件,并配置一热插拔配置文件,用于配置需要进行处理的具体热插拔事件的处理动作;对于所监听到的热插拔事件,通过查询Linux的sysfs文件系统获取热插拔事件的细节,根据热插拔配置文件判断每一个热插拔事件是否需要处理,如需要则建立一个子进程进行处理,并且各事件按先后顺序串行地处理。本发明中,需设置一个FIFO (先进先出)队列,用于缓存待处理的热插拔事件,其中FIFO队列的元素为一个事件描述符,包括从Netlink套接字收到的所有字符串,DEVPATH,SUBSYSTEM和ACTION部分的内容,处理该事件的进程号,处理该事件的方法,处理该事件的时长。 判断每一个热插拔事件是否需要处理的方法如下设置一个热插拔配置文件,用于配置具体热插拔事件的处理动作,文件由多个条目组成,条目包括索引,处理方法和处理时长,索引为所述的事件记录的DEVPATH, SUBSYSTEM, ACTION内容,处理方法为一个处理函数,或一个外部命令,对于一个热插拔事件,用其DEVPATH, SUBSYSTEM, ACTION的内容作为索引,查找上述配置文件,有匹配的记录,则事件需要处理。请参阅图1,本实施例中适用于Linux嵌入式系统的热插拔处理方法包括以下步骤。101、等待热插拔事件、热插拔处理进程退出事件和热插拔处理进程超时事件。如收到热插拔事件跳到步骤102,如收到热插拔处理进程退出事件跳到105,如收到热插拔处理进程超时事件跳到步骤104。102、判断FIFO队列长度是否超过设定值,如超过,即缓冲区满,则丢弃当前监听到的热插拔事件,跳到步骤101,重新回到监听状态;若未超过,则继续执行步骤103。103、判断当前接收到的热插拔事件是否需要处理,如不需要跳到步骤101,如需要则从所述的配置文件中获取该事件的处理方法和处理时长,建立一个事件描述符记录该内容,并插入到FIFO队列中等候处理,然后跳到步骤106。104、从FIFO队列的尾元素中获取该事件的处理进程,然后杀死该进程。105、删除FIFO队列的尾元素。106、查看FIFO队列是否为空,如为空跳到步骤101,否则建立一个新进程处理该事件,原进程跳到步骤101。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法包括步骤 设置热插拔配置文件,用于配置需要处理的热插拔事件信息及其相应的处理动作; 监听Linux的Netlink套接字发来的热插拔事件; 在监听到新的热插拔事件时,通过查询Linux的sysfs文件系统获取该热插拔事件的信息,并据此查询热插拔配置文件以判断该热插拔事件是否需要处理,如需要则建立一个子进程进行处理,并且按先后顺序串行地处理各热插拔事件。
2.如权利要求I所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法中还包括设置一个先进先出队列,用于缓存待处理的热插拔事件;所述先进先出队列的元素为一个事件描述符,记录从Netlink套接字收到的所有字符串,包括硬件的位置信息、所属的子系统信息、动作信息、处理该热插拔事件的进程号、处理该热插拔事件的方法、处理该热插拔事件的时长。
3.如权利要求2所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,所述热插拔配置文件中由至少一个条目组成,所述条目包括索引、处理方法和处理时长;所述索引为所述事件描述符中记录的硬件的位置信息、所属的子系统信息、动作信息。
4.如权利要求3所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法中,对各热插拔事件按先后顺序串行地处理的过程为 在监听到新的热插拔事件时,判断所述先进先出队列长度是否超过设定值;若未超过设定值,则判断该热插拔事件是否需要处理,如需要处理,则从所述热插拔配置文件中获取处理该热插拔事件的方法及时长,建立一个事件描述符记录该内容,并插入到先进先出队列排队等候处理;若超过设定值,则丢弃当前监听到的热插拔事件,返回监听状态; 判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。
5.如权利要求4所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法中,判断当前的热插拔事件是否需要处理的方法为 以当前的热插拔事件的硬件的位置信息、所属的子系统信息和/或动作信息的内容为索引,查找所述热插拔配置文件,若有匹配的记录,则该热插拔事件需要处理,否则不需要处理。
6.如权利要求2所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法中还包括 监听热插拔处理进程退出事件;在监听到热插拔处理进程退出事件时,删除所述先进先出队列的尾元素; 判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。
7.如权利要求2所述适用于Linux嵌入式系统的热插拔处理方法,其特征在于,该方法中还包括 监听热插拔处理进程超时事件;在监听到热插拔处理进程超时事件时,从所述先进先出队列的尾元素中获取该事件的处理进程,杀死该处理进程,之后删除先进先出队列的尾元素; 判断所述先进先出队列是否为空,若不为空,则处理先进先出队列的尾元素。
全文摘要
本发明提供了一种适用于Linux嵌入式系统的热插拔处理方法,包括步骤设置热插拔配置文件,用于配置需要处理的热插拔事件信息及其相应的处理动作;监听热插拔事件;在监听到新的热插拔事件时,通过查询Linux的sysfs文件系统获取该热插拔事件的信息,并据此查询热插拔配置文件以判断该热插拔事件是否需要处理,如需要则建立一个子进程进行处理,并且按先后顺序串行地处理各热插拔事件。与现有技术相比,本发明实施例占用空间小,适合资源受限的嵌入式系统使用;适应性、可重用性、可扩展性强,满足嵌入式系统应用环境多变,外设多样化的需求;稳定性强,单个设备的热插拔处理程序崩溃不会影响整个热插拔系统。
文档编号G06F9/44GK102830970SQ201210283879
公开日2012年12月19日 申请日期2012年8月10日 优先权日2012年8月10日
发明者申常扳, 王金桂 申请人:深圳市共进电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1