一种多核环境下的补丁方法与补丁装置的制作方法

文档序号:6578572阅读:266来源:国知局
专利名称:一种多核环境下的补丁方法与补丁装置的制作方法
技术领域
本发明涉及通信技术领域,特别涉及一种多核环境下的补丁方法与补丁 装置。
背景技术
多核技术已经成为处理器技术发展的新方向,目前主流处理器厂商的路
标都是多核处理器。如RAZA公司推出的MIPS (Microprocessor Without Interlocked Pipeline Stages:无互锁管线阶段的处理器)架构的XLR732处理器 有8个核,每个核包含4个硬件线程(虚拟CPU, VCPU),总共有32个VCPU, OCETON公司的MIPS架构的Cavium5860处理器有16个核,每个核包含l个 VCPU。
操作系统在多核处理器硬件平台上一般有两种构架, 一种是SMP (Symm etrical Multi-Processing,对称多处理)方式,另一种为AMP (Asymmetrical Multi-Processing,非对称多处理)方式。SMP架构顾名思义就是将多个内核平 等看待,每个内核运行的操作系统相同,SMP只运行一个操作系统映像,管 理所有VCPU; AMP架构是将多个内核区别看待,AMP的每个VCPU上都运行 一个操作系统映像,按照任务划分,各负其责,在AMP模式下,为了节省内 存资源,会将一些功能相同的VCPU操作系统映像的代码段虚拟地址空间映射 到相同的物理地址空间上,实现多个VCPU共享代码段。
热补丁 (下文统称为补丁)是电信软件的一般要求,用于在系统运行时 动态修改程序,如进行系统测试或修补软件的缺陷,而不影响正常业务的运 行。现有基于单核环境下的补丁技术如下首先将补丁新函数写在一个源文 件中,编译成一个目标文件,通过补丁制作工具,利用被打补丁原函数的可 执行程序文件、历史补丁文件,将目标文件中的符号进行重定位,生成一个
6补丁文件,通过加载工具把这个补丁文件加载到被打补丁原函数(下文简称 为"补丁原函数")运行的系统地址空间中,最后在补丁激活生效时,将补 丁原函数的第一条指令修改为无条件跳转指令,跳转到补丁新函数地址。
在多核AMP共享代码段环境下,如在所有的MIPS CPU中,紧跟在跳转 指令后的指令即使跳转指令执行成功也会执行,这条指令称为跳转延迟槽指 令。在补丁激活时,需要将补丁原函数的第一条指令修改为无条件跳转指令, 跳转到补丁新函数地址,同时需要将被打补丁原函数的第二条指令,也就是 跳转指令的延迟槽指令,修改为空操作指令。即多核AMP共享代码段环境下, 补丁操作需要同时修改两条指令,而在多核AMP共享代码段环境下,对一个 VCPU上的软件打补丁,如果刚刚修改完被打补丁原函数的第一条指令,而这 个VCPU共享代码段的其他VCPU刚好开始执行补丁函数,这时其他VCPU执 行的补丁函数的第一条指令是补丁新函数的,第二条指令却是补丁原函数的, 就会导致软件逻辑混乱,出现错误。
所以,在多核AMP共享代码段环境下,对一个VCPU上的软件打补丁,会 影响和这个VCPU共享代码段的其它VCPU,如何保证共享代码段的一组VCP U的补丁同时生效是多核AMP共享代码段环境下补丁技术需要解决的问题。

发明内容
本发明实施例提供一种多核环境下的补丁方法与装置,以实现多核环境 下补丁激活时,共享代码段的所有VCPU补丁同时生效。
一方面,本发明实施例提供了一种多核环境下的补丁方法,所述方法包 括向共享代码段目标虚拟CPU组中的每个目标虚拟CPU发送核间不可屏蔽中 断,使得所述目标虚拟CPU响应所述核间不可屏蔽中断,并进入补丁同步状 态;监视所述目标虚拟CPU的补丁同步状态,当所有目标虚拟CPU都进入补丁 同步状态后,将所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异 常指令,并向所有目标虚拟CPU输出补丁同步状态结束通知,使得在被打补 丁原函数被执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到补丁新函数。
另一方面,本发明实施例提供了一种多核环境下的补丁方法,所述方法 包括根据接收的核间不可屏蔽中断,关闭共享代码段目标虚拟CPU组中对
应目标虚拟CPU的中断,并输出所述目标虚拟CPU已进入补丁同步状态的通
知;获得补丁同步状态结束通知后,刷新所述目标虚拟CPU的指令缓存使补 丁生效,打开所述目标虚拟CPU组中对应目标虚拟CPU的中断;在被打补丁原 函数被执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到 补丁新函数。
又一方面,本发明实施例提供了一种多核环境下的补丁装置,所述补丁 装置包括不可屏蔽中断发送单元,用于向共享代码段目标虚拟CPU组中的每个 目标虚拟CPU发送核间不可屏蔽中断;补丁同步状态监视单元,用于监视所述 目标虚拟CPU组中每个目标虚拟CPU的补丁同步状态;补丁激活单元,用于当 所有目标虚拟CPU都进入补丁同步状态后,将所述目标虚拟CPU的被打补丁原
函数的第一条指令修改为异常指令;补丁同步结束通知单元,用于当所述补 丁激活单元完成所有被打补丁原函数的指令修改后,向所有目标虚拟CPU输
出补丁同步状态结束通知。
再一方面,本发明实施例提供了一种多核环境下的补丁装置,所述补丁
装置包括不可屏蔽中断响应单元,用于根据接收的核间不可屏蔽中断,关 闭共享代码段目标虚拟CPU组中对应目标虚拟CPU的中断,输出所述目标虚拟 CPU进入补丁同步状态的通知;补丁生效单元,用于获得补丁同步状态结束 通知后,刷新所述目标虚拟CPU的指令缓存使补丁生效,打开所述目标虚拟
CPU组中对应目标虚拟CPU的中断;异常处理单元,用于在被打补丁原函数被
执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到补丁新函数。
可见,本发明实施例的补丁方法与装置中,通过核间不可屏蔽中断的同
步方式实现了共享代码段虚拟CPU的同步,以及在共享代码段的所有目标虚拟CPU都进入补丁同步状态后,将所有目标虚拟CPU的被打补丁原函数的第一
条指令修改为异常指令,并在异常处理过程中将被打补丁原函数跳转到补丁
新函数,从而实现了多核环境下补丁激活时,共享代码段的所有虚拟CPU补
丁同时生效。并且,本发明实施例方案的核间不可屏蔽中断的方式相对于现 有的核间同步消息方式,具有补丁激活时的同步时间开销小,可靠性高的效 果。


图l为本发明实施例的一种多核处理器逻辑示意图2为本发明实施例管理VCPU的补丁装置的原理框图3为本发明实施例目标VCPU的补丁装置的原理框图4为图3的异常处理单元303的细化框图5为本发明实施例的多核环境下的补丁方法流程示意图6为本发明实施例的多核环境下的补丁方法流程示意图7为图6异常处理过程的细化流程示意图8为本发明实施例的多核环境下的补丁方法的一种详细实现流程图; 图9为本发明实施例一种多核环境下的补丁装置进行异常处理的一种详 细实现流程图10为本发明实施例一种多核环境下的补丁装置进行异常处理的另一种 详细实现流程图。
具体实施例方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发 明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述, 显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获 得的所有其他实施例,都属于本发明保护的范围。以下结合附图对本发明具体实施方式
进行详细说明 实施例l:
本发明实施例提供一种多核环境下的补丁装置。其中,本发明实施例的 补丁装置应用于多核AMP系统,图1为本实施例的一种多核AMP系统的逻辑示 意图,如图1所示,从逻辑层来看,最底层为多核处理器硬件平台,包括多个
VCPU,如VCPU0、 VCPU1、 VCPU2和VCPU3;中间层为操作系统层,每个VC PU上运行独立的操作系统RTOS;在操作系统层之上为APP应用层。
本实施例的VCPU根据不同的功能分为管理VCPU和目标VCPU,本实施例 中管理VCPU为VCPUO,共享代码段的其他VCPU(VCPU1、 VCPU2和VCPU3) 为目标VCPU,具有共享代码段的多个VCPU形成目标VCPU组。
管理VCPU关联的补丁装置(简称管理VCPU的补丁装置)对应管理VCPU的 APP层,目标VCPU关联的补丁装置(简称目标VCPU的补丁装置)对应目标VCP U的APP层。管理VCPU的补丁装置通过与目标VCPU的补丁装置进行交互,实现 对目标VCPU的补丁操作,使共享代码段的所有目标VCPU的补丁同步生效。
图2为本发明实施例管理VCPU的补丁装置的原理框图。图2的补丁装置20包

不可屏蔽中断发送单元201 ,用于向共享代码段目标虚拟CPU组中的每个目 标虚拟CPU发送核间不可屏蔽中断;应当理解的是,所述目标虚拟CPU组中的每 个目标虚拟CPU可以响应所述核间不可屏蔽中断,并进入补丁同步状态;
补丁同步状态监视单元202 ,用于监视所述目标虚拟CPU组中每个目标虚 拟CPU的补丁同步状态;
补丁激活单元203,用于当所有目标虚拟CPU都进入补丁同步状态后,将 所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令;
这里的异常指令可以采用Break指令作为使被打补丁原函数陷入异常处理 的指令;在一些特定处理器下,也可以选择一些非法指令(即在特定处理器
10不存在的指令)作为使被打补丁原函数陷入异常处理的指令。
补丁同步结束通知单元204,用于当所述补丁激活单元完成所有被打补丁 原函数的指令修改后,向所有目标虚拟CPU输出补丁同步状态结束通知。
应当理解的是,目标虛拟CPU的补丁装置获知补丁同步状态结束通知后, 会结束补丁同步状态,在被打补丁原函数被执行到异常指令所触发的异常处 理过程中,将被打补丁原函数跳转到补丁新函数。换言之,即,在系统调用 被打补丁原函数陷入异常时,通过异常处理流程实现补丁的完全生效。
可选地,本实施例的补丁装置20进一步包括存储单元205,用于保存目 标虚拟CPU的所有被打补丁原函数的信息;应当理解的是,这里的存储单元 205可以为核间共享内存,多核AMP系统中的所有VCPU均可以访问。
在一种实现下,所述补丁激活单元203具体用于当所有目标虚拟CPU都进 入补丁同步状态后,根据从所述存储单元中获取的所有被打补丁原函数的信 息,将所有被打补丁原函数的第一条指令修改为异常指令。
可选地,所述存储单元205还用于保存有核间同步信息,所述核间同步信 息包括第一共享变量、第二共享变量;
在一种实现下,所述补丁同步状态监视单元202具体用于判断所述第一共 享变量的值是否等于共享代码段目标虚拟VCPU组中的目标VCPU数量,当等 于时,确定所有目标虚拟VCPU都进入补丁同步状态;
所述补丁同步结束通知单元204具体用于当所述补丁激活单元完成所有 被打补丁原函数的指令修改后,将第二共享变量的值置位,以通知所有目标 虚拟CPU结束补丁同步状态。如果第二共享变量的值初始化为O,这里的置位 可以理解为将第二共享变量的值置为l,应当理解的是,本发明实施例包括但 不限于这种实现。
可见,本发明实施例的管理VCPU的补丁装置中,通过核间不可屏蔽中断 的同步方式实现了共享代码段虚拟CPU的同步,以及在共享代码段的所有目 标虚拟CPU都进入补丁同步状态后,将所有目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令,从而便于目标VCPU的补丁装置在异常处理过程
中将被打补丁原函数跳转到补丁新函数,从而实现了多核环境下补丁激活时,
共享代码段的所有虚拟CPU补丁同时生效。并且,本发明实施例方案的核间
不可屏蔽中断的方式相对于现有的核间同步消息方式,具有补丁激活时的同 步时间开销小,可靠性高的效果。
图3为本发明实施例目标VCPU的补丁装置的原理框图。图3的补丁装置30 包括
不可屏蔽中断响应单元301,用于根据接收的核间不可屏蔽中断,关闭共 享代码段目标虚拟CPU组中对应目标虚拟CPU的中断,输出所述目标虚拟CPU 进入补丁同步状态的通知;
应当理解的是,这里进入补丁同步状态即同步进入中断状态。
补丁生效单元302,用于获得补丁同步状态结束通知后,刷新所述目标虚 拟CPU的指令缓存使补丁生效,打开所述目标虚拟CPU组中对应目标虚拟CPU 的中断,从而结束补丁同步状态;
异常处理单元303,用于在被打补丁原函数被执行到异常指令所触发的异 常处理过程中,将被打补丁原函数跳转到补丁新函数。
这里的被打补丁原函数被执行到异常指令所触发的异常处理过程,可以 理解为在系统调用被打补丁原函数陷入异常。
可选地,本实施例的补丁装置30还包括存储单元304,用于保存有核间 同步信息,所述核间同步信息包括第一共享变量、第二共享变量;应当理解 的是,这里的存储单元304可以为核间共享内存,多核AMP系统中的所有VCPU 均可以访问。
在一种实现下,所述不可屏蔽中断响应单元301具体用于根据接收的核间 不可屏蔽中断,关闭共享代码段目标虚拟CPU组中对应目标虚拟CPU的中断, 并将该第一共享变量的值进行加一处理,以表示所述目标虚拟CPU进入补丁 同步状态。应当理解的是,这里的加一处理,仅是一种实现,本发明实施例包括但不限于此。其中,如果每个目标虚拟CPU都将该第一共享变量的值进
行加一处理,则管理虚拟CPU可以通过判断所述第一共享变量的值是否等于 共享代码段目标虚拟VCPU组中的目标VCPU数量来确定所有目标虚拟VCPU
是否都进入补丁同步状态。
在一种实现下,所述补丁生效单元302具体用于当检测到第二共享变量的 值为一时,刷新所述目标虚拟CPU的指令缓存使补丁生效,打开所述目标虚 拟CPU组中对应目标虚拟CPU的中断,从而结束补丁同步状态。
图4为图3的异常处理单元303的一种细化框图。本实施例的异常处理单元 303包括
调度判断单元401 ,用于判断所述共享代码段目标虚拟CPU组中的所有目 标虚拟CPU的所有线程是否被调度了至少一次;
补丁新函数生效单元402,用于在所有线程被调度了至少一次,将补丁原 函数的第二条指令修改为空操作指令,将补丁原函数的第一条指令修改为无 条件跳转到补丁新函数的指令,将异常处理的返回地址修改为补丁新函数的 地址;或者,用于在所有线程未被调度至少一次,将异常处理的返回地址修 改为补丁新函数的地址。
在一种实现下,调度判断单元401为第一调度判断单元,用于判断所述补 丁生效后是否经过了一预定时长;如果是,则确定所述共享代码段目标虚拟 CPU组中的所有目标虚拟CPU的所有线程被调度了至少一次,如果否,则确定所 述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程未被调度至少 一次。这里的预定时长可以是稍大于系统任务饿死时长。
在另一种实现下,调度判断单元401为第二调度判断单元,用于判断所述 共享代码段目标虚拟CPU组中的所有目标虚拟CPU中最低优先级的线程是否已 经被调度;如果是,则确定所述共享代码段目标虚拟CPU组中的所有目标虚 拟CPU的所有线程被调度了至少一次;如果否,则确定所述共享代码段目标虚拟 CPU组中的所有目标虚拟CPU的所有线程未被调度至少一次。可见,本发明实施例的目标VCPU的补丁装置中,通过核间不可屏蔽中断 的同步方式实现了共享代码段虚拟CPU的同步,以及在异常处理过程中将被
打补丁原函数跳转到补丁新函数,从而实现了多核环境下补丁激活时,共享
代码段的所有目标虚拟CPU补丁同时生效。并且,本发明实施例方案的核间
不可屏蔽中断的方式相对于现有的核间同步消息方式,具有补丁激活时的同 步时间开销小,可靠性高的效果。
进一步的,具体异常处理过程中,通过超时机制来判断补丁完全生效的 时机,或者,通过基于优先级来判断补丁完全生效的时机,使得共享代码段
的所有目标虚拟CPU补丁同时生效后,再次调用被打补丁原函数,不会陷入
异常,而是直接跳转到补丁新函数地址开始执行。本实施例的补丁装置在等 待所有的线程都被调度了一次之后,再将被打补丁函数的指令进行修改,使
被打补丁原函数跳转到补丁新函数,这种方式使得当目标VCPU不会出现某一
任务执行到被打补丁原函数的第一条指令和第二条指令之间时被其他任务切
换出去的情况,从而解决了MIPS处理器下跳转指令延迟槽对补丁激活的影响, 本实施例的补丁装置可以支持产品在测试、上网运行时BUG修复等补丁需求, 提升了产品的可服务性。
实施例2:
本实施例提供一种多核环境下的补丁方法,该多核环境的架构可以参见 图l,本实施例的补丁方法包括应用于管理VCPU的补丁装置的补丁方法以及 应用于目标VCPU的补丁装置的补丁方法。本实施例的方法通过核间同步机 制,实现了对目标VCPU的补丁同步激活,并在异常处理中实现目标VCPU的补 丁生效。
图5为本发明实施例的多核环境下的补丁方法流程示意图,需要说明的 是,本实施例的补丁方法可以应用于管理VCPU的补丁装置,如图5所示 步骤S501 、向共享代码段目标虚拟CPU组中的每个目标虚拟CPU发送核间拟CPU响应所述核间不可屏蔽中断,并进入
补丁同步状态;需要说明的是,这里的核间不可屏蔽中断是一种指令,而非 消息。
步骤S502、监视所述目标虚拟CPU的补丁同步状态,当所有目标虚拟CPU 都进入补丁同步状态后,将所述目标虚拟CPU的被打补丁原函数的第一条指 令修改为异常指令,并向所有目标虚拟CPU输出补丁同步状态结束通知,使 得在被打补丁原函数被执行到异常指令所触发的异常处理过程中,将被打补 丁原函数跳转到补丁新函数。
这里的异常指令可以采用Break指令作为使被打补丁原函数陷入异常处理 的指令;在一些特定处理器下,也可以选择一些非法指令(即在特定处理器 不存在的指令)作为使被打补丁原函数陷入异常处理的指令。
可选地,该方法还包括获取所述目标虚拟CPU的被打补丁原函数的信 息,并将所述被打补丁原函数的信息保存于共享内存中,针对共享内存而言, 多核AMP系统中的所有VCPU均可以访问。
在一种实现下,步骤S502中所述将所述目标虚拟CPU的被打补丁原函数 的第一条指令修改为异常指令具体包括根据从所述共享内存中获取的所述 目标虚拟CPU的被打补丁原函数的信息,将所述目标虚拟CPU的被打补丁原函 数的第一条指令修改为异常指令。
可选地,所述共享内存还保存有核间同步信息,所述核间同步信息包括 第一共享变量、第二共享变量;
在一种实现下,步骤S502中所述监视所述目标虚拟VCPU的补丁同步状态 具体包括判断所述第一共享变量的值是否等于共享代码段目标虚拟VCPU组 中的目标VCPU数量,当等于时,确定所有目标虚拟VCPU都进入补丁同步状 态;反之,确定所有目标虚拟VCPU未都进入补丁同步状态。
以及,在一种实现下,步骤S502中所述向所有目标虚拟CPU输出补丁同 步状态结束通知包括将第二共享变量的值置位,以通知所有目标虚拟CPU结束补丁同步状态。如果第二共享变量的值初始化为O,这里的置位可以理解 为将第二共享变量的值置为l,应当理解的是,本发明实施例包括但不限于这 种实现。
可见,本发明实施例的补丁方法中,通过核间不可屏蔽中断的同步方式
实现了共享代码段虚拟CPU的同步,以及在共享代码段的所有目标虚拟CPU 都进入补丁同步状态后,将所有目标虚拟CPU的被打补丁原函数的第一条指 令修改为异常指令,从而便于目标VCPU的补丁装置在异常处理过程中将被打
补丁原函数跳转到补丁新函数,从而实现了多核环境下补丁激活时,共享代
码段的所有虚拟CPU补丁同时生效。并且,本发明实施例方案的核间不可屏
蔽中断的方式相对于现有的核间同步消息方式,具有补丁激活时的同步时间 开销小,可靠性高的效果。
图6为本发明实施例的另一种多核环境下的补丁方法流程示意图,需要说 明的是,本实施例的补丁方法可以应用于目标VCPU的补丁装置,如图6所示, 该方法包括
步骤S601、根据接收的核间不可屏蔽中断,关闭共享代码段目标虚拟CPU 组中对应目标虚拟CPU的中断,并输出所述目标虚拟CPU己进入补丁同步状态 的通知;
应当理解的是,这里进入补丁同步状态即同步进入中断状态。
步骤S602、获得补丁同步状态结束通知后,刷新所述目标虚拟CPU的指 令缓存使补丁生效,打开所述目标虚拟CPU组中对应目标虚拟CPU的中断,从 而结束补丁同步状态;
步骤S603、在被打补丁原函数被执行到异常指令所触发的异常处理过程 中,将被打补丁原函数跳转到补丁新函数。
这里的被打补丁原函数被执行到异常指令所触发的异常处理过程,可以 理解为在系统调用被打补丁原函数陷入异常。
在一种实现下,步骤S603中在异常处理过程中将被打补丁原函数跳转到补丁新函数,包括-
判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程 是否被调度了至少一次;如果所有线程被调度了至少一次,则将被打补丁原 函数的第二条指令修改为空操作指令,将被打补丁原函数的第一条指令修改 为无条件跳转到补丁新函数的指令,将异常处理的返回地址修改为补丁新函 数的地址;反之,将异常处理的返回地址修改为补丁新函数的地址。
其中,判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有 线程是否被调度了至少一次,在一种实现下,包括-
判断所述补丁生效后是否经过了一预定时长;如果是,则确定所述共享 代码段目标虚拟CPU组中的所有虚拟CPU的所有线程被调度了至少一次,反 之,则确定所述共享代码段目标虚拟CPU组中的所有虚拟CPU的所有线程未被 调度至少一次。
其中,判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有 线程是否被调度了至少一次,在另一种实现下,可以包括-
判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU中最低优先 级的线程是否已经被调度;如果是,则确定所述共享代码段目标虚拟CPU组 中的所有虚拟目标CPU的所有线程被调度了至少一次;反之,则确定所述共享 代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程未被调度至少一次。
可选地,申请共享内存来保存有核间同步信息,所述核间同步信息包括 第一共享变量、第二共享变量;
步骤S601中所述输出所述目标虚拟CPU已进入补丁同步状态的通知包 括将第一共享变量的值进行加一处理;以表示所述目标虚拟CPU进入补丁 同步状态。应当理解的是,这里的加一处理,仅是一种实现,本发明实施例 包括但不限于此。
步骤S602中所述获得补丁同步状态结束通知包括当检测到第二共享变 量的值为一时,确定补丁同步状态结束。可见,本发明实施例的补丁方法中,通过核间不可屏蔽中断的同步方式 实现了共享代码段虚拟CPU的同步,以及在异常处理过程中将被打补丁原函 数跳转到补丁新函数,从而实现了多核环境下补丁激活时,共享代码段的所
有目标虚拟CPU补丁同时生效。并且,本发明实施例方案的核间不可屏蔽中
断的方式相对于现有的核间同步消息方式,具有补丁激活时的同步时间开销 小,可靠性高的效果。
进一步的,具体异常处理过程中,通过超时机制来判断补丁完全生效的 时机,或者,通过基于优先级来判断补丁完全生效的时机,使得共享代码段
的所有目标虚拟CPU补丁同时生效后,再次调用被打补丁原函数,不会陷入
异常,而是直接跳转到补丁新函数地址开始执行。本实施例的补丁装置在等 待所有的线程都被调度了一次之后,再将被打补丁函数的指令进行修改,使
被打补丁原函数跳转到补丁新函数,这种方式使得当目标VCPU不会出现某一
任务执行到被打补丁原函数的第一条指令和第二条指令之间时被其他任务切
换出去的情况,从而解决了MIPS处理器下跳转指令延迟槽对补丁激活的影响, 本实施例的补丁装置可以支持产品在测试、上网运行时BUG修复等补丁需求, 提升了产品的可服务性。
图7为图6异常处理过程的细化流程图,本实施例通过以下步骤实现异常 处理。如图7所示,包括
步骤S701、当被打补丁原函数被执行时,执行Break指令触发异常,进入 异常处理过程;
步骤S702、判断目标VCPU组中的所有目标VCPU内的所有线程是否被调 度了至少一次。
因为被打补丁原函数的第一条指令己经被修改成了Break指令,当线程被 调度时,如果执行到被打补丁原函数,则在第一条指令处就进入异常处理, 在异常处理返回时返回到了补丁新函数地址(参见步骤S704),所以被调度 的线程不会停在被打补丁原函数的第二条指令处的,当所有线程都被调度了一次后,说明所有线程没有停留在被打补丁原函数的第二条指令处; 步骤S702的该判断方法可以包括
(1) 超时判断判断目标VCPU在补丁激活后是否经过了一预定时长,如
果是,则确定目标VCPU组中的所有VCPU的所有线程被调度了至少一次;
(2) 最低优先级判断判断目标VCPU组中的所有VCPU中最低优先级的 线程是否被调度;如果是,则确定目标VCPU组中的所有VCPU的所有线程被 调度了至少一次。
步骤S703、如果所有线程都被调度了至少一次,在异常处理过程中将被 打补丁原函数的第二条指令修改为空操作指令,将被打补丁原函数的第一条 指令修改为无条件跳转到补丁新函数的指令,并进入步骤S704;否则,直接 进入步骤S704;
步骤S704、将异常处理的返回地址修改为补丁新函数的地址。
可见,本发明实施例的补丁方法通过核间消息机制保证所有VCPU的补丁 同时生效;利用异常处理机制,解决了MIPS环境下的指令延迟槽引起的问题; 在打补丁时,被打补丁VCPU不需要同步等待,不中断业务运行。
图8为本发明实施例的多核环境下的补丁方法的一种详细实现流程图,本 实施例的管理VCPU为VCPUO。如图8所示
步骤S800、系统初始化。
VCPUO的补丁装置申请一段核间共享内存保存核间同步信息MCPAT一S
YN一INFO,用于在VCPUO和目标VCPU组之间进行同步。为了共享补丁激活
的信息,本发明实施例定义数据结构MCPAT1SYN—INFO来保存核间同步信
息,VCPUO的补丁装置和目标VCPU组内的目标VCPU的补丁装置都能够查看
该数据结构中共享变量的值,该数据结构可以进行如下定义 typedef struct tagMCPatSynlnfo
volatile VOSJJINT32 ulStartSynAckFlag; 〃共享变量A,表示进入补丁同步状态的VCPU的数目;
volatile VOSJJINT32 u正ndSynFlag; 〃共享变量B,如果置位则表示VC
PUO的补丁装置完成了补丁激 活,此时目标VCPU的补丁装置 可以结束目标VCPU的补丁同步 状态;
}MCPAT_SYN—INFO;
步骤S801 、 VCPUO的补丁装置开始激活目标VCPU的补丁装置。 为了保证激活操作不被重入(被打断),首先关闭VCPUO的中断,不再
响应中断。
步骤S802、 VCPUO的补丁装置申请一段共享内存,将被打补丁原函数的 信息存放到该共享内存中,使目标VCPU的补丁装置能够和VCPUO的补丁装置
一起配合完成补丁同步操作。具体包括以下步骤
(1) 、 VCPUO的补丁装置获取目标VCPU的补丁装置中保存的所有被打补 丁原函数的地址;
(2) 、 VCPUO的补丁装置申请一段共享内存;
(3) 、VCPU0的补丁装置将所有被打补丁原函数的信息保存在共享内存中, 本发明实施例中被打补丁原函数的信息采用数据结构MCPAT一FUNC—NODE 来表示,包括函数地址、被打补丁原函数的第一/二条指令值、目标VCPU 数目、当前系统TICK值、VCPU状态标识初始化。该数据结构可以定义如下
typedef struct tagMCPatFuncNode
VOS一UINT32 aulFuncPtr[N]; 〃补丁原函数地址,N表示一个补丁单元中
最大的补丁函数数目;
VOSJJINT32 aulFuncInsl[N]; 〃补丁原函数第一条指令,N表示一个补
丁单元中最大的补丁函数数目;
20VOS—UINT32 aulFuncIns2[N]; 〃补丁原函数第二条指令,N表示一个补
丁单元中最大的补丁函数数目;
VOS一UINT32 ulFlag; 〃补丁函数状态标识为0时表示可以将补丁原函
数的第一条指令修改为无条件跳转指令(跳转 至补丁新函数),将第二条指令修改为填充跳 转指令延迟槽的NOP指令; VOS—UINT32 ulStartTick; 〃补丁函数激活时的系统TICK值; VOS—UINT8 aucVCPUFlag[N]; //VCPU状态标识N表示系统的VCPU
数目,每个字节表示一个VCPU,为l表示 对应VCPU已经满足补丁完全生效的条件;
}MCPAT—FUNC—NODE;
(4)、 VCPUO的补丁装置将共享内存的地址保存在目标VCPU组的共享指 针变量gjstShareFuncNode[Index]中,Index表示目标VCPU组ID;
步骤S803、 VCPUO的补丁装置将核间同步信息数据结构MCPAT一SYN一I NFO中的域ulStartSynAckFlag、 ulEndSynFlag分别置为O,准备进行补丁同步;
步骤S804、 VCPUO的补丁装置给所有目标VCPU的补丁装置发送一个不 可屏蔽中断,以开始进行核间补丁同步;
步骤S805、目标VCPU的补丁装置响应VCPUO的补丁装置发送的核间不 可屏蔽中断,进入中断处理流程,关闭目标VCPU的中断,使目标VCPU进入 核间补丁同步状态;
步骤S806、目标VCPU的补丁装置将核间同步信息数据结构MCPAT—SYN —INFO中的域ulStartSynAckFlag原子加l,以标识自己己经进入同步状态;
步骤S807、 VCPUO的补丁装置循环检测核间同步信息数据结构MCPAT一 SYN—INFO中的域ulStartSynAckFlag的值是否等于目标VCPU数目,如果等于 目标VCPU数目则表示所有目标VCPU都已经进入补丁同步状态;
步骤S808、 VCPUO的补丁装置将所有被打补丁原函数的第一条指令修改为异常指令(如Break断点指令),以完成补丁激活,使得在被打补丁原函数 被执行到异常指令所触发的异常处理流程中实现将被打补丁原函数跳转为补 丁新函数;
步骤S809、 VCPUO的补丁装置将核间同步信息数据结构MCPAT—SYN—I NFO中的域ulEndSynFlag置为1 ,以通知所有目标VCPU结束补丁同步操作;
步骤S810、 VCPUO的补丁装置打开中断,返回到调用补丁激活接口的指 令后,以结束补丁激活操作;
步骤S811 、目标VCPU的补丁装置死循环判断核间同步信息数据结构MC PAT_SYN—INFO中的域ulEndSynFlag是否等于l ,如果等于l则结束补丁同步;
步骤S812、目标VCPU的补丁装置刷新本地指令Cache,进行补丁生效操
作;
步骤S813、目标VCPU的补丁装置打开目标VCPU的中断,中断处理返回 至被中断打断的指令处,从而结束补丁同步。现在所有目标VCPU的补丁同时 生效。
可见,本发明实施例的补丁方法,设置共享内存保存核间同步信息以及 补丁原函数的信息,通过核间不可屏蔽中断实现了管理VCPU和目标VCPU之 间的补丁同步激活操作。
图9为本发明实施例多核环境下的目标VCPU的补丁装置进行异常处理的 一种详细实现流程图,如图9所示
步骤S901、当目标VCPU在执行至被打补丁原函数时,会陷入Break指令 触发异常,进入异常处理流程
步骤S卯2、判断发生异常的指令地址是否为被打补丁原函数地址以及发 生异常的指令是否是Break指令;如果发生异常的指令地址为被打补丁原函数 地址并且发生异常的指令为Break指令,则继续进入步骤S903进行判断,否则 进入步骤S904启动常规的异常处理流程;
判断发生异常的指令地址是否为补丁函数地址,包括判断发生异常的指令地址是否在共享变量gjstShareFuncNode[index] (Index表示当前VCPU的 组ID,以下同)指向的补丁信息结构中;
步骤S903、判断当前VCPU中被打补丁函数从激活到现在是否已经超时 如果己经超时,则继续进行补丁异常处理,将当前VCPU标记为已经进入 过超时处理,具体包括判断gjstShareFuncNode[index]中的域aucVCPUFlag 中以当前VCPU为下标的数组元素的值是否等于O,是则置为l,表示该VCPU 已经进入过超时处理,同时,将域ulFlag (ulFlag的初始值置为目标VCPU组中 的VCPU数目)原子减l,表示又有一个VCPU已经超时; 如果未超时,进入步骤S908;
应当理解的是为了确保在修改被打补丁原函数的第二条指令时,所有 的目标VCPU上的所有线程的PC (指令寄存器)没有停在被打补丁原函数的第 二条指令处,本实施例的方法假设系统在过了一段预设的时间后,所有的线 程都己经被操作系统调度了至少一次,且所有的线程的PC (指令寄存器)没 有停在补丁原函数的第二条指令处;
步骤S905、判断是否目标VCPU组内的其他VCPU都已经超时,具体包括 判断gjstShareFuncNode[index]中的域ulFlag的值是否等于O;是则进入步骤S9 06对被打补丁原函数进行修改,否则进入步骤S908;
步骤S906、获取gjstShareFuncNode[index]中保存的补丁信息,将补丁原 函数的第二条指令修改为空操作指令NOP;
步骤S907、将被打补丁原函数的第一条指令修改为无条件跳转指令(跳 到补丁新函数地址),将gjpstShareFuncNode[index]所指向的保存补丁函数信 息的共享内存释放;
步骤S卯8、使补丁新函数生效将异常处理的返回地址修改为补丁新函 数的地址,打开中断,以完成异常处理流程。
可见,本发明实施例的方法通过设置一个预定的时间来判断所有的线程 是否已经被操作系统调度了至少一次,并根据不同的情况进行不同的异常处理。采用本实施例的异常处理机制,补丁会在设定的时长后完全生效,再次
调用被打补丁函数,不会陷入Break异常,而是直接跳转到补丁新函数地址开 始执行。
图10为发明实施例多核环境下的目标VCPU的补丁装置进行异常处理的 另一种详细实现流程图,如图10所示
和图9不同的是,图9的步骤S903和步骤S905通过超时机制来判断补丁完 全生效的时机。图10的方法就是针对这种场景,利用嵌入式操作系统基于优 先级的调度策略,如果最低优先级的线程己经被调度,说明VCPU上的所有线 程己经被操作系统调度了一次。以下仅对和图9的区别部分进行描述
步骤S1003、针对当前的目标VCPU,判断自补丁激活完成后,优先级最 低的线程是否已经被调度是则继续进行补丁异常处理,并将当前VCPU标记 为优先级最低的线程已经被调度,具体包括判断gjstShareFuncNode[index] 中的域aucVCPUFlag中以当前VCPU为下标的数组元素的值是否等于O,是则 置为l,表示该VCPU最低优先级的线程已经被调度,同时将域ulFlag原子减l, 表示又有一个VCPU最低优先级的线程已经被调度;
否则进入步骤S卯8;
步骤S1005、判断目标VCPU组内的其他目标VCPU的优先级最低的线程 是否己经被调度,具体包括判断gjstShareFuncNode[index]中的域ulFlag的 值是否等于0;是则进入步骤S906对补丁原函数进行修改,否则进入步骤S卯8;
可见,本发明实施例的方法根据最低优先级的线程是否被调用而采用相 应的异常处理。采用本实施例的异常处理机制能够使补丁自动生效,再次调 用被打补丁函数,不会陷入Break异常,而是直接跳转到补丁新函数地址开始 执行。
综上所述,本发明实施例的补丁方法通过核间不可屏蔽中断的同步方式 解决了多核AMP共享代码段环境下的补丁同步问题,通过异常处理机制解决 了MIPS处理器下跳转指令延迟槽对补丁激活的影响,该方案使补丁激活时的同步时间开销小,可靠性高,解决了MIPS处理器下跳转指令延迟槽对补丁激
活的影响,可以支持产品在测试、上网运行时BUG修复等补丁需求,提升了产品的可服务性。
需要说明的是
1、 本发明实施例解决了多核共享代码段补丁的激活问题,同样适用去激
活流程。区别在于在步骤S703,将补丁原函数的第二条指令还原,将补丁原函数的第一条指令还原;在步骤S卯6,将补丁原函数的第二条指令还原;在步骤S907,将补丁原函数的第一条指令还原。
2、 本发明实施例采用不可屏蔽中断实现多核补丁的核间同步,在嵌入式
多核AMP应用中,还可以采用下面的方案核间中断(IPI)在有些厂商的多
核处理器中都支持,通过在系统中为多核补丁的核间同步保留一个核间中断
号,系统的关中断接口不关闭这个中断,实现不可屏蔽中断的功能,在一些没有不可屏蔽中断特性的处理器上可以应用。
3、 本发明实施例采用Break指令作为使补丁原函数陷入异常处理的指令,在一些特定处理器下,也可以选择一些非法指令(在特定处理器不存在的指令)作为使补丁原函数陷入异常处理的指令,然后在系统调用补丁原函数陷入异常时,通过相同的异常处理流程,实现补丁的完全生效。
4、 本发明实施例通过核间不可屏蔽中断方式实现多核补丁同步的方案,可以在任何多核AMP模式的系统中应用,还可以用于其他非补丁功能的核间同步需求。
5、 本发明实施例中通过异常处理机制解决MIPS处理器延迟槽对补丁激活的影响的方案,可以解决单核多任务环境下的MIPS处理器延迟槽对补丁激活的影响的问题;也可以解决其他存在跳转指令延迟槽的处理器环境下补丁激活的问题;还可以用于解决PowerPC等环境下补丁长跳转的问题(需要通过两条指令跳转到更大的地址空间中,和延迟槽的影响类似)。
6、 前面实施例描述的多核环境下的补丁装置,也可以理解为集成有补丁功能的VCPU。
本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤,而前述
的存储介质包括ROM、 RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是以上实施例仅用以说明本发明实施例的技术方案,而非对其限制;尽管参照前述实施例对本发明实施例进行了详细的说明,本领
域的普通技术人员应当理解其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例各实施例技术方案的精神和范围。
2权利要求
1、一种多核环境下的补丁方法,其特征在于,所述方法包括向共享代码段目标虚拟CPU组中的每个目标虚拟CPU发送核间不可屏蔽中断,使得所述目标虚拟CPU响应所述核间不可屏蔽中断,并进入补丁同步状态;监视所述目标虚拟CPU的补丁同步状态,当所有目标虚拟CPU都进入补丁同步状态后,将所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令,并向所有目标虚拟CPU输出补丁同步状态结束通知,使得在被打补丁原函数被执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到补丁新函数。
2、 根据权利要求l所述的方法,其特征在于,所述方法还包括-获取所述目标虚拟CPU的被打补丁原函数的信息,并将所述被打补丁原函数的信息保存于共享内存中;所述将所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令包括-根据从所述共享内存中获取的所述目标虚拟CPU的被打补丁原函数的信 息,将所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令。
3、 一种多核环境下的补丁方法,其特征在于,所述方法包括 根据接收的核间不可屏蔽中断,关闭共享代码段目标虚拟CPU组中对应目标虚拟CPU的中断,并输出所述目标虚拟CPU已进入补丁同步状态的通知; 获得补丁同步状态结束通知后,刷新所述目标虚拟CPU的指令缓存使补丁生效,打开所述目标虚拟CPU组中对应目标虚拟CPU的中断;在被打补丁原函数被执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到补丁新函数。
4、 根据权利要求3所述的方法,其特征在于,所述在异常处理过程中将 被打补丁原函数跳转到补丁新函数,包括判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程 是否被调度了至少一次;如果所有线程被调度了至少一次,则将被打补丁原函数的第二条指令修 改为空操作指令,将被打补丁原函数的第一条指令修改为无条件跳转到补丁 新函数的指令,将异常处理的返回地址修改为补丁新函数的地址;否则,将 异常处理的返回地址修改为补丁新函数的地址。
5、 根据权利要求4所述的方法,其特征在于,判断所述共享代码段目标 虚拟CPU组中的所有目标虚拟CPU的所有线程是否被调度了至少一次包括判断所述补丁生效后是否经过了一预定时长;如果是,则确定所述共享 代码段目标虚拟CPU组中的所有虚拟CPU的所有线程被调度了至少一次。
6、 根据权利要求4所述的方法,其特征在于,判断所述共享代码段目标 虚拟CPU组中的所有目标虚拟CPU的所有线程是否被调度了至少一次包括判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU中最低优先 级的线程是否已经被调度;如果是,则确定所述共享代码段目标虚拟CPU组 中的所有虚拟目标CPU的所有线程被调度了至少一次。
7、 一种多核环境下的补丁装置,其特征在于,所述补丁装置包括 不可屏蔽中断发送单元,用于向共享代码段目标虚拟CPU组中的每个目标虚拟CPU发送核间不可屏蔽中断;补丁同步状态监视单元,用于监视所述目标虚拟CPU组中每个目标虚拟 CPU的补丁同步状态;补丁激活单元,用于当所有目标虚拟CPU都进入补丁同步状态后,将所 述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令;补丁同步结束通知单元,用于当所述补丁激活单元完成所有被打补丁原函数的指令修改后,向所有目标虚拟CPU输出补丁同步状态结束通知。
8、 根据权利要求7所述的装置,其特征在于,所述补丁装置进一步包括 存储单元,用于保存目标虚拟CPU的所有被打补丁原函数的信息;所述补丁激活单元具体用于当所有目标虚拟CPU都进入补丁同步状态后,根据从所述存储单元中获取的所有被打补丁原函数的信息,将所有被打 补丁原函数的第一条指令修改为异常指令。
9、 一种多核环境下的补丁装置,其特征在于,所述补丁装置包括 不可屏蔽中断响应单元,用于根据接收的核间不可屏蔽中断,关闭共享代码段目标虚拟CPU组中对应目标虚拟CPU的中断,输出所述目标虚拟CPU 进入补丁同步状态的通知;补丁生效单元,用于获得补丁同步状态结束通知后,刷新所述目标虚拟 CPU的指令缓存使补丁生效,打开所述目标虚拟CPU组中对应目标虚拟CPU 的中断;异常处理单元,用于在被打补丁原函数被执行到异常指令所触发的异常 处理过程中,将被打补丁原函数跳转到补丁新函数。
10、 根据权利要求9所述的装置,其特征在于,所述异常处理单元包括 调度判断单元,用于判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程是否被调度了至少一次;补丁新函数生效单元,用于在所有线程被调度了至少一次,将被打补丁原 函数的第二条指令修改为空操作指令,将被打补丁原函数的第一条指令修改 为无条件跳转到补丁新函数的指令,将异常处理的返回地址修改为补丁新函 数的地址;或者,用于在所有线程未被调度至少一次,将异常处理的返回地 址修改为补丁新函数的地址。
11、 根据权利要求10所述的装置,其特征在于,所述调度判断单元为第一调度判断单元,用于判断所述补丁生效后是否 经过了一预定时长;如果是,则确定所述共享代码段目标虚拟CPU组中的所有 目标虚拟CPU的所有线程被调度了至少一次。
12、 根据权利要求10所述的装置,其特征在于,所述调度判断单元为第二调度判断单元,用于判断所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU中最低优先级的线程是否已经被调度;如果是, 则确定所述共享代码段目标虚拟CPU组中的所有目标虚拟CPU的所有线程被调 度了至少一次。
全文摘要
本发明实施例提供一种多核环境下的补丁方法与装置,所述方法包括向共享代码段目标虚拟CPU组中的每个目标虚拟CPU发送核间不可屏蔽中断,使得所述目标虚拟CPU响应所述核间不可屏蔽中断,并进入补丁同步状态;监视所述目标虚拟CPU的补丁同步状态,当所有目标虚拟CPU都进入补丁同步状态后,将所述目标虚拟CPU的被打补丁原函数的第一条指令修改为异常指令,并向所有目标虚拟CPU输出补丁同步状态结束通知,使得在被打补丁原函数被执行到异常指令所触发的异常处理过程中,将被打补丁原函数跳转到补丁新函数。本发明实施例的方法与装置采用核间不可屏蔽中断的同步方式实现共享代码段的目标虚拟CPU的补丁同步激活,在异常处理过程中实现补丁的完全生效。
文档编号G06F9/445GK101561764SQ20091014536
公开日2009年10月21日 申请日期2009年5月18日 优先权日2009年5月18日
发明者鹏 叶, 殷罗英 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1