專利名稱:一種非解釋型的動(dòng)態(tài)下載運(yùn)行方法
技術(shù)領(lǐng)域:
本發(fā)明涉及程序運(yùn)行,更具體地說,涉及一種非解釋型的動(dòng)態(tài)下載運(yùn)行方法。
背景技術(shù):
在很多時(shí)候,需要?jiǎng)討B(tài)下載程序并進(jìn)行運(yùn)行,例如從TS流中或者從網(wǎng)絡(luò)上下載一個(gè)游戲程序到機(jī)頂盒中進(jìn)行運(yùn)行。這種需求在支持多進(jìn)程調(diào)度的操作系統(tǒng)上,可以把游戲獨(dú)立開發(fā)成一個(gè)可運(yùn)行文件,把其下載到設(shè)備中后當(dāng)作一個(gè)新進(jìn)程進(jìn)行調(diào)度執(zhí)行就可實(shí)現(xiàn)。然而對(duì)于相當(dāng)部分不支持多進(jìn)程調(diào)度的嵌入式操作系統(tǒng), 一般只有使用解釋器來解釋運(yùn)行,例如Java虛擬機(jī)或JavaScript解釋器。然而,這種方法存在著成本高、效率低的缺點(diǎn)。 嵌入式系統(tǒng)由于其短小精悍,一般不支持多進(jìn)程調(diào)度,而是采用單進(jìn)程多線程的模式來進(jìn)行多任務(wù)工作。這樣在單進(jìn)程運(yùn)行過程中,在不中斷現(xiàn)有進(jìn)程運(yùn)行的情況下,就無法對(duì)下載得到的程序進(jìn)行調(diào)度而使其運(yùn)行起來。已有技術(shù)解決動(dòng)態(tài)程序運(yùn)行的方法有如下兩種 1、使用多個(gè)獨(dú)立運(yùn)行的系統(tǒng)來實(shí)現(xiàn)該功能,即整個(gè)系統(tǒng)中存在多個(gè)獨(dú)立運(yùn)行系統(tǒng),在A系統(tǒng)中下載代碼到特定位置構(gòu)成B系統(tǒng),然后終止A系統(tǒng)啟動(dòng)B系統(tǒng)運(yùn)行。這樣就實(shí)現(xiàn)了程序動(dòng)態(tài)下載運(yùn)行了。這里下載而來的程序不能當(dāng)作原來程序的一個(gè)部件運(yùn)行,而是和原來程序平級(jí)關(guān)系,只能用其完全替換原來程序運(yùn)行。 2、開發(fā)的程序代碼需要在特定虛擬機(jī)或解釋器上運(yùn)行,這就必須在原有系統(tǒng)中嵌入虛擬機(jī)或解釋器,在下載下來后要運(yùn)行時(shí),由虛擬機(jī)或解釋器對(duì)程序進(jìn)行翻譯解釋運(yùn)行,這是目前動(dòng)態(tài)下載游戲運(yùn)行所使用的唯一方法。
然而,以上兩種方法都存在各自的缺點(diǎn) 1、對(duì)于第一種,每個(gè)下載來的程序是個(gè)完整獨(dú)立的進(jìn)程代碼,這樣就存在著大量的重復(fù)代碼(如硬件驅(qū)動(dòng)代碼等),這大大提高了對(duì)程序存儲(chǔ)器空間的要求。而且各個(gè)程序不能并行運(yùn)行,A程序在運(yùn)行B程序就無法運(yùn)行,這樣許多功能是無法通過這種方式來實(shí)現(xiàn)。比如游戲的下載運(yùn)行,用戶一般是需要在看電視時(shí)通過選擇需要下載的游戲來進(jìn)行下載,下載完后能不影響繼續(xù)看電視而啟動(dòng)游戲運(yùn)行。這里由于需要把游戲運(yùn)行當(dāng)作原來程序的一個(gè)部件(或者一個(gè)線程)運(yùn)行才能實(shí)現(xiàn),原來程序仍然運(yùn)行實(shí)現(xiàn)播發(fā)節(jié)目功能的同時(shí),游戲線程啟動(dòng)游戲運(yùn)行。 2,對(duì)于第二種,把虛擬機(jī)當(dāng)作原來程序的一個(gè)線程在后臺(tái)運(yùn)行,當(dāng)有需要時(shí)就對(duì)下載來的游戲數(shù)據(jù)進(jìn)行解釋運(yùn)行。它具有通用性強(qiáng)的特點(diǎn),卻存在著很大的缺陷第一就是運(yùn)行效率低下,第二就是虛擬機(jī)或者解釋器本身代碼量巨大,而大大增大了代碼空間,第三是如果重頭開發(fā)游戲運(yùn)行描述方法進(jìn)而開發(fā)相應(yīng)的虛擬機(jī)或者解釋器,難度太大成本太高;而使用現(xiàn)有的Java和JavaScript等解釋器技術(shù)又面臨著大量專利或版權(quán)問題,需要交納大量授權(quán)使用費(fèi),大大提高了產(chǎn)品成本。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題在于,針對(duì)現(xiàn)有技術(shù)的上述下載的程序不能并行運(yùn)行以
及需要特定的解釋器來運(yùn)行的缺陷,提供一種非解釋型的動(dòng)態(tài)下載運(yùn)行方法。 本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是構(gòu)造一種非解釋型的動(dòng)態(tài)下載運(yùn)行
方法,包括以下步驟 Sl、使預(yù)定程序作為主程序的一個(gè)線程運(yùn)行,并定義一個(gè)函數(shù)指針作為預(yù)定程序 的任務(wù)入口函數(shù); S2、從對(duì)主程序進(jìn)行編譯聯(lián)接時(shí)形成的各函數(shù)地址分配文件中,獲取可能需要調(diào) 用的各驅(qū)動(dòng)函數(shù)所在地址; S3、基于預(yù)定程序的驅(qū)動(dòng)函數(shù)類型,定義相應(yīng)的驅(qū)動(dòng)函數(shù)指針,加入各設(shè)備的初始 化函數(shù)及驅(qū)動(dòng)函數(shù),組成完整的預(yù)定程序代碼進(jìn)行測試; S4、刪除各設(shè)備的初始化函數(shù)及驅(qū)動(dòng)函數(shù),將預(yù)定程序中的驅(qū)動(dòng)函數(shù)指針初始值 設(shè)置成對(duì)應(yīng)驅(qū)動(dòng)函數(shù)的地址; S5、進(jìn)行預(yù)定程序代碼部分的編譯聯(lián)接,正確配置編譯聯(lián)接參數(shù),使生成的主代碼 和預(yù)定程序代碼在地址上沒有重疊區(qū)域; S6、將預(yù)定程序代碼的起始放置地址、主函數(shù)入口地址和必要信息以及完整的預(yù) 定程序目標(biāo)代碼打包; S7、下載打包的文件后,提取起始放置地址和預(yù)定主函數(shù)入口地址,將預(yù)定程序代
碼旋轉(zhuǎn)到指定的內(nèi)存地址上,啟動(dòng)預(yù)定程序的線程來運(yùn)行下載的預(yù)定程序。 在本發(fā)明所述的動(dòng)態(tài)下載運(yùn)行方法中,所述驅(qū)動(dòng)函數(shù)的地址是整數(shù)值。 在本發(fā)明所述的動(dòng)態(tài)下載運(yùn)行方法中,所述預(yù)定程序的起始放置地址和主函數(shù)入
口地址是從預(yù)定程序代碼的各函數(shù)地址分配文件中獲取的。 在本發(fā)明所述的動(dòng)態(tài)下載運(yùn)行方法中,所述預(yù)定程序是運(yùn)行過程中要調(diào)用到系統(tǒng) 硬件資源的程序,或者是要調(diào)用到底層驅(qū)動(dòng)的程序。 在本發(fā)明所述的動(dòng)態(tài)下載運(yùn)行方法中,所述預(yù)定程序?yàn)橛螒虺绦颉?實(shí)施本發(fā)明的非解釋型的動(dòng)態(tài)下載運(yùn)行方法,具有以下有益效果本發(fā)明使預(yù)定
程序能直接獲得各底層設(shè)備的驅(qū)動(dòng)函數(shù)地址,不再需要設(shè)備初始化過程直接調(diào)用驅(qū)動(dòng)函數(shù)
地址,從而使下載的預(yù)定程序作為原程序的一個(gè)部件或進(jìn)程直接運(yùn)行。
下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明,附圖中 圖1是本發(fā)明的非解釋型的動(dòng)態(tài)下載運(yùn)行方法的一個(gè)實(shí)施例的流程圖。
具體實(shí)施例方式
為了使本發(fā)明所要解決的技術(shù)問題、技術(shù)方案及有益效果更加清楚明白,以下結(jié)
合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用 以解釋本發(fā)明,并不用于限定本發(fā)明。 下載運(yùn)行可直接運(yùn)行的代碼,具有代碼量少、運(yùn)行效率高等特點(diǎn)。通過分析現(xiàn)有技 術(shù),在此以游戲?yàn)槔?,可以把游戲部分代碼編譯聯(lián)接成可直接運(yùn)行的目標(biāo)代碼。本發(fā)明的核心恩在于,使預(yù)定程序能直接獲得各底層設(shè)備的驅(qū)動(dòng)函數(shù)地址,不再需要設(shè)備初始化過程直接調(diào)用驅(qū)動(dòng)函數(shù)地址,從而使下載的預(yù)定程序作為原程序的一個(gè)部件或進(jìn)程直接運(yùn)行。
游戲程序代碼除了游戲算法代碼外,還需要調(diào)用必要的底層驅(qū)動(dòng)函數(shù),如需調(diào)用遙控器按鍵信息獲得函數(shù)來獲得用戶當(dāng)前選擇操作信息,如調(diào)用顯示設(shè)備的各種顯示畫圖驅(qū)動(dòng)函數(shù)來把游戲各界面呈現(xiàn)給用戶。 如果游戲程序不包含這些函數(shù),那么就無法獲得各函數(shù)代碼地址而進(jìn)行調(diào)用,實(shí)際上在編譯過程就會(huì)因?yàn)槿鄙俜?hào)而編譯不過。把這些函數(shù)加入到游戲程序中,顯然這些設(shè)備的初始化函數(shù)也必須加入到游戲程序中。依此類推,這樣就形成了一個(gè)完整獨(dú)立的代碼系統(tǒng)了,由于各設(shè)備初始過程不能被調(diào)用兩次,這樣就必然無法兩個(gè)程序同時(shí)平行運(yùn)行。
分析整個(gè)過程,主程序代碼已存在了各底層設(shè)備驅(qū)動(dòng)函數(shù),并且是經(jīng)過正確初始化過程可以直接調(diào)用的,如果游戲程序中能獲得這些驅(qū)動(dòng)函數(shù)地址,那么就可以不再需要設(shè)備初始化過程而直接調(diào)用了 。
圖1是本發(fā)明的非解釋型的動(dòng)態(tài)下載運(yùn)行方法的一個(gè)實(shí)施例的流程圖。 在步驟101,在開發(fā)主程序時(shí),設(shè)計(jì)預(yù)定程序作為其一個(gè)線程(任務(wù)或組件)運(yùn)行,
再定義一個(gè)函數(shù)指針變量作為任務(wù)入口函數(shù),以后運(yùn)行的游戲就是該函數(shù)指針?biāo)赶虻拇a。 在步驟102,在開發(fā)完主程序后,進(jìn)行編譯聯(lián)接時(shí),查看形成的各函數(shù)地址分配文件(即map文件,各嵌入式編譯工具都提供該功能),記錄下游戲可能需要調(diào)用的各驅(qū)動(dòng)函數(shù)所在地址。 在步驟103,在游戲部分開發(fā)時(shí),就其所需的各驅(qū)動(dòng)函數(shù),按各自函數(shù)類型定義相應(yīng)的驅(qū)動(dòng)函數(shù)指針,再加入各設(shè)備初始化函數(shù)、驅(qū)動(dòng)函數(shù)等等形成一個(gè)完整的游戲程序代碼。并使各驅(qū)動(dòng)函數(shù)指針指向相應(yīng)的驅(qū)動(dòng)函數(shù),在游戲代碼中通過各驅(qū)動(dòng)函數(shù)指針來調(diào)用所需驅(qū)動(dòng)函數(shù),這樣可進(jìn)行游戲部分的正常開發(fā)測試。 在步驟104,開發(fā)測試游戲部分代碼正確無誤后,把其中的各設(shè)備初始化函數(shù)及其驅(qū)動(dòng)函數(shù)等代碼全部刪除,查看其所要下載到的主程序的函數(shù)地址分配文件(即map文件),找到所需的各驅(qū)動(dòng)函數(shù)地址(該驅(qū)動(dòng)函數(shù)地址是一個(gè)整數(shù)值),然后把游戲中各對(duì)應(yīng)的驅(qū)動(dòng)函數(shù)指針初始值設(shè)置成各對(duì)應(yīng)驅(qū)動(dòng)函數(shù)的地址。 在步驟105,進(jìn)行對(duì)游戲代碼部分的編譯聯(lián)接,在此過程中正確配置編譯聯(lián)接參數(shù),使生成的主代碼和游戲代碼在地址上沒有重疊區(qū)域。 在步驟106,通過查看游戲代碼的函數(shù)地址分配文件,獲得游戲代碼的起始放置地址和游戲主函數(shù)的入口地址,然后把這兩種信息和游戲名稱等必要信息和完整游戲目標(biāo)代碼打包,這樣就可以提供下載了 。 在步驟107,主程序下載下了游戲數(shù)據(jù)包后,從中取出起始放置地址和游戲主函數(shù)入口地址,把該游戲代碼放置到指定的內(nèi)存地址上,函數(shù)指針變量指向游戲主函數(shù)入口地址,這樣啟動(dòng)游戲任務(wù)就可以運(yùn)行下載的游戲了 。 通過以上步驟,下載下來可直接運(yùn)行的游戲代碼就作為原程序的一個(gè)部件(線程)運(yùn)行,而不再需要額外的解釋器來解釋運(yùn)行。以上實(shí)施例僅使用游戲程序作為示例性描述,所述預(yù)定程序包括并不限于游戲程序,能動(dòng)態(tài)下載運(yùn)行的并不單單是游戲,包括運(yùn)行過程中要調(diào)用到系統(tǒng)硬件資源的程序,即要調(diào)用到底層驅(qū)動(dòng)的程序。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡是本發(fā)明的精 神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
一種非解釋型的動(dòng)態(tài)下載運(yùn)行方法,其特征在于,包括以下步驟S1、使預(yù)定程序作為主程序的一個(gè)線程運(yùn)行,并定義一個(gè)函數(shù)指針作為預(yù)定程序的任務(wù)入口函數(shù);S2、從對(duì)主程序進(jìn)行編譯聯(lián)接時(shí)形成的各函數(shù)地址分配文件中,獲取可能需要調(diào)用的各驅(qū)動(dòng)函數(shù)所在地址;S3、基于預(yù)定程序的驅(qū)動(dòng)函數(shù)類型,定義相應(yīng)的驅(qū)動(dòng)函數(shù)指針,加入各設(shè)備的初始化函數(shù)及驅(qū)動(dòng)函數(shù),組成完整的預(yù)定程序代碼進(jìn)行測試;S4、刪除各設(shè)備的初始化函數(shù)及驅(qū)動(dòng)函數(shù),將預(yù)定程序中的驅(qū)動(dòng)函數(shù)指針初始值設(shè)置成對(duì)應(yīng)驅(qū)動(dòng)函數(shù)的地址;S5、進(jìn)行預(yù)定程序代碼部分的編譯聯(lián)接,正確配置編譯聯(lián)接參數(shù),使生成的主代碼和預(yù)定程序代碼在地址上沒有重疊區(qū)域;S6、將預(yù)定程序代碼的起始放置地址、主函數(shù)入口地址和必要信息以及完整的預(yù)定程序目標(biāo)代碼打包;S7、下載打包的文件后,提取起始放置地址和預(yù)定主函數(shù)入口地址,將預(yù)定程序代碼旋轉(zhuǎn)到指定的內(nèi)存地址上,啟動(dòng)預(yù)定程序的線程來運(yùn)行下載的預(yù)定程序。
2. 根據(jù)權(quán)利要求1所述的動(dòng)態(tài)下載運(yùn)行方法,其特征在于,所述驅(qū)動(dòng)函數(shù)的地址是整 數(shù)值。
3. 根據(jù)權(quán)利要求1所述的動(dòng)態(tài)下載運(yùn)行方法,其特征在于,所述預(yù)定程序的起始放置 地址和主函數(shù)入口地址是從預(yù)定程序代碼的各函數(shù)地址分配文件中獲取的。
4. 根據(jù)權(quán)利要求1至3任一所述的動(dòng)態(tài)下載運(yùn)行方法,其特征在于,所述預(yù)定程序是運(yùn) 行過程中要調(diào)用到系統(tǒng)硬件資源的程序,或者是要調(diào)用到底層驅(qū)動(dòng)的程序。
5. 根據(jù)權(quán)利要求4所述的動(dòng)態(tài)下載運(yùn)行方法,其特征在于,所述預(yù)定程序?yàn)橛螒虺绦颉?br>
全文摘要
本發(fā)明涉及一種非解釋型的動(dòng)態(tài)下載運(yùn)行方法,該方法包括定義一個(gè)函數(shù)指針作為預(yù)定程序的任務(wù)入口函數(shù)、以及將預(yù)定程序中的驅(qū)動(dòng)函數(shù)指針初始值設(shè)置成對(duì)應(yīng)驅(qū)動(dòng)函數(shù)的地址等步驟。本發(fā)明使預(yù)定程序能直接獲得各底層設(shè)備的驅(qū)動(dòng)函數(shù)地址,不再需要設(shè)備初始化過程直接調(diào)用驅(qū)動(dòng)函數(shù)地址,從而使下載的預(yù)定程序作為原程序的一個(gè)部件或進(jìn)程直接運(yùn)行。
文檔編號(hào)G06F9/46GK101739288SQ200810217810
公開日2010年6月16日 申請(qǐng)日期2008年11月18日 優(yōu)先權(quán)日2008年11月18日
發(fā)明者彭文劍 申請(qǐng)人:康佳集團(tuán)股份有限公司