国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      電信卡動態(tài)下載補丁程序方案的制作方法

      文檔序號:6609960閱讀:261來源:國知局

      專利名稱::電信卡動態(tài)下載補丁程序方案的制作方法
      技術領域
      :本發(fā)明詳細介紹了一種電信卡動態(tài)下載補丁程序方案,主要涉及嵌入式系統(tǒng)開發(fā)領域。技術背景目前,對于8051或和其兼容的體系芯片,使用最廣的開發(fā)平臺是KEIL。如果要在這樣的平臺上,實現(xiàn)動態(tài)下載補丁并且正常運行,沒有通用的辦法。經(jīng)過研究,我們發(fā)現(xiàn)可以利用KEIL的一些特性以及一些特殊處理在一定程度上實現(xiàn)以上目的。
      發(fā)明內(nèi)容本發(fā)明以具有BANK切換機制的芯片作為對象,將補丁程序下載到芯片中某個BAM的任意地址,并且能夠正常運行。通過借助KEIL工具軟件的特殊編寫技巧,使用單獨的補丁絕對地址分析工具分析需要重新定位地址信息,利用電信卡內(nèi)的補丁管理機制,可以將補丁程序下載到BANK切換機制芯片中某個BANK的任意地址。整個方案主要由三部分組成編寫被打補丁程序(主工程,含有補丁管理模塊)、補丁代碼的編寫(子工程的編寫)和補丁絕對地址信息分析工具。說明因為各個補丁程序可能要被下載到與其編譯時不同的地址上去,所以要對下載到COS中補丁程序某些絕對定位地址信息進行重新定位。而出于對COS內(nèi)存、代碼空間、處理的速度以及需要處理的數(shù)據(jù)量等各方面的考慮,補丁中某些絕對地址的重新定位不可能做得太復雜。操作步驟如下1)主工程中編寫補丁管理模塊,預留補丁函數(shù)調(diào)用主工程BANK函數(shù)的函數(shù)接口;2)按照特殊的編程技巧,編寫補丁程序并生成補丁HEX文件;3)對補丁程序編譯后產(chǎn)生的HEX文件,利用一個單獨的補丁絕對地址信息分析工具,提取補丁實現(xiàn)部分相關的服X代碼,將冊X代碼數(shù)據(jù)按照指令的地址從小到大編排,用0xff填補編譯時所產(chǎn)生的補丁代碼數(shù)據(jù)間斷空間,從而形成一個連續(xù)的補丁數(shù)據(jù)塊。用補丁入口地址的相對偏移代替補丁數(shù)據(jù)塊中需要重新定位的地址數(shù)據(jù),形成新的補丁程序純數(shù)據(jù)塊。分析新補丁程序數(shù)據(jù)塊中需要重新定位的地址所在代碼相對于起始代碼的指令偏移。計算從補丁數(shù)據(jù)塊開始到結(jié)尾中需要重新定位地址的個數(shù),連同補丁數(shù)據(jù)塊大小以及COS版本、補丁ID等信息,以一定的結(jié)構(gòu)作為文件頭信息和新補丁純數(shù)據(jù)塊合在一起,形成新的補丁文件;4)按照0TA3的要求,將各補丁文件以及根據(jù)0TA3標準管理補丁的函數(shù)生成一個DLL文件,傳送到服務器端;5)服務器針對每個用戶卡內(nèi)芯片卡商代碼和COS版本號來決定是否需要下載補丁,如果需要,則下載;6)卡片接收到這些信息后,在準備下載補丁的BANK內(nèi),找尋可以下載程序的連續(xù)空余地址,如果滿足下載空間需求,則根據(jù)補丁管理模塊,完成對補丁的下載。下面是整個方案的幾個重要部分1.主工程中包含補丁管理模塊并預留補丁程序函數(shù)調(diào)用主工程BANK函數(shù)的函數(shù)接口主工程COS里面需要編寫一個管理補丁程序的模塊,負責新補丁的需要重新定位絕對地址信息的替換、補丁程序的刪除和下載以及補丁入口地址的管理等。COS中補丁管理模塊中存在一張表,用來記錄每個補丁的新入口地址、補丁版本、補丁大小、COS版本等標志,下載完補丁后,更新該表。在下載補丁的時候,分析文件頭中需要修改絕對地址的信息,把要相對地址偏移信息加上一個修正值,再將修正后的代碼下到相應的位置上。這個修正值就是新的下載補丁的入口地址。在KEIL開發(fā)平臺上,對于具有BANK切換機制的芯片,補丁程序一般設置在某個BANK內(nèi),通過在主工程的公共區(qū)建立一個全局函數(shù)指針、全局BSR變量和補丁BANK區(qū)函數(shù)調(diào)用主工程BANK區(qū)函數(shù)的接口,可以實現(xiàn)補丁BANK函數(shù)調(diào)用主工程BANK區(qū)函數(shù),該接口函數(shù)采用沒有定義傳入?yún)?shù)和返回的特殊方式來定義。這樣,當補丁BANK區(qū)函數(shù)要調(diào)用主工程BANK區(qū)函數(shù)的時候,只需要先將全局BSR變量設置成將要調(diào)用的主工程函數(shù)的BANK號,把主工程中這個函數(shù)的地址附值給全局函數(shù)指針,再利用函數(shù)指針方式調(diào)用該函數(shù)。(1)全局BSR變量如下BanknFunBSR(2)接口函數(shù)如下—callBankFun:PUSHBSR;保存當前BSR號MOVDPH,BanknFunPtr+01H;將要調(diào)用主工程函數(shù)指針附值給DPTRMOVDPL,BanknFunPtr+02HMOVA,#PC_A_LPUSHACC;PC—A:后面POPBSR這句話的PC指針的值MOVA,#PC_A_HPUSHACCMOVBSR,BanknFunBSR;BanknFunBSR,所調(diào)用某個BANK的BSR,公共變量;為了防止PATCH調(diào)用主工程內(nèi)的BANK函數(shù),這個函數(shù)又調(diào)用了其他BANK的函數(shù)。必須通過BSR重新定位B—CURRENTBANK這個變量的值(此處可以參考L51一BANK.A51文件的處理辦法)CLRAJMP@A+DPTR調(diào)用BanknFunPtr所指函數(shù),這個函數(shù)返回到下條指令POPBSR處POPBSR;PC—A:"POPBSR"這句話的PC指針的值,可在編譯后獲知。RET(3)全局函數(shù)指針如下void(*BanknFunPtr)();(4)調(diào)用方法舉例如下-BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankFuncCall_l;i=(unsignedchar)callBankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsignedchar類型返回,無參數(shù)情況下可以將三個參數(shù)都設置為O。從上面所描述的方法來看,如果在主工程中把接口準備好,補丁的BANK區(qū)函數(shù)就能非常方便地調(diào)用主工程BANK區(qū)中的函數(shù)了。2.補丁代碼的編寫(1)補丁代碼編譯器設置原則1)為了方便處理,通過控制編譯器,使得編譯產(chǎn)生的跳轉(zhuǎn)、調(diào)用指令限制為LCALLaddr16,LJMPaddr16。避免產(chǎn)生ACALL與AJMP需要做以下兩方面工作*C51編譯器使用ROM(LARGE)設置,則只在編譯器級別產(chǎn)生LJMP與LCALL。在KEIL中該設置在Project-OptionsforTarget-Target下,選擇CodeROMSize:Large64Kprogram,不要選擇ROM(SMALL),該選擇可能會編譯出AJMP,ACALL。*Linker/Locater:使用NOAJMPdirective。在KEIL中該directive可以在Project-OptionsforTarget-BL51MiscorLX51Misc,設置Misccontrols:NOAJMP。補丁絕對地址信息分析工具分析此類指令的絕對跳轉(zhuǎn)地址時,需要判斷是在被搬移的區(qū)塊還是外部區(qū)塊。如果是外部區(qū)塊則不分析,如果是在搬移塊內(nèi),則需要將補丁下載起始地址加上偏移量后替換目標地址。由于要將生成的補丁代碼限制在某個BANK區(qū)內(nèi),補丁中的程序調(diào)用主工程公共區(qū)的函數(shù),函數(shù)入口地址將小于0x8000,而要調(diào)用主工程其它BANK區(qū)的函數(shù),則需要將公共區(qū)的INTERBANKCALLTABLE作為入口,所以,需要修改的只是補丁中函數(shù)互相調(diào)用或者跳轉(zhuǎn)產(chǎn)生的絕對定位代碼,這些地址都大于等于0x8000。2)有關DPTR與PC等絕對地址的指令,如MOVCA,@A+DPTR,MOVCA,@A+PC如果補丁代碼程序段內(nèi)不含需要寫入數(shù)據(jù)表,則可不考慮該指令。補丁絕對地址信息分析工具需要分析DPTR所指的地址是在搬移塊內(nèi)還是搬移塊外,如果是在搬移指令塊外則直接査找,如果是在搬移塊內(nèi),則需要加搬移的偏移量后替換DPTR的內(nèi)容。3)指令MOVCA,@A+DPTR和JMP@A+DPTR對于此類指令,含有DPTR與其它寄存器(A,PC)共同尋址的指令。此類指令處理比較復雜,有三種情況-a.A+DPTR的目標地址在搬移區(qū)塊外,可直接找尋,不需要進行偏移量的考慮;b.A+DPTR的目標地址在搬移區(qū)塊內(nèi),需要將此指令前的DPTR進行偏移量修正;c.DPTR在搬移區(qū)塊外,而A+DPTR在搬移區(qū)塊內(nèi),需要將此指令前的DPTR進行偏移量修正。如果在此指令后有指令改變A的值,使A+DPTR的結(jié)果又在搬移塊外,然后再有指令JMP@A+DPTR,則要求DPTR不做偏移量修正,遇到這種情況,補丁程序退出。4)為了方便COS管理補丁代碼,將補丁代碼都集中編放在某一個BANK內(nèi),補丁的入口地址為補丁程序的起始地址。(2)補丁代碼調(diào)用主工程(被打補丁程序)不同區(qū)域函數(shù)的方法補丁程序經(jīng)常要使用到主工程的資源,而一般帶BANK切換機制的芯片,主工程中的函數(shù)有可能放在公共區(qū),也有可能放在其它BANK區(qū)。補丁程序若要調(diào)用主工程的不同區(qū)域的函數(shù),方法不相同。補丁程序函數(shù)調(diào)用有三種方式直接調(diào)用被打補丁程序公共區(qū)的函數(shù);補丁程序中的函數(shù)調(diào)用本補丁程序中的其它函數(shù);補丁程序調(diào)用被打補丁程序(主工程)中BANK區(qū)的函數(shù)。因為前兩種都是采用直接調(diào)用方式,比較簡單,難度主要在于補丁中函數(shù)調(diào)用原來主工程中的函數(shù),我們這里主要是用基于寄存器傳遞參數(shù)的法則,這樣可以避免采用LARGE模式帶來的傳參數(shù)不好處理的問題。采用的方法如前面所描述的,主要是在主工程的公共區(qū)域建立一個函數(shù)調(diào)用接口,一個全局函數(shù)指針和一個全局公共變量,補丁程序要調(diào)用主工程中某個BANK區(qū)內(nèi)的函數(shù)時候,只需要把這個全局公共變量設置為需要調(diào)用的函數(shù)的所在的BSR號(BANK號),然后把函數(shù)名字附值給全局函數(shù)指針,再利用函數(shù)調(diào)用接口來調(diào)用函數(shù)就可以了。為了避免在補丁工程中使用的變量和主工程相沖突,在被打補丁的程序(主工程)中利用KEIL工具配置,預留出一部分變量空間給補丁工程使用,其中包括全局變量和局部變量空間對于補丁中要用到的主工程的全局變量,用PUBLIC變量名和XDATA/DATA/IDATA來定義;而補丁中要用到的被打補丁程序的函數(shù),用PUBLIC函數(shù)名和CODE來定義。3.補丁絕對地址分析工具根據(jù)前面所講的方式,編寫一個PC端的程序,分析補丁程序編譯生成的補丁代碼的HEX文件-1)提取跟補丁實現(xiàn)部分相關的HEX代碼;2)從上述HEX代碼指令空間開始到結(jié)束,依次尋找是否具有MOVCA,@A+DPTR,MOVCA,@A+PC,MOVCA,@A+DPTR和JMP@A+DPTR指令;3)如果有,則補丁絕對地址分析工具終止;4)如果沒有,則査找LCALL/LJMP指令后需要重新定位的地址信息,計算該信息相對于補丁開始指令的指令偏移量,再統(tǒng)計需要重新定位的地址總數(shù),加上補丁的標志(按照OTA3的要求,補丁程序的COS版本、補丁程序ID、補丁程序下載成功后的COS版本號等),按照表1的結(jié)構(gòu),把文件頭信息和文件體(補丁純數(shù)據(jù))結(jié)合,形成一個新的補丁文件。具體操作為將l)所述的HEX代碼數(shù)據(jù)按照指令的地址從小到大編排代碼,用0xff填補補丁代碼數(shù)據(jù)間斷空間,補丁的大小等于填了0xff后補丁結(jié)束地址和補丁開始地址間代碼的字節(jié)數(shù)。再將補丁代碼數(shù)據(jù)中LCALL/LJMP代碼后的大于等于0x8000的絕對地址找出,記錄這個地址信息相對于補丁開始指令的2字節(jié)指令偏移量。將需要重新定位的地址數(shù)據(jù)用其與補丁入口地址的偏移代替,形成新的補丁純數(shù)據(jù)文件。按照表2、表3和表4的結(jié)構(gòu),生成表l的數(shù)據(jù)。這樣,用戶卡中的COS可以很方便地分析出需要重新定位的地址,并按照補丁將要被下載的起始地址進行數(shù)據(jù)替換。表1新補丁文件的格式<table>tableseeoriginaldocumentpage8</column></row><table>表2文件頭信息結(jié)構(gòu)<table>tableseeoriginaldocumentpage8</column></row><table>表3補丁標志(COS版本/PatchlD/補丁大小等信息)結(jié)構(gòu)<table>tableseeoriginaldocumentpage9</column></row><table>表4需要重定位的絕對地址偏移量信息結(jié)構(gòu)<table>tableseeoriginaldocumentpage9</column></row><table>按照0TA3的要求,將各補丁文件以及根據(jù)0TA3標準管理補丁的函數(shù)生成一個DLL文件,傳送到服務器端。以上過程請參看圖1。而服務器針對每個用戶卡內(nèi)芯片卡商代碼和COS版本號來決定是否需要下載補丁,如果需要,則下載。當卡片接收到新的補丁信息后,在準備下載補丁的BANK內(nèi),找尋可以下載程序的連續(xù)空余地址,如果滿足下載空間需求,先分析補丁文件頭信息,找出需要重新定位的指令偏移,根據(jù)指令偏移在補丁純數(shù)據(jù)塊中找到需要修改的地址信息,因為這些地址信息已經(jīng)被補丁絕對地址分析工具替換成了相對偏移地址,所以,只需要加上將要下載補丁的入口地址,就可以得到新的絕對地址,然后替代原地址代碼。當更改了某些地址信息的補丁數(shù)據(jù)塊下載完畢,補丁也就下載好了,再更新一些補丁管理信息(入口地址、補丁大小、COS更新后的版本號和補丁ID等),則完成補丁的下載。過程請參看圖2。通過本發(fā)明提供的以上操作方法,卡片COS可以對補丁代碼中需要重新定位的地址信息進行信息替換,從而實現(xiàn)對補丁的動態(tài)下載,下載后補丁程序可以放在任何指定地址,實現(xiàn)了對下載的補丁程序?qū)嵭袆討B(tài)管理。圖l是補丁代碼生成流程圖;圖2是用戶手中的卡下載補丁程序流程圖。具體實施方式本發(fā)明需要以下步驟1.COS主工程中編寫補丁管理模塊以及補丁程序調(diào)用主工程BANK函數(shù)的函數(shù)接口;2.根據(jù)提供資料的方法開發(fā)補丁子工程代碼;3.編寫補丁絕對地址分析工具,分析出補丁程序中需要重新定位的地址信息,按照表l的結(jié)構(gòu)生成新的補丁文件,按照0TA3的要求,將各個新的補丁文件和獲取補丁信息的接口函數(shù)做成DLL文件,傳送給電信服務器;4.卡片C0S通過0TA3方式,將新的補丁程序代碼下載到卡中進行分析;5.卡片COS分析補丁代碼的過程中,替換需要重新定位的地址代碼;6.下載重新定位后的補丁代碼;7.卡片COS管理所下載的補丁。在步驟l中,詳細說明如下(一)主工程COS里面需要編寫一個管理補丁程序的模塊,負責新補丁的需要重新定位絕對地址信息的替換、補丁程序的刪除和下載以及補丁入口地址的管理等。COS中補丁管理模塊中存在一張表,用來記錄每個補丁的新入口地址、補丁版本、補丁大小、COS版本等標志,下載完補丁后,更新該表;(二)在主工程的公共區(qū)建立一個全局函數(shù)指針、公共全局變量和補丁BANK區(qū)函數(shù)調(diào)用主工程BANK區(qū)函數(shù)的接口;通過在主工程的公共區(qū)建立一個全局函數(shù)指針、一個公共全局變量和一個補丁BANK區(qū)函數(shù)調(diào)用主工程BANK區(qū)函數(shù)的接口,可以實現(xiàn)補丁BANK函數(shù)調(diào)用主工程BANK區(qū)函數(shù),該接口函數(shù)采用沒有定義傳入?yún)?shù)和返回的特殊方式來定義。處理如下(1)在主工程的L51_BANK.A51文件中,加上如下代碼PUBLICB_CURRENTBANKBANKSELECTSEGMENTCODEBANKDATASEGMENTDATARSEGBANKDATAB—CURRENTBANK:DS1B—CURRENTBANKEQUB—CURRENTBANK(2)在COMMON區(qū)的其它.a51文件加上補丁函數(shù)調(diào)用主工程BANK區(qū)函數(shù)的入口函數(shù)EXTRNDATA(B一CURRENTBANK)PUBLICBanknFunBSREXTRNDATA(BanknFunPtr)PUBLIC—callBankFun10—BUFFERSegmentData;由keil編譯器自動分配變量地址RSeg10—BUFFERBanknFunBSR:DS1;可以把這個變量放到己經(jīng)存在的.A51文件的DATA數(shù)據(jù)段內(nèi),占用一個字節(jié)—callBankFun:PUSHBSRMOVDPH,BanknFunPtr+OlHMOVDPL,BanknFunPtr+02HMOVA,#PC—A_LPUSHACC;PC—A:POPBSR這句話的PC指針的值MOVA,#PC—A一HPUSHACCMOVBSR,BanknFunBSR;BanknFunBSR,所調(diào)用某個BANK的BSR,公共變量;以下這6句代碼的作用是為了防止PATCH調(diào)用主工程內(nèi)的BANK函數(shù),這個函數(shù)又調(diào)用了其他BANK的函數(shù)。以下代碼是基于示例工程處理的代碼。目的是要保留當前調(diào)用其它BANK的函數(shù)之前的B—CURRENTBANK的數(shù)據(jù),以便返回時候能正確設置BSR。CLRAMOVB,BSRMOVA,#0x11MULABADDA,#0x0aMOVB—CURRENTBANK,ACLRAJMP@A+DPTR;調(diào)用BanknFunPtr所致函數(shù)POPBSR;PC—A:"POPBSR"這句話的PC指針的值,可在編譯后獲知。RET(3)在COMMON區(qū).C文件中申明void(*BanknFunPtr)();〃全局函數(shù)指針(三)可選的,在主工程應該用KEIL的配置預留出一些空間出來給補丁程序使用。在步驟2中,詳細說明如下(一)補丁工程根據(jù)補丁代碼編譯器設置原則來設置編譯器;(二)補丁工程根據(jù)變量和函數(shù)的申明以及調(diào)用方法編寫代碼;(1)主工程函數(shù)在補丁程序中的申明舉例PUBUCLEDSHINEFASTLEDSHINEFASTCODE008000HPUBLICINSERRORINSERRORCODE000C69H(2)補丁程序某.H文件申明主工程變量和函數(shù)舉例externvoid(*BanknFunPtr)();〃全局函數(shù)指針extern0』83111^1111(^,10;//需要注意的是,因為傳遞的參數(shù)不知道類型,而返回的類型也不能確認,所以,不要給這個函數(shù)傳入和傳出定義類型。externunsignedcharTestBankFuncCall—1(unsignedcharxx,unsignedintyy,intzz);externunsignedintTestBankFuncCall—2(unsignedcharxx,unsignedintyy,intzz);externunsignedlongTestBankFuncCall一3(unsignedcharxx,unsignedintyy,intzz);externvoid*TestBankFuncCall—4(unsignedcharxx,unsignedintyy,intzz);externunsignedchar*TestBankFuncCall一5(unsignedcharxx,unsignedintyy,intzz);externunsignedint*TestBankFuncCall—6(unsignedcharxx,unsignedintyy,intzz);externunsignedlong*TestBankFuncCall—7(unsignedcharxx,unsignedintyy,intzz);(3)補丁程序如何調(diào)用主工程中的其它BANK區(qū)的函數(shù)因為被調(diào)用的函數(shù)不需要傳入?yún)?shù),則傳入的三個參數(shù)默認為0,如果有超過三個參數(shù)的情況,那么對于超出的參數(shù),需要清楚函數(shù)使用的默認段來傳遞參數(shù)的地址,將需要傳遞的參數(shù)放入默認段相應的地址。補丁中函數(shù)調(diào)用主工程的BANK函數(shù)舉例如下unsignedchari;unsignedintj;unsignedlongk;void*voidptr=&i;unsignedchar*ucharptr=&i;unsignedint*uintptr=&i;unsignedlong*ulongptr=&i;BanknFunBSR=0x03;BanknFunPtr=ledshineFast;callBankFun(0,0,0);〃因為edshineFast不需要傳入?yún)?shù),默認為0,且無返回BanknFunBSR=0x01;BanknFunPtr=(void"Tes但ankFuncCa11—1;i=(unsignedchar)callBankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsignedchar類型返回BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankFuncCall—2;j=(unsignedint)cal舊ankFun(l,0x7722,Ox8855);〃函數(shù)有參數(shù)輸入,有unsignedint類型返回BanknFunBSR=0x01;BanknFunPtr=Cvoid*)TestBankFuncCall—3;k=(unsigned1ong)caBankFim(1,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsignedlong類型返回BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankfuncCall—4;voidptr=(void*)callBankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有voi^類型返回BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankFuncCall—5;ucharptr=(unsignedchar"cal舊ankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsignedchar承類型返回BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankFuncCall—6;uintptr=(unsignedint*)caUBankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsignedinf類型返回BanknFunBSR=0x01;BanknFunPtr=(void*)TestBankFuncCall—7;ulongptr=(unsignedlong*)caUBankFun(l,0x7722,0x8855);〃函數(shù)有參數(shù)輸入,有unsigned1ong承類型返回(4)補丁程序如何調(diào)用主工程中的COMMON區(qū)的函數(shù)直接調(diào)用。(5)補丁程序中變量的使用全局變量.-一類是主工程的變量被補丁函數(shù)使用,采用如下所述的申明方式來申明。舉例;DATALISTPUBLICBanknFunBSRBanknFunBSRDATA01AHPUBLICBanknFunPtrBanknFunPtrdata015h;XDATAlistPUBLICG—CurrentReponseG一CurrentReponseXDATA0000000AH使用的時候,直接引用。另一類是補丁中另外使用的全局變量,要避免和主工程相沖突,也可同后面的描述。在主工程中預留變量空間給函數(shù)變量使用為了避免補丁程序在運行時,使用的變量空間把原來主工程沒有釋放的變量空間覆蓋引起程序出錯。在主工程應該用KEIL的配置預留出一些空間出來。LX51LOCATE中RESERVE框中加上需要留出的空間。例如D:0X20-D:0X40,X:0X0000-X:0X0040等等。那么在補丁程序中就使用這些空間。(三)編譯生成HEX文件。在步驟3中,詳細說明如下(一)從編譯出的HEX文件中提取和補丁實現(xiàn)相關的HEX代碼;(二)從上述代碼的指令空間開始到結(jié)束,依次尋找是否具有MOVCA,⑥A+DPTR,MOVCA,@A+PC,MOVCA,@A+DPTR和JMP@A+DPTR指令,如果有,則補丁絕對地址分析工具終止;(三)如果沒有,將服X代碼數(shù)據(jù)按照指令的地址從小到大編排代碼,用Oxff填補補丁代碼數(shù)據(jù)間斷空間,補丁的大小等于填了0xff后補丁結(jié)束地址和補丁開始地址間代碼的字節(jié)數(shù);(四)將補丁代碼數(shù)據(jù)中LCALL/LJMP代碼后的大于等于0x8000的絕對地址找出,記錄這個地址信息相對于補丁開始指令的2字節(jié)指令偏移量;(五)將需要重新定位的地址數(shù)據(jù)用其與補丁入口地址的偏移代替,形成新的補丁純數(shù)據(jù)文件;(六)按照表2、表3和表4的結(jié)構(gòu),生成表l的數(shù)據(jù);(七)按照0TA3的要求,將各個新的補丁文件和獲取補丁信息的接口函數(shù)做成DLL文件,傳送給電信服務器。步驟5,詳細說明如下(一)當卡片接收到新的補丁信息后,在準備下載補丁的BANK內(nèi),找尋可以下載程序的連續(xù)空余地址;(二)如果滿足下載空間需求,先分析補丁文件頭信息,找出需要重新定位的指令偏移,根據(jù)指令偏移在補丁純數(shù)據(jù)塊中找到需要修改的地址信息,加上將要下載補丁的入口地址,得到新的絕對地址,然后替代原地址代碼。服務器會針對每個用戶,根據(jù)使用卡的卡商代碼和COS版本號來決定是否有需要下載的補丁,如果需要,則下載。同理,當運營商要刪除卡中的某些特定程序,可以向卡發(fā)送遠程刪除指令。對于不同的用戶,服務器根據(jù)卡商代碼和卡中現(xiàn)有的COS版本號來了解當前卡是否已經(jīng)存在相應的補丁,如果存在,則下發(fā)刪除指令。權利要求1.電信卡動態(tài)下載補丁程序方案,其特征在于有單獨的補丁絕對地址信息分析工具,分析補丁中需要重新定位的絕對地址信息,生成新的補丁文件,再通過OTA3標準規(guī)定將各補丁信息獲取的函數(shù)以及補丁形成動態(tài)鏈接庫提交給電信服務器。2.根據(jù)權利要求l所述的電信卡動態(tài)下載補丁程序方案,其特征在于COS中存在補丁管理模塊,負責新補丁中需要重新定位的絕對地址信息的替換、補丁程序的刪除、下載以及補丁入口地址的管理。3.根據(jù)權利要求l所述的電信卡動態(tài)下載補丁程序方案,其特征在于在KEIL開發(fā)平臺上,對于具有BANK切換機制的芯片,所有補丁要求設置在同一個BANK內(nèi),而補丁的編寫通過巧妙的匯編與C語言混合編程方法,實現(xiàn)BANK內(nèi)補丁函數(shù)對被打補丁工程中BANK內(nèi)的函數(shù)調(diào)用。4.根據(jù)權利要求1所述的電信卡動態(tài)下載補丁程序方案,其特征在于單獨的補丁絕對地址信息分析工具進一步包括a)提取補丁程序編譯出的HEX文件中與補丁實現(xiàn)相關的部分代碼;b)從提取出的代碼的指令空間開始到結(jié)束,依次尋找是否具有MOVCA,@A+DPTR,MOVCA,@A+PC,MOVC八,@八+0丁11和JMP②A+DPTR指令,如果有,則補丁絕對地址分析工具退出;c)將HEX文件數(shù)據(jù)按照指令的地址從小到大編排;d)將補丁代碼數(shù)據(jù)間斷空間填補Oxff;e)從經(jīng)過c)處理的補丁代碼數(shù)據(jù)的開始到結(jié)束,依次尋找LCALL和LJMP指令,如果指令后面的地址大于0x8000,則表示為需要重新定位的地址信息,將這個地址數(shù)據(jù)指令相對于補丁開始指令偏移記錄下來,并統(tǒng)計需要這樣重定位的地址的總個數(shù);f)將需要重新定位的地址數(shù)據(jù)用其與補丁入口地址的偏移代替;g)將補丁的COS版本、補丁下載成功后的COS版本、補丁程序ID、整個補丁的大小以及從e)中分析出的需要重新定位的地址相對于補丁開始指令的指令偏移形成文件頭,后面添加上經(jīng)過上述c)、d)、f)處理的補丁純數(shù)據(jù)塊,形成新的補丁文件;h)再通過OTA3標準規(guī)定將各補丁信息獲取的函數(shù)以及補丁形成動態(tài)鏈接庫提交給電信服務器。5.根據(jù)權利要求2所述的下載補丁程序方案,其特征在于COS中存在補丁管理模塊進一步包括i.COS接收到需要下載的新的全部補丁代碼后,分析該文件中補丁大小,查找芯片內(nèi)部用于下載補丁的BANK是否有足夠連續(xù)空間,如果空間不滿足要求,則不下載補丁,如果滿足,則定位將要下載補丁的空間地址,將其作為新補丁的入口地址;ii.分析補丁文件頭中補丁程序需要重新定位地址的指令偏移,將純補丁數(shù)據(jù)中的指令偏移位置對應的地址數(shù)據(jù)加上要下載補丁的空間入口地址,得到新的地址信息,實現(xiàn)重定位;iii.將需要重新定位的地址都替換成新的地址信息后,利用COS中的補丁管理模塊進行下載;iv.COS中補丁管理模塊中存在一張表,用來記錄每個補丁的新入口地址、補丁版本、補丁大小、COS版本等標志;v.下載完補丁后,更新iv中所述的表。6.根據(jù)權利要求3所述的下載補丁程序方案,其特征在于BANK內(nèi)補丁函數(shù)對被打補丁工程中BANK內(nèi)的函數(shù)調(diào)用方法進一步包括1)在KEIL開發(fā)平臺上,對于具有BANK切換機制的芯片,補丁程序一般設置在某個BANK內(nèi),通過在主工程的公共區(qū)建立一個全局函數(shù)指針、全局BSR變量和一個補丁BANK區(qū)函數(shù)調(diào)用主工程BANK區(qū)函數(shù)的接口,可以實現(xiàn)補丁BANK函數(shù)調(diào)用主工程BANK區(qū)函數(shù),該接口函數(shù)采用沒有定義傳入?yún)?shù)和返回的特殊方式來定義;2)在被打補丁的程序中利用KEIL工具配置,預留一部分補丁變量空間,包括全局變量和局部變量空間;3)對于補丁中要用到的被打補丁程序的全局變量,用PUBLIC變量名和XDATA/DATA/IDATA來定義;而補丁中要用到的被打補丁程序的函數(shù),用PUBLIC函數(shù)名和CODE來定義;4)補丁的入口地址為整段補丁程序的起始地址。全文摘要這里描述了一個電信卡動態(tài)下載補丁程序方案,方案的提出,主要是由于電信卡OTA3標準要求動態(tài)管理下載的補丁,且可把補丁放在任何地址而不影響其運行。隨著應用復雜度變高補丁不斷變大,補丁被迫使用諸如LCALL/LJMP之類涉及絕對地址的指令。當補丁下載后,由于組成補丁各函數(shù)的入口地址發(fā)生變化,因此通過LCALL/LJMP指令絕對尋址便會產(chǎn)生問題。本發(fā)明以具有BANK切換機制的芯片作為對象,借助KEIL工具軟件特殊編寫技巧,使用單獨的補丁絕對地址分析工具分析需要重新定位地址信息,利用電信卡內(nèi)的補丁管理機制,對需要重新定位的地址信息進行信息替換,從而實現(xiàn)對補丁的動態(tài)下載。文檔編號G06F11/36GK101334734SQ20071011799公開日2008年12月31日申請日期2007年6月27日優(yōu)先權日2007年6月27日發(fā)明者敏謝申請人:北京中電華大電子設計有限責任公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1