當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]Java虛擬機(jī)應(yīng)用于數(shù)字電視機(jī)頂盒的研究與實(shí)現(xiàn)

摘 要:為了促使數(shù)字電視朝著基于Java虛擬機(jī)的中間件標(biāo)準(zhǔn)DVB。MHP (多媒體家庭平臺)發(fā)展,簡略介紹Java虛擬機(jī)的體系結(jié)構(gòu),從由Sun公司提供的基于Linux的J2ME到嵌入式操作系統(tǒng)OS20的移植過程,重點(diǎn)介紹Java本地方法調(diào)用的移植實(shí)現(xiàn)。實(shí)驗(yàn)證明,該方法能夠使簡單的Java程序在數(shù)字電視機(jī)頂盒上成功運(yùn)行。 
關(guān)鍵詞:Java虛擬機(jī);數(shù)字電視;連接設(shè)備配置;本地方法 

        引    言 

        隨著有線廣播電視網(wǎng)向數(shù)字化、網(wǎng)絡(luò)化、產(chǎn)業(yè)化方向發(fā)展,利用有線電視網(wǎng)絡(luò)作為傳輸平臺的數(shù)字電視機(jī)頂盒除了能夠讓用戶在現(xiàn)有模擬電視機(jī)上觀看數(shù)字電視節(jié)目之外,廣播和交互式多媒體應(yīng)用功能的要求也應(yīng)運(yùn)而生,互動電視成為數(shù)字電視發(fā)展的方向。眾多程序員熟悉的為網(wǎng)絡(luò)廣泛運(yùn)用的Java語言能很好地滿足機(jī)頂盒一些服務(wù)應(yīng)用的要求,因此提出了包含Java虛擬機(jī)的數(shù)字電視機(jī)頂盒中間件的系統(tǒng)架構(gòu),該虛擬機(jī)用來執(zhí)行Java應(yīng)用程序,并且中間件將應(yīng)用程序和底層操作系統(tǒng)、硬件細(xì)節(jié)隔離開,使上層的數(shù)字電視的服務(wù)應(yīng)用不必考慮過多的底層細(xì)節(jié)。本文主要介紹了J2ME中主要用于數(shù)字電視領(lǐng)域的CDC的移植,其中又著重介紹了本地方法(native method)的實(shí)現(xiàn)過程。 

        結(jié)構(gòu)及工作原理 

        Java虛擬機(jī)工作原理 
        Java虛擬機(jī)處于機(jī)器和編譯程序之間,在任何平臺上都提供給編譯程序一個共同的接口。Java源程序經(jīng)過編譯器編譯后變成字節(jié)碼,字節(jié)碼由虛擬機(jī)解釋執(zhí)行,虛擬機(jī)將每一條要執(zhí)行的字節(jié)碼送給解釋器,解釋器將其翻譯成特定機(jī)器上的機(jī)器碼,然后在特定的機(jī)器上運(yùn)行。

  Java虛擬機(jī)的主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。Java虛擬機(jī)包含一個類裝載器,它可以從程序和API中裝載class文件。字節(jié)碼由執(zhí)行引擎來執(zhí)行,具體過程如圖1所示。 

        圖1 Java虛擬機(jī)的工作過程 

        Java虛擬機(jī)結(jié)構(gòu) 
        類裝載器的體系結(jié)構(gòu)是Java虛擬機(jī)在安全性和網(wǎng)絡(luò)移動性上發(fā)揮重要作用的一個方面,圖中所示的類裝載器可以包含多個類裝載器的子系統(tǒng), Java應(yīng)用程序能夠在運(yùn)行時決定需要安裝的類,并且將被不同的類裝載器裝載的類存放在不同的命名空間。 

        執(zhí)行引擎處于Java虛擬機(jī)的核心位置,它的行為由指令集所決定,其主要作用就是解釋字節(jié)碼(即運(yùn)行經(jīng)過編譯后的Java程序的class文件) ,不同的執(zhí)行引擎實(shí)現(xiàn)可能非常不同。由軟件實(shí)現(xiàn)的虛擬機(jī)的執(zhí)行引擎分為一次性解釋字節(jié)碼、即時編譯器和自適應(yīng)優(yōu)化器,由硬件芯片構(gòu)成的虛擬機(jī)用本地方法執(zhí)行Java字節(jié)碼,它的執(zhí)行引擎是內(nèi)嵌在芯片里。 

        Java虛擬機(jī)相當(dāng)于一個堆棧計(jì)算機(jī),它在指令間傳送信息時不使用任何物理寄存器,而使用堆棧的幀來表示方法的狀態(tài)、字節(jié)碼的操作對象、方法的參數(shù)空間及局部變量的空間,它的“程序計(jì)數(shù)器”為一個偽寄存器,是當(dāng)前所執(zhí)行指令的字節(jié)碼數(shù)組的一個指針。 

        Java實(shí)現(xiàn)方法 
        Java有兩種實(shí)現(xiàn)方法:Java方法和本地方法。Java方法是由Java 語言編寫,編譯成字節(jié)碼,存儲在class文件中。本地方法是由其他語言(比如C,C++,或者匯編語言)編寫的,編譯成和處理器相關(guān)的機(jī)器代碼,保存在動態(tài)連接庫中,格式是各個平臺專有的,它是聯(lián)系Java程序和底層主機(jī)操作系統(tǒng)的連接方法。Java方法與平臺無關(guān),但是本地方法卻不是,運(yùn)行中的Java程序調(diào)用本地方法時,虛擬機(jī)裝載包含這個本地方法的動態(tài)庫,并調(diào)用這個方法。通過本地方法, Java程序可以直接訪問底層操作系統(tǒng)的資源,使程序和特定的平臺相關(guān),一個本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主機(jī)系統(tǒng)的任何一個Java平臺上運(yùn)行。 

        J2ME中的CDC移植的解決方案 

        我們選用的要移植的Java虛擬機(jī)是Sun公司提供的J2ME對于數(shù)字電視領(lǐng)域CDC配置,該虛擬機(jī)是針對Linux的軟件實(shí)現(xiàn)(用C語言編寫的虛擬機(jī),該虛擬機(jī)也稱為C Virtual Machine,簡稱CVM) 。Java虛擬機(jī)規(guī)范并沒有強(qiáng)求Java虛擬機(jī)必須支持任何特定的本地方法接口,但是Sun 公司提供了本地方法接口(Java Native Interface) ,是為移植所用。Java程序通過調(diào)用本地方法和主機(jī)交互。 

        Java虛擬機(jī) 

        圖2 Java虛擬機(jī)的位置 

        虛擬機(jī)處于嵌入式操作系統(tǒng)OS20 上,因此Sun公司提供的Java虛擬機(jī)中與底層操作系統(tǒng)相關(guān)的操作都應(yīng)該替換為OS20的內(nèi)核函數(shù)。因此將Sun公司提供的CDC移植到OS20需要完成一些工作,比如: C語言中關(guān)于基本數(shù)據(jù)類型的數(shù)據(jù)位的修改,關(guān)于線程的創(chuàng)建機(jī)制(OS20為任務(wù)) ,關(guān)于線程之間的同步、互斥,關(guān)于動態(tài)連接的實(shí)現(xiàn),關(guān)于本地方法的實(shí)現(xiàn)等,本節(jié)主要介紹關(guān)于本地方法的實(shí)現(xiàn)過程。 

        本地方法 
        解釋器處理字節(jié)碼時,與給定字節(jié)碼有關(guān)的動作的語義、執(zhí)行字節(jié)碼的相關(guān)動作大多是從堆棧中獲得其操作數(shù),并將其結(jié)果送回堆棧中。典型的情況下字節(jié)碼是帶有參數(shù)的,這些參數(shù)在字節(jié)碼流中緊跟在字節(jié)碼自身之后。

        在虛擬機(jī)解釋字節(jié)碼過程中,執(zhí)行引擎會不時遇到請求本地方法調(diào)用的指令,虛擬機(jī)負(fù)責(zé)試著發(fā)起這個本地方法的調(diào)用。本地方法是Java虛擬機(jī)指令集的一種可編程擴(kuò)展,運(yùn)行這個本地方法就是Java虛擬機(jī)對這條指令的執(zhí)行。 

        本地方法函數(shù)調(diào)用 
        為了增加虛擬機(jī)的性能,加快其速度,解釋器在處理一些字節(jié)碼時調(diào)用的本地方法函數(shù)用匯編實(shí)現(xiàn)了將Java棧轉(zhuǎn)換為C棧,然后在C堆棧上實(shí)現(xiàn)函數(shù)的調(diào)用。Linux下是用獨(dú)立的匯編語言程序invokeNative_i386。 S實(shí)現(xiàn)函數(shù)CVMjniInvokeNative () ,我們采用在C里面嵌入?yún)R編的形式來實(shí)現(xiàn)該函數(shù)。 

        該函數(shù)的形參有7個,完成的主要功能是將由實(shí)參傳遞來的部分?jǐn)?shù)據(jù)通過直接或者運(yùn)算后得到本地方法的參數(shù),然后壓入本地棧,通過匯編來實(shí)現(xiàn)本地的C函數(shù)調(diào)用。實(shí)參傳遞過來的7個數(shù)據(jù)包含JN I環(huán)境指針(env) 、本地方法的函數(shù)指針(native code) 、Java棧指針(args) 、本地方法的描述符(terse sig) , Java棧的參數(shù)總數(shù)(args size)表示靜態(tài)或非靜態(tài)方法的類對象標(biāo)志(class object)及用于存儲返回值的一個指針變量(return value) ,其中env要作為第一個本地方法的參數(shù)傳遞,并且native code也要傳遞到本地方法來實(shí)現(xiàn)本地方法的正確調(diào)用。 

        J2ME中的CDC移植 
        由于Linux有多個通用寄存器,在實(shí)現(xiàn)該函數(shù)的代碼中充分運(yùn)用了如esp、ebp、esi等寄存器,但是OS20提供的可操作的寄存器只有3個通用寄存器Areg、Breg、Creg和1個工作指針寄存器Wptr (相當(dāng)于堆棧指針) ,在實(shí)現(xiàn)過程中,我們用在C函數(shù)中設(shè)立局部變量來代替Linux的通用寄存器,通過手動調(diào)整工作棧指針來實(shí)現(xiàn)本地方法的調(diào)用,具體實(shí)現(xiàn)過程如圖3所示。 

        圖3 Java棧到本地棧的轉(zhuǎn)換 

        當(dāng)進(jìn)入?yún)R編函數(shù)時,工作區(qū)指針為Wptr,實(shí)參、狀態(tài)寄存器和指令指針寄存器的值全部自動入棧,然后是我們定義的代替Linux寄存器的局部變量自動入棧,此時的Wptr自動移到Wptr′,利用OS20的匯編指令,手動將實(shí)參傳遞過來的參數(shù)通過計(jì)算得到本地方法參數(shù)的個數(shù),然后將本地方法所需的參數(shù)依次壓棧,最后再手動調(diào)節(jié)工作區(qū)指針實(shí)現(xiàn)本地方法的成功調(diào)用。這里我們先將本地方法函數(shù)指針和1個標(biāo)志位flag(0x10101010)入棧,原因有兩個: 

        ①當(dāng)隨后我們手動調(diào)節(jié)工作指針Wptr′到Wptr"時,工作棧已由先前的嵌套匯編的函數(shù)進(jìn)入到了要調(diào)用的本地方法的C函數(shù),因此先前的函數(shù)的局部變量在此時無效,也就是說此時如果用以前實(shí)參傳遞過來的本地函數(shù)指針調(diào)用本地的函數(shù)肯定不會成功,因此要把這個函數(shù)指針先手動保存起來。 

        ②flag的設(shè)置的原因是:本地方法的參數(shù)的個數(shù)不是固定的,而OS20 所提供的用匯編調(diào)用函數(shù)在回到函數(shù)入口點(diǎn)時只彈出Wptr"指向的4 個單元的內(nèi)容,因此多余的參數(shù)出棧操作也必須通過調(diào)節(jié)Wptr手動完成,通過向下移動Wptr查找flag標(biāo)志,再調(diào)節(jié)Wp tr到Wtpr+2即可正確地回到匯編函數(shù)。當(dāng)本地方法的參數(shù)完全手動入棧后就可以手動調(diào)節(jié)工作區(qū)指針Wptr而進(jìn)入到調(diào)用的本地函數(shù),函數(shù)返回后的第一件事是保存在寄存器中的函數(shù)的返回值到return value,恢復(fù)工作區(qū)指針Wptr,并將本地方法的返回值類型作為嵌入?yún)R編的函數(shù)的返回值,此時就完成了由Java棧到C棧的轉(zhuǎn)換,并成功調(diào)用本地方法。 

         結(jié)    論 

        通過對Sun公司下載的CDC代碼的修改與編寫,對CDC中的加載的類做了一些裁減,并且將線程化的解釋器改為一次性解釋字節(jié)碼的單線程解釋器簡化程序,成功地生成了在機(jī)頂盒上可以運(yùn)行簡單的Java程序的虛擬機(jī)
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉