附件下载
热补丁技术介绍.pdf(159.36 KB)
热补丁是一种快速、低成本修复产品软件版本缺陷的方式。和升级软件版本相比,热补丁的主要优势是不会使设备当前正在运行的业务中断,即在不重启设备的情况下,可以对设备当前软件版本的缺陷进行修复。
补丁的最小单元是函数,可以在系统运行时将某个函数替换为另一个函数。其过程如下:

图1 热补丁原理图 打补丁前
如图1所示,original function 为原函数;instruction 1、instruction 2等为组成原函数的指令。在系统中original function被caller调用。对Original Function打上热补丁的过程就是将Original Function中的Instruction 1(即第一条指令)替换掉的过程,如图2所示。

图2 补丁原理图 打补丁后
图2中的Patch Function为补丁函数。Original Function中的Instruction 1被替换成一条Jump指令,这条指令无条件跳转到Patch Function的起始地址,如图2中Jump箭头所示。打补丁后的实际效果相当于Caller直接调用了Patch Function,而不再执行Original Function函数,如图3所示。

图3 补丁原理图 打补丁后实际效果
& 说明:
上文中Jump指令是对无条件跳转指令的统称,在某些平台上无条件跳转指令被称为Branch。
打补丁的最小单元是函数,通常来说修复某个缺陷都会需要更换多个函数。把多个补丁函数组织起来,作为一个整体来发布,这个补丁函数的集合我们就称为补丁(Patch),或者补丁单元(Patch Unit)。
一个补丁中的所有补丁函数被当作一个整体来管理,各种操作均以补丁为单位,而无法对单个补丁函数来进行操作。
补丁均以补丁文件的形式发布,补丁文件是由一个或多个补丁单元构成的,每个补丁单元都有补丁单元号,用户使用补丁单元号来操作各补丁。补丁单元号从1开始。如某补丁文件中有3个补丁单元,那合法的补丁单元号为1、2和3。
补丁文件中的补丁需要装入内存才能真正起作用。内存补丁区是系统在内存中开辟的一块空间,用于存储新的代码或数据。用户通过补丁加载操作来将补丁文件中的补丁加载到内存补丁区中。
补丁文件中的补丁均为增量补丁。所谓增量补丁,是指各补丁单元对于在其前面的补丁单元有依赖性。也就是说,如果有3个补丁单元,3号补丁必须在1号和2号补丁生效之后才能激活,而不能直接单独激活3号补丁。
补丁分为正式补丁和临时补丁两种:
l 正式补丁(Common patches)是通过版本发布流程发布的补丁。
l 临时补丁(Temporary patches)是未通过版本发布流程发布,用于临时解决紧急问题和需求的补丁。
正式补丁总会包含前面临时补丁的功能,从而替代前面的临时补丁。补丁的类型只对补丁加载(Load)过程产生影响——系统在加载正式补丁之前会先将系统中所有临时补丁删除。
每个补丁都有自身的状态,只有在用户命令行的干预下才能发生切换。补丁状态的切换与命令动作对应关系如图4所示。

& 说明:
补丁文件的状态信息内容保存在Flash中的patchstate文件里,建议用户不要对该文件进行操作。
表示该补丁尚未被加载,无法被激活、去激活或者运行,如图5所示(假设系统补丁区中最多可以加载8个补丁)。
系统重启后,所有处于IDLE状态的补丁仍为IDLE状态。

& 说明:
当前系统补丁区中支持的最大补丁数为200个。
表示补丁已经被加载到内存补丁区,但补丁中的函数尚未替换系统中原有函数运行。假设用户将加载的补丁文件包含7个补丁,则这7个补丁将在经过一定的版本校验及CRC校验之后被加载到内存补丁区,加载成功的补丁处于DEACTIVE状态,此时系统中补丁状态如图6所示。
系统重启后,所有处于DEACTIVE状态的补丁仍为DEACTIVE状态。

激活补丁是指将补丁中的所有函数替换系统中原有同名函数并运行,激活后补丁的状态转为ACTIVE状态。对于图6中7个处于DEACTIVE态的补丁,用户如果激活前5个补丁后,前5个补丁的状态将由DEACTIVE态变成ACTIVE态,此时系统中补丁状态如图7所示。
系统重启后,所有处于ACTIVE态的补丁将变成DEACTIVE态。

用户对ACTIVE状态的补丁执行确认运行操作后,补丁的状态将变为RUNNING。
对于图7中5个处于ACTIVE状态的补丁,用户确认运行前3个补丁后,前3个补丁的状态将由ACTIVE状态变成RUNNING状态,此时系统中补丁状态如图8所示。
系统重启后,所有处于RUNNING状态的补丁将保持为RUNNING状态。

热补丁技术介绍.pdf(159.36 KB)