CN101334734A - 电信卡动态下载补丁程序方案 - Google Patents

电信卡动态下载补丁程序方案 Download PDF

Info

Publication number
CN101334734A
CN101334734A CNA200710117995XA CN200710117995A CN101334734A CN 101334734 A CN101334734 A CN 101334734A CN A200710117995X A CNA200710117995X A CN A200710117995XA CN 200710117995 A CN200710117995 A CN 200710117995A CN 101334734 A CN101334734 A CN 101334734A
Authority
CN
China
Prior art keywords
patch
address
function
bank
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA200710117995XA
Other languages
English (en)
Other versions
CN101334734B (zh
Inventor
谢敏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing CEC Huada Electronic Design Co Ltd
Original Assignee
Beijing CEC Huada Electronic Design Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing CEC Huada Electronic Design Co Ltd filed Critical Beijing CEC Huada Electronic Design Co Ltd
Priority to CN200710117995XA priority Critical patent/CN101334734B/zh
Publication of CN101334734A publication Critical patent/CN101334734A/zh
Application granted granted Critical
Publication of CN101334734B publication Critical patent/CN101334734B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

这里描述了一个电信卡动态下载补丁程序方案,方案的提出,主要是由于电信卡OTA3标准要求动态管理下载的补丁,且可把补丁放在任何地址而不影响其运行。随着应用复杂度变高补丁不断变大,补丁被迫使用诸如LCALL/LJMP之类涉及绝对地址的指令。当补丁下载后,由于组成补丁各函数的入口地址发生变化,因此通过LCALL/LJMP指令绝对寻址便会产生问题。本发明以具有BANK切换机制的芯片作为对象,借助KEIL工具软件特殊编写技巧,使用单独的补丁绝对地址分析工具分析需要重新定位地址信息,利用电信卡内的补丁管理机制,对需要重新定位的地址信息进行信息替换,从而实现对补丁的动态下载。

Description

电信卡动态下载补丁程序方案
技术领域
本发明详细介绍了一种电信卡动态下载补丁程序方案,主要涉及嵌入式系统开发领域。
背景技术
目前,对于8051或和其兼容的体系芯片,使用最广的开发平台是KEIL。如果要在这样的平台上,实现动态下载补丁并且正常运行,没有通用的办法。经过研究,我们发现可以利用KEIL的一些特性以及一些特殊处理在一定程度上实现以上目的。
发明内容
本发明以具有BANK切换机制的芯片作为对象,将补丁程序下载到芯片中某个BANK的任意地址,并且能够正常运行。通过借助KEIL工具软件的特殊编写技巧,使用单独的补丁绝对地址分析工具分析需要重新定位地址信息,利用电信卡内的补丁管理机制,可以将补丁程序下载到BANK切换机制芯片中某个BANK的任意地址。整个方案主要由三部分组成:编写被打补丁程序(主工程,含有补丁管理模块)、补丁代码的编写(子工程的编写)和补丁绝对地址信息分析工具。
说明:因为各个补丁程序可能要被下载到与其编译时不同的地址上去,所以要对下载到COS中补丁程序某些绝对定位地址信息进行重新定位。而出于对COS内存、代码空间、处理的速度以及需要处理的数据量等各方面的考虑,补丁中某些绝对地址的重新定位不可能做得太复杂。
操作步骤如下:
1)主工程中编写补丁管理模块,预留补丁函数调用主工程BANK函数的函数接口;
2)按照特殊的编程技巧,编写补丁程序并生成补丁HEX文件;
3)对补丁程序编译后产生的HEX文件,利用一个单独的补丁绝对地址信息分析工具,提取补丁实现部分相关的HEX代码,将HEX代码数据按照指令的地址从小到大编排,用0xff填补编译时所产生的补丁代码数据间断空间,从而形成一个连续的补丁数据块。用补丁入口地址的相对偏移代替补丁数据块中需要重新定位的地址数据,形成新的补丁程序纯数据块。分析新补丁程序数据块中需要重新定位的地址所在代码相对于起始代码的指令偏移。计算从补丁数据块开始到结尾中需要重新定位地址的个数,连同补丁数据块大小以及COS版本、补丁ID等信息,以一定的结构作为文件头信息和新补丁纯数据块合在一起,形成新的补丁文件;
4)按照OTA3的要求,将各补丁文件以及根据OTA3标准管理补丁的函数生成一个DLL文件,传送到服务器端;
5)服务器针对每个用户卡内芯片卡商代码和COS版本号来决定是否需要下载补丁,如果需要,则下载;
6)卡片接收到这些信息后,在准备下载补丁的BANK内,找寻可以下载程序的连续空余地址,如果满足下载空间需求,则根据补丁管理模块,完成对补丁的下载。
下面是整个方案的几个重要部分:
1.主工程中包含补丁管理模块并预留补丁程序函数调用主工程BANK函数的函数接口主工程COS里面需要编写一个管理补丁程序的模块,负责新补丁的需要重新定位绝对地址信息的替换、补丁程序的删除和下载以及补丁入口地址的管理等。COS中补丁管理模块中存在一张表,用来记录每个补丁的新入口地址、补丁版本、补丁大小、COS版本等标志,下载完补丁后,更新该表。
在下载补丁的时候,分析文件头中需要修改绝对地址的信息,把要相对地址偏移信息加上一个修正值,再将修正后的代码下到相应的位置上。这个修正值就是新的下载补丁的入口地址。
在KEIL开发平台上,对于具有BANK切换机制的芯片,补丁程序一般设置在某个BANK内,通过在主工程的公共区建立一个全局函数指针、全局BSR变量和补丁BANK区函数调用主工程BANK区函数的接口,可以实现补丁BANK函数调用主工程BANK区函数,该接口函数采用没有定义传入参数和返回的特殊方式来定义。
这样,当补丁BANK区函数要调用主工程BANK区函数的时候,只需要先将全局BSR变量设置成将要调用的主工程函数的BANK号,把主工程中这个函数的地址附值给全局函数指针,再利用函数指针方式调用该函数。
(1)全局BSR变量如下:
BanknFunBSR
(2)接口函数如下:
_callBankFun:
    PUSH BSR                      ;保存当前BSR号
    MOV DPH,BanknFunPtr+01H      ;将要调用主工程函数指针附值给DPTR
    MOV DPL,BanknFunPtr+02H
    MOV A,#PC_A_L
    PUSH ACC                      ;PC_A:后面POPBSR这句话的PC指针的值
    MOV A,#PC_A_H
    PUSH ACC
    MOV BSR,BanknFunBSR          ;BanknFunBSR,所调用某个BANK的BSR,公共变量
;为了防止PATCH调用主工程内的BANK函数,这个函数又调用了其他BANK的函数。必须通过BSR重新定位B_CURRENTBANK这个变量的值(此处可以参考L51_BANK.A51文件的处理办法)
    ;
    CLR    A
    JMP    @A+DPTR        调用BanknFunPtr所指函数,这个函数返回到下条指令POPBSR处
    POP    BSR          ;PC_A:″POP BSR″这句话的PC指针的值,可在编译后获知。
    RET
(3)全局函数指针如下:
void(*BanknFunPtr)();
(4)调用方法举例如下:
BanknFunB SR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_1;
i=(unsigned char)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned char类型返回,无参数情况下可以将三个参数都设置为0。
从上面所描述的方法来看,如果在主工程中把接口准备好,补丁的BANK区函数就能非常方便地调用主工程BANK区中的函数了。
2.补丁代码的编写
(1)补丁代码编译器设置原则
1)为了方便处理,通过控制编译器,使得编译产生的跳转、调用指令限制为LCALL addr16,LJMP addr16。
避免产生ACALL与AJMP需要做以下两方面工作:
●C51编译器:使用ROM(LARGE)设置,则只在编译器级别产生LJMP与LCALL。在KEIL中该设置在Project-Options for Target-Target下,选择Code ROM Size:Large 64Kprogram,不要选择ROM(SMALL),该选择可能会编译出AJMP,ACALL。
●Linker/Locater:使用NOAJMP directive。在KEIL中该directive可以在Project-Optionsfor Target-BL51 Misc or LX51 Misc,设置Misc controls:NOAJMP。
补丁绝对地址信息分析工具分析此类指令的绝对跳转地址时,需要判断是在被搬移的区块还是外部区块。如果是外部区块则不分析,如果是在搬移块内,则需要将补丁下载起始地址加上偏移量后替换目标地址。由于要将生成的补丁代码限制在某个BANK区内,补丁中的程序调用主工程公共区的函数,函数入口地址将小于0x8000,而要调用主工程其它BANK区的函数,则需要将公共区的INTERBANK CALLTABLE作为入口,所以,需要修改的只是补丁中函数互相调用或者跳转产生的绝对定位代码,这些地址都大于等于0x8000。
2)有关DPTR与PC等绝对地址的指令,如:MOVC A,@A+DPTR,MOVC A,@A+PC
如果补丁代码程序段内不含需要写入数据表,则可不考虑该指令。补丁绝对地址信息分析工具需要分析DPTR所指的地址是在搬移块内还是搬移块外,如果是在搬移指令块外则直接查找,如果是在搬移块内,则需要加搬移的偏移量后替换DPTR的内容。
3)指令MOVC A,@A+DPTR和JMP@A+DPTR
对于此类指令,含有DPTR与其它寄存器(A,PC)共同寻址的指令。此类指令处理比较复杂,有三种情况:
a.A+DPTR的目标地址在搬移区块外,可直接找寻,不需要进行偏移量的考虑;
b.A+DPTR的目标地址在搬移区块内,需要将此指令前的DPTR进行偏移量修正;
c.DPTR在搬移区块外,而A+DPTR在搬移区块内,需要将此指令前的DPTR进行偏移量修正。如果在此指令后有指令改变A的值,使A+DPTR的结果又在搬移块外,然后再有指令JMP@A+DPTR,则要求DPTR不做偏移量修正,遇到这种情况,补丁程序退出。
4)为了方便COS管理补丁代码,将补丁代码都集中编放在某一个BANK内,补丁的入口地址为补丁程序的起始地址。
(2)补丁代码调用主工程(被打补丁程序)不同区域函数的方法
补丁程序经常要使用到主工程的资源,而一般带BANK切换机制的芯片,主工程中的函数有可能放在公共区,也有可能放在其它BANK区。补丁程序若要调用主工程的不同区域的函数,方法不相同。
补丁程序函数调用有三种方式:直接调用被打补丁程序公共区的函数;补丁程序中的函数调用本补丁程序中的其它函数;补丁程序调用被打补丁程序(主工程)中BANK区的函数。
因为前两种都是采用直接调用方式,比较简单,难度主要在于补丁中函数调用原来主工程中的函数,我们这里主要是用基于寄存器传递参数的法则,这样可以避免采用LARGE模式带来的传参数不好处理的问题。
采用的方法如前面所描述的,主要是在主工程的公共区域建立一个函数调用接口,一个全局函数指针和一个全局公共变量,补丁程序要调用主工程中某个BANK区内的函数时候,只需要把这个全局公共变量设置为需要调用的函数的所在的BSR号(BANK号),然后把函数名字附值给全局函数指针,再利用函数调用接口来调用函数就可以了。
为了避免在补丁工程中使用的变量和主工程相冲突,在被打补丁的程序(主工程)中利用KEIL工具配置,预留出一部分变量空间给补丁工程使用,其中包括全局变量和局部变量空间
对于补丁中要用到的主工程的全局变量,用PUBLIC变量名和XDATA/DATA/IDATA来定义;而补丁中要用到的被打补丁程序的函数,用PUBLIC函数名和CODE来定义。
3.补丁绝对地址分析工具
根据前面所讲的方式,编写一个PC端的程序,分析补丁程序编译生成的补丁代码的HEX文件:
1)提取跟补丁实现部分相关的HEX代码;
2)从上述HEX代码指令空间开始到结束,依次寻找是否具有MOVC A,@A+DPTR,MOVC A,@A+PC,MOVC A,@A+DPTR和JMP@A+DPTR指令;
3)如果有,则补丁绝对地址分析工具终止;
4)如果没有,则查找LCALL/LJMP指令后需要重新定位的地址信息,计算该信息相对于补丁开始指令的指令偏移量,再统计需要重新定位的地址总数,加上补丁的标志(按照OTA3的要求,补丁程序的COS版本、补丁程序ID、补丁程序下载成功后的COS版本号等),按照表1的结构,把文件头信息和文件体(补丁纯数据)结合,形成一个新的补丁文件。具体操作为:将1)所述的HEX代码数据按照指令的地址从小到大编排代码,用0xff填补补丁代码数据间断空间,补丁的大小等于填了0xff后补丁结束地址和补丁开始地址间代码的字节数。再将补丁代码数据中LCALL/LJMP代码后的大于等于0x8000的绝对地址找出,记录这个地址信息相对于补丁开始指令的2字节指令偏移量。将需要重新定位的地址数据用其与补丁入口地址的偏移代替,形成新的补丁纯数据文件。按照表2、表3和表4的结构,生成表1的数据。这样,用户卡中的COS可以很方便地分析出需要重新定位的地址,并按照补丁将要被下载的起始地址进行数据替换。
表1新补丁文件的格式
  文件头信息
  文件体(补丁纯数据)
表2文件头信息结构
  补丁标志(COS版本/PatchID/补丁大小等信息)   需要重定位的绝对地址偏移量信息
表3补丁标志(COS版本/PatchID/补丁大小等信息)结构
  字节  符号  说明
  第0~11字节  COSVersion  卡内现有的COS版本号(12字节)
  第12~23字节  COSVersionUpdated  补丁下载成功后卡片应有的COS版本号(12字节)
  第24~43字节  PatchID  补丁程序ID(20字节)
  第44~45字节  PatchSize  补丁大小(以字节为单位)
表4需要重定位的绝对地址偏移量信息结构
  字节   符号   说明
  第01~字节   InsAddrOffsNum   需要重新定位的LCALL/LJMP指令的总个数
  第2~3字节   InsAddrOffs1   第一个需要重新定位的LCALL/LJMP指令后的地址信息相对于补丁开始指令的指令偏移量
  第4~5字节   InsAddrOffs2   第二个需要重新定位的LCALL/LJMP指令后的地址信息相对于补丁开始指令的指令偏移量
  ...   ...   ...
  第2*n~2*n+1字节   InsAddrOffsn   第n个需要重新定位的LCALL/LJMP指令后的地址信息相对于补丁开始指令的指令偏移量
按照OTA3的要求,将各补丁文件以及根据OTA3标准管理补丁的函数生成一个DLL文件,传送到服务器端。
以上过程请参看图1。
而服务器针对每个用户卡内芯片卡商代码和COS版本号来决定是否需要下载补丁,如果需要,则下载。
当卡片接收到新的补丁信息后,在准备下载补丁的BANK内,找寻可以下载程序的连续空余地址,如果满足下载空间需求,先分析补丁文件头信息,找出需要重新定位的指令偏移,根据指令偏移在补丁纯数据块中找到需要修改的地址信息,因为这些地址信息已经被补丁绝对地址分析工具替换成了相对偏移地址,所以,只需要加上将要下载补丁的入口地址,就可以得到新的绝对地址,然后替代原地址代码。当更改了某些地址信息的补丁数据块下载完毕,补丁也就下载好了,再更新一些补丁管理信息(入口地址、补丁大小、COS更新后的版本号和补丁ID等),则完成补丁的下载。过程请参看图2。
通过本发明提供的以上操作方法,卡片COS可以对补丁代码中需要重新定位的地址信息进行信息替换,从而实现对补丁的动态下载,下载后补丁程序可以放在任何指定地址,实现了对下载的补丁程序实行动态管理。
附图说明
图1是补丁代码生成流程图;
图2是用户手中的卡下载补丁程序流程图。
具体实施方式
本发明需要以下步骤:
1.COS主工程中编写补丁管理模块以及补丁程序调用主工程BANK函数的函数接口;
2.根据提供资料的方法开发补丁子工程代码;
3.编写补丁绝对地址分析工具,分析出补丁程序中需要重新定位的地址信息,按照表1的结构生成新的补丁文件,按照OTA3的要求,将各个新的补丁文件和获取补丁信息的接口函数做成DLL文件,传送给电信服务器;
4.卡片COS通过OTA3方式,将新的补丁程序代码下载到卡中进行分析;
5.卡片COS分析补丁代码的过程中,替换需要重新定位的地址代码;
6.下载重新定位后的补丁代码;
7.卡片COS管理所下载的补丁。
在步骤1中,详细说明如下:
(一)主工程COS里面需要编写一个管理补丁程序的模块,负责新补丁的需要重新定位绝对地址信息的替换、补丁程序的删除和下载以及补丁入口地址的管理等。COS中补丁管理模块中存在一张表,用来记录每个补丁的新入口地址、补丁版本、补丁大小、COS版本等标志,下载完补丁后,更新该表;
(二)在主工程的公共区建立一个全局函数指针、公共全局变量和补丁BANK区函数调用主工程BANK区函数的接口;
通过在主工程的公共区建立一个全局函数指针、一个公共全局变量和一个补丁BANK区函数调用主工程BANK区函数的接口,可以实现补丁BANK函数调用主工程BANK区函数,该接口函数采用没有定义传入参数和返回的特殊方式来定义。
处理如下:
(1)在主工程的L51_BANK.A51文件中,加上如下代码
PUBLIC B_CURRENTBANK
?BANK?SELECT SEGMENT CODE
?BANK?DATA   SEGMENT DATA
             RSEG   ?BANK?DATA
?B_CURRENTBANK:DS     1
B_CURRENTBANK EQU?B_CURRENTBANK
(2)在COMMON区的其它.a51文件加上补丁函数调用主工程BANK区函数的入口函数
EXTRN DATA(B_CURRENTBANK)
PUBLIC BanknFunBSR
EXTRN DATA(BanknFunPtr)
PUBLIC_callBankFun
IO_BUFFER Segment Data    ;由keil编译器自动分配变量地址
RSeg IO_BUFFER
BanknFunBSR:DS 1  ;可以把这个变量放到已经存在的.A51文件的DATA数据段内,占用一个字节
_callBankFun:
PUSH    BSR
MOV     DPH,BanknFunPtr+01H
MOV     DPL,BanknFunPtr+02H
MOV     A,#PC_A_L
PUSH     ACC                   ;PC_A:POP BSR这句话的PC指针的值
MOV     A,#PC_A_H
PUSH     ACC
MOV     BSR,BanknFunBSR       ;BanknFunBSR,所调用某个BANK的BSR,公共变量
;以下这6句代码的作用是为了防止PATCH调用主工程内的BANK函数,这个函数又调用了其他BANK的函数。以下代码是基于示例工程处理的代码。目的是要保留当前调用其它BANK的函数之前的B_CURRENTBANK的数据,以便返回时候能正确设置BSR。
CLR A
MOV B,BSR
MOV A,#0x11
MUL AB
ADDA,#0x0a
MOV B_CURRENTBANK,A
CLR    A
JMP    @A+DPTR         ;调用BanknFunPtr所致函数
POP    BSR             ;PC_A:″POP BSR″这句话的PC指针的值,可在编译后获知。
RET
(3)在COMMON区.C文件中申明
void(*BanknFunPtr)();//全局函数指针
(三)可选的,在主工程应该用KEIL的配置预留出一些空间出来给补丁程序使用。
在步骤2中,详细说明如下:
(一)补丁工程根据补丁代码编译器设置原则来设置编译器;
(二)补丁工程根据变量和函数的申明以及调用方法编写代码;
(1)主工程函数在补丁程序中的申明
举例:
PUBLIC LEDSHINEFAST
LEDSHINEFAST              CODE             008000H
PUBLIC INSERROR
INSERROR                  CODE             000C69H
(2)补丁程序某.H文件申明主工程变量和函数
举例:
    extern void(*BanknFunPtr)();//全局函数指针
    extern callBankFun(i,j,k);//需要注意的是,因为传递的参数不知道类型,而返回的类型也不能确认,所以,不要给这个函数传入和传出定义类型。
    extern unsigned char TestBankFuncCall_1(unsigned char xx,unsigned int yy,int zz);
    extern unsigned int TestBankFuncCall_2(unsigned char xx,unsigned int yy,int zz);
    extern unsigned long TestBankFuncCall_3(unsigned char xx,unsigned int yy,int zz);
    extern void*TestBankFuncCall_4(unsigned char xx,unsigned int yy,int zz);
    extern unsigned char*TestBankFuncCall_5(unsigned char xx,unsigned int yy,int zz);
    extern unsigned int*TestBankFuncCall_6(unsigned char xx,unsigned int yy,int zz);
    extern unsigned long*TestBankFuncCall_7(unsigned char xx,unsigned int yy,int zz);
(3)补丁程序如何调用主工程中的其它BANK区的函数
因为被调用的函数不需要传入参数,则传入的三个参数默认为0,如果有超过三个参数的情况,那么对于超出的参数,需要清楚函数使用的默认段来传递参数的地址,将需要传递的参数放入默认段相应的地址。
补丁中函数调用主工程的BANK函数举例如下:
unsigned char i;
unsigned int j;
unsigned long k;
void*voidptr=&i;
unsigned char*ucharptr=&i;
unsigned int*uintptr=&i;
unsigned long*ulongptr=&i;
BanknFunB SR=0x03;
BanknFunPtr=ledshineFast;
callBankFun(0,0,0);//因为ledshineFast不需要传入参数,默认为0,且无返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_1;
i=(unsigned char)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned char类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_2;
j=(unsigned int)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned int类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_3;
k=(unsigned long)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned long类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_4;
voidptr=(void*)callBankFun(1,0x7722,0x8855);//函数有参数输入,有void*类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_5;
ucharptr=(unsigned char*)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned char*类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_6;
uintptr=(unsigned int*)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned int*类型返回
BanknFunBSR=0x01;
BanknFunPtr=(void*)TestBankFuncCall_7;
ulongptr=(unsigned long*)callBankFun(1,0x7722,0x8855);//函数有参数输入,有unsigned long*类型返回
(4)补丁程序如何调用主工程中的COMMON区的函数直接调用。
(5)补丁程序中变量的使用
全局变量:
一类是主工程的变量被补丁函数使用,采用如下所述的申明方式来申明。
举例:
;DATA LIST
PUBLIC BanknFunBSR
BanknFunBSR DATA 01AH
PUBLIC BanknFunPtr
BanknFunPtr data 015h
;XDATA list
PUBLIC G_CurrentReponse
G_CurrentReponse                    XDATA         0000000AH
使用的时候,直接引用。
另一类是补丁中另外使用的全局变量,要避免和主工程相冲突,也可同后面的描述。在主工程中预留变量空间给函数变量使用:
为了避免补丁程序在运行时,使用的变量空间把原来主工程没有释放的变量空间覆盖引起程序出错。在主工程应该用KEIL的配置预留出一些空间出来。
LX51LOCATE中:RESERVE框中加上需要留出的空间。
例如:
D:0X20-D:0X40,X:0X0000-X:0X0040等等。
那么在补丁程序中就使用这些空间。
(三)编译生成HEX文件。
在步骤3中,详细说明如下:
(一)从编译出的HEX文件中提取和补丁实现相关的HEX代码;
(二)从上述代码的指令空间开始到结束,依次寻找是否具有MOVC A,@A+DPTR,MOVC A,@A+PC,MOVC A,@A+DPTR和JMP@A+DPTR指令,如果有,则补丁绝对地址分析工具终止;
(三)如果没有,将HEX代码数据按照指令的地址从小到大编排代码,用0xff填补补丁代码数据间断空间,补丁的大小等于填了0xff后补丁结束地址和补丁开始地址间代码的字节数;
(四)将补丁代码数据中LCALL/LJMP代码后的大于等于0x8000的绝对地址找出,记录这个地址信息相对于补丁开始指令的2字节指令偏移量;
(五)将需要重新定位的地址数据用其与补丁入口地址的偏移代替,形成新的补丁纯数据文件;
(六)按照表2、表3和表4的结构,生成表1的数据;
(七)按照OTA3的要求,将各个新的补丁文件和获取补丁信息的接口函数做成DLL文件,传送给电信服务器。
步骤5,详细说明如下:
(一)当卡片接收到新的补丁信息后,在准备下载补丁的BANK内,找寻可以下载程序的连续空余地址;
(二)如果满足下载空间需求,先分析补丁文件头信息,找出需要重新定位的指令偏移,根据指令偏移在补丁纯数据块中找到需要修改的地址信息,加上将要下载补丁的入口地址,得到新的绝对地址,然后替代原地址代码。
服务器会针对每个用户,根据使用卡的卡商代码和COS版本号来决定是否有需要下载的补丁,如果需要,则下载。同理,当运营商要删除卡中的某些特定程序,可以向卡发送远程删除指令。对于不同的用户,服务器根据卡商代码和卡中现有的COS版本号来了解当前卡是否已经存在相应的补丁,如果存在,则下发删除指令。

Claims (6)

1.电信卡动态下载补丁程序方案,其特征在于有单独的补丁绝对地址信息分析工具,分析补丁中需要重新定位的绝对地址信息,生成新的补丁文件,再通过OTA3标准规定将各补丁信息获取的函数以及补丁形成动态链接库提交给电信服务器。
2.根据权利要求1所述的电信卡动态下载补丁程序方案,其特征在于COS中存在补丁管理模块,负责新补丁中需要重新定位的绝对地址信息的替换、补丁程序的删除、下载以及补丁入口地址的管理。
3.根据权利要求1所述的电信卡动态下载补丁程序方案,其特征在于在KEIL开发平台上,对于具有BANK切换机制的芯片,所有补丁要求设置在同一个BANK内,而补丁的编写通过巧妙的汇编与C语言混合编程方法,实现BANK内补丁函数对被打补丁工程中BANK内的函数调用。
4.根据权利要求1所述的电信卡动态下载补丁程序方案,其特征在于单独的补丁绝对地址信息分析工具进一步包括:
a)提取补丁程序编译出的HEX文件中与补丁实现相关的部分代码;
b)从提取出的代码的指令空间开始到结束,依次寻找是否具有MOVC A,@A+DPTR,MOVC A,@A+PC,MOVC A,@A+DPTR和JMP@A+DPTR指令,如果有,则补丁绝对地址分析工具退出;
c)将HEX文件数据按照指令的地址从小到大编排;
d)将补丁代码数据间断空间填补0xff;
e)从经过c)处理的补丁代码数据的开始到结束,依次寻找LCALL和LJMP指令,如果指令后面的地址大于0x8000,则表示为需要重新定位的地址信息,将这个地址数据指令相对于补丁开始指令偏移记录下来,并统计需要这样重定位的地址的总个数;
f)将需要重新定位的地址数据用其与补丁入口地址的偏移代替;
g)将补丁的COS版本、补丁下载成功后的COS版本、补丁程序ID、整个补丁的大小以及从e)中分析出的需要重新定位的地址相对于补丁开始指令的指令偏移形成文件头,后面添加上经过上述c)、d)、f)处理的补丁纯数据块,形成新的补丁文件;
h)再通过OTA3标准规定将各补丁信息获取的函数以及补丁形成动态链接库提交给电信服务器。
5.根据权利要求2所述的下载补丁程序方案,其特征在于COS中存在补丁管理模块进一步包括:
i.COS接收到需要下载的新的全部补丁代码后,分析该文件中补丁大小,查找芯片内部用于下载补丁的BANK是否有足够连续空间,如果空间不满足要求,则不下载补丁,如果满足,则定位将要下载补丁的空间地址,将其作为新补丁的入口地址;
ii.分析补丁文件头中补丁程序需要重新定位地址的指令偏移,将纯补丁数据中的指令偏移位置对应的地址数据加上要下载补丁的空间入口地址,得到新的地址信息,实现重定位;
iii.将需要重新定位的地址都替换成新的地址信息后,利用COS中的补丁管理模块进行下载;
iv.COS中补丁管理模块中存在一张表,用来记录每个补丁的新入口地址、补丁版本、补丁大小、COS版本等标志;
v.下载完补丁后,更新iv中所述的表。
6.根据权利要求3所述的下载补丁程序方案,其特征在于BANK内补丁函数对被打补丁工程中BANK内的函数调用方法进一步包括:
1)在KEIL开发平台上,对于具有BANK切换机制的芯片,补丁程序一般设置在某个BANK内,通过在主工程的公共区建立一个全局函数指针、全局BSR变量和一个补丁BANK区函数调用主工程BANK区函数的接口,可以实现补丁BANK函数调用主工程BANK区函数,该接口函数采用没有定义传入参数和返回的特殊方式来定义;
2)在被打补丁的程序中利用KEIL工具配置,预留一部分补丁变量空间,包括全局变量和局部变量空间;
3)对于补丁中要用到的被打补丁程序的全局变量,用PUBLIC变量名和XDATA/DATA/IDATA来定义;而补丁中要用到的被打补丁程序的函数,用PUBLIC函数名和CODE来定义;
4)补丁的入口地址为整段补丁程序的起始地址。
CN200710117995XA 2007-06-27 2007-06-27 电信卡动态下载补丁程序方法 Active CN101334734B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200710117995XA CN101334734B (zh) 2007-06-27 2007-06-27 电信卡动态下载补丁程序方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200710117995XA CN101334734B (zh) 2007-06-27 2007-06-27 电信卡动态下载补丁程序方法

Publications (2)

Publication Number Publication Date
CN101334734A true CN101334734A (zh) 2008-12-31
CN101334734B CN101334734B (zh) 2012-01-11

Family

ID=40197350

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200710117995XA Active CN101334734B (zh) 2007-06-27 2007-06-27 电信卡动态下载补丁程序方法

Country Status (1)

Country Link
CN (1) CN101334734B (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102062821B (zh) * 2009-11-18 2012-11-07 上海华虹Nec电子有限公司 确认cos下载内容是否正确的方法
CN103645917A (zh) * 2013-12-03 2014-03-19 北京中电华大电子设计有限责任公司 Java卡的Java代码补丁方法
CN103744709A (zh) * 2014-01-23 2014-04-23 华为技术有限公司 补丁加载方法及装置
CN106648751A (zh) * 2016-11-22 2017-05-10 深圳市元征软件开发有限公司 一种嵌入式软件快速升级的方法及嵌入式设备
CN110192178A (zh) * 2017-09-08 2019-08-30 深圳市汇顶科技股份有限公司 程序打补丁的方法、装置、微控制单元和终端设备
CN114125915A (zh) * 2022-01-26 2022-03-01 舟谱数据技术南京有限公司 针对设定终端app应用的定位热修复系统和方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100370431C (zh) * 2004-08-16 2008-02-20 上海华为技术有限公司 对嵌入式系统进行在线监测的方法及其系统
KR100615890B1 (ko) * 2004-12-08 2006-08-25 삼성에스디에스 주식회사 스마트 카드 운영체제의 패치 방법

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102062821B (zh) * 2009-11-18 2012-11-07 上海华虹Nec电子有限公司 确认cos下载内容是否正确的方法
CN103645917A (zh) * 2013-12-03 2014-03-19 北京中电华大电子设计有限责任公司 Java卡的Java代码补丁方法
CN103645917B (zh) * 2013-12-03 2016-09-14 北京中电华大电子设计有限责任公司 Java卡的Java代码补丁方法
CN103744709A (zh) * 2014-01-23 2014-04-23 华为技术有限公司 补丁加载方法及装置
CN103744709B (zh) * 2014-01-23 2017-02-15 华为技术有限公司 补丁加载方法及装置
CN106648751A (zh) * 2016-11-22 2017-05-10 深圳市元征软件开发有限公司 一种嵌入式软件快速升级的方法及嵌入式设备
CN106648751B (zh) * 2016-11-22 2020-04-21 深圳市元征软件开发有限公司 一种嵌入式软件快速升级的方法及嵌入式设备
CN110192178A (zh) * 2017-09-08 2019-08-30 深圳市汇顶科技股份有限公司 程序打补丁的方法、装置、微控制单元和终端设备
CN114125915A (zh) * 2022-01-26 2022-03-01 舟谱数据技术南京有限公司 针对设定终端app应用的定位热修复系统和方法
CN114125915B (zh) * 2022-01-26 2022-04-12 舟谱数据技术南京有限公司 针对设定终端app应用的定位热修复系统和方法

Also Published As

Publication number Publication date
CN101334734B (zh) 2012-01-11

Similar Documents

Publication Publication Date Title
CN101334734B (zh) 电信卡动态下载补丁程序方法
Koshy et al. VMSTAR: synthesizing scalable runtime environments for sensor networks
CN109597814A (zh) 一种后台管理信息系统的在线快速交付系统
US8499291B2 (en) Method for dynamically linking program on embedded platform and embedded platform
CN109271142A (zh) 基于模板组件的开发云平台
CN101026826B (zh) 用于提供在无线装置中使用的整体映像的系统和方法
US7305657B2 (en) Web server having function of Java servlet, method for updating Java program and computer program
US20050251788A1 (en) Methods and systems for generating a configurable user interface
CN101719056A (zh) 用于实时系统控制的组件模型
US9392051B2 (en) Application distribution supplying a dedicated application to a terminal from an application deposited by the developer
CN101739442A (zh) 用于显示信息的系统和方法
CN107729012A (zh) 一种应用界面组合配置方法和装置
CN1973262A (zh) 使用集中动态寻址(da)管理器的动态寻址
CN110569050A (zh) 一种小程序更新方法和装置
CN102144230B (zh) 基于记录的代码结构
JP6002302B2 (ja) Webアプリケーション生成システム、Webアプリケーション生成システムの制御方法、Webアプリケーション生成システムのプログラム、Webアプリケーション生成装置、Webアプリケーション生成装置の制御方法、およびWebアプリケーション生成装置のプログラム
KR101432533B1 (ko) 모바일 광고 시스템 및 그의 광고 방법
CN102004648A (zh) 程序定制方法和装置
US6928641B1 (en) Method and system for far branch and call instructions
CN105100117A (zh) 一种用于访问组合服务的方法及装置
Rho et al. Towards context-sensitive service aspects
CN106528196B (zh) 智能设备的app加载方法及应用该方法的智能设备、系统
CN114003210A (zh) 基于sdk的多应用程序适配方法、装置、设备及介质
JP2003162414A (ja) アプリケーション提供方法及びアプリケーション提供システム
JP2000347875A (ja) ファイル移植技術

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C56 Change in the name or address of the patentee
CP02 Change in the address of a patent holder

Address after: 102209 Beijing, Beiqijia, the future of science and technology in the south area of China electronic network security and information technology industry base C building,

Patentee after: Beijing CEC Huada Electronic Design Co., Ltd.

Address before: 100102 Beijing City, Chaoyang District Lize two Road No. 2, Wangjing science and Technology Park A block five layer

Patentee before: Beijing CEC Huada Electronic Design Co., Ltd.