關(guān)鍵詞:嵌入式 中間件 虛擬處理器 Intent
引言
嵌入式中間是在嵌入式應(yīng)用程序和操作系統(tǒng)、硬件平臺之間嵌入的一個中間層,通常定義成一組較為完整的、標(biāo)準(zhǔn)的應(yīng)用程序接口。它主要為嵌入式應(yīng)用軟件的開發(fā)提供跨操作系統(tǒng)和跨硬件平臺,層次化、模塊化和可擴(kuò)展的接口,同時,根據(jù)嵌入式應(yīng)用的編程特點提供必要的編程工具。
借助嵌入式中間件,應(yīng)用程序可以獨立于操作系統(tǒng)和硬件平臺,使產(chǎn)品的開放性和可移植性更強(qiáng)。有了中間件以后,應(yīng)用程序不僅可以運行于不同硬件平臺,也可以在不同的操作系統(tǒng)上運行,從而在提高開發(fā)效率、減少開發(fā)成本的同時能夠跟上技術(shù)的發(fā)展,使應(yīng)用的開發(fā)變得更加簡捷。
1 基于虛擬處理器的嵌入式中間件
1.1 虛擬處理器
可移植性通常指將某一個操作系統(tǒng)的應(yīng)用程序移植到新的平臺或處理器上。嵌入式中間件的功能是使應(yīng)用獨立于操作系統(tǒng),獨立于硬件平臺,所以要求能夠建立在不同的操作系統(tǒng)和硬件平臺上,與支持具體的應(yīng)用與平臺無關(guān)。因此,嵌入式中間件自身必須具有高度的可移植性,使它能夠被完全地移植到不同的軟硬件平臺上,包括庫以及所有其它部分。基于虛擬處理器(Virtual processor)的嵌入式中間件,通常將所的代碼編譯到一個虛擬處理器而不關(guān)心具體的目標(biāo)硬件平臺來實現(xiàn)這一特性。嵌入式中間件被設(shè)計成運行在一個虛擬的處理器上,一個理想的32位RISC(精簡指令集計算機(jī))小端(little-endian)系統(tǒng)。基于這種系統(tǒng)編寫代碼時,就像在真正的處理器上編寫一樣。當(dāng)將應(yīng)用代碼轉(zhuǎn)換成準(zhǔn)備在目標(biāo)處理器上執(zhí)行的本地代碼時,只需要一個翻譯器;因而,無論是將嵌入式中間件移植到一個新的處理器、一個新的平臺還是兼而有之,都只需要編寫不同的界面接口即可實現(xiàn)其完全的移植。
1.2 移植模型
基于虛擬處理器的嵌入式中間件自身具有完全的可移植性,能夠提供通用的驅(qū)動,支持在不同的平臺上運行。影響基于虛擬處理器的嵌入式中間件可移植性的因素可抽象為三個組件,即翻譯器、CPU隔離接口和平臺隔離接口。利用翻譯器(translator),應(yīng)用代碼可以被轉(zhuǎn)換為相應(yīng)的本地代碼而運行。翻譯器將應(yīng)用代碼映射為對等的本地代碼,包括指令選擇、寄存器分配和指令調(diào)度。由于嵌入式處理器的模式可能不同,所以嵌入式中間件應(yīng)能提供基于小端(little-endians)處理器和大端(big-endians)處理器的翻譯器,以使所有代碼和數(shù)據(jù),包括文件和網(wǎng)絡(luò)通信數(shù)據(jù),都可以在不做任何修改的情況下,從一個小端處理器的系統(tǒng)搬移到其它大端處理器的系統(tǒng)中;同時,翻譯操作可根據(jù)靜態(tài)或動態(tài)地執(zhí)行。
此外,基于虛擬處理器的嵌入式中間件的可移植性還依賴于另外兩個組件。其一是CPU隔離接口CII(CPU Isolation Interface),它將操作系統(tǒng)與處理器的細(xì)節(jié)隔離。CII包含了實現(xiàn)FIXUP(定位)操作的函數(shù)及其它與CPU相關(guān)的操作。另一個組件是平臺隔離接口PII(Platform Isolation Interface)。通過提供一個抽象的中間層,PII將操作系統(tǒng)和設(shè)備驅(qū)動程序與Platform的細(xì)節(jié)隔離。PII提供一套函數(shù),可以“虛擬地”訪問中斷、異常、內(nèi)存管理、時鐘等等。由此抽象出來的基于虛擬處理器的嵌入式中間件結(jié)構(gòu)如圖1所示。
最值得注意的就是,基于虛擬處理器的嵌入式中間件這一抽象模型的建立,可以通過PII和CII提供一種十分有效的機(jī)制,可以使中間件在“Hosted Mode(宿主模式)”下運行于操作系統(tǒng)上。運行于宿主模式的嵌入式中間件,其平臺隔離接口(PII)中部分函數(shù)的實現(xiàn),包括用于設(shè)置或訪問中斷、異常、時鐘等函數(shù),均須借助“宿主操作系統(tǒng)”提供的接口實現(xiàn)。
1.3 移植實現(xiàn)
嵌入式中間件環(huán)境的建立過程是將一個系統(tǒng)(中間件)移植到另一個系統(tǒng)——硬件平臺+實時操作系統(tǒng)的過程?;谔摂M處理器的嵌入式中間件的移植實現(xiàn)可分為兩步:①移植到一個新的處理器,需要編寫翻譯器以及CPU隔離接口CII;②移植到一個新的平臺,需要重新實現(xiàn)平臺隔離層PIL(Platform Isolation Layer)。平臺隔離層指所有的使中間件適合一個具體平臺而編寫的代碼。這一層由平臺隔離接口PII和平臺具體的設(shè)備驅(qū)動程序所組成。
1.3.1 處理器移植
處理器的移植涉及到對翻譯器、CPU隔離接口的代碼重新實現(xiàn)。
(1)翻譯器
在進(jìn)行處理移植時,真正需要實質(zhì)改變的代碼是翻譯器。不同的處理器有著特定的翻譯器。一個翻譯器可以為任一類型處理器而創(chuàng)建?;蛘呤且粋€數(shù)字信號處理器(DSP),一個微處理器或者一個微控制器。
(2)CPU隔離接口
CII是一個集合名詞。它包含在內(nèi)核和處理器之間提供接口的代碼以及搜集中間件在其上運行的處理器信息的代碼。中間件內(nèi)核自身不需重新編寫。
CII的接口包括獨立處理器指令集的接口、任務(wù)切換期間調(diào)度程序和處理器之間起中介調(diào)停作用的接口以及用于棧操作的接口等。
1.3.2 平臺移植
平臺移植需要重新實現(xiàn)平臺隔離層,包括平臺隔離接口和具體的設(shè)備驅(qū)動程序。如果支持Java語言,還須實現(xiàn)Java原始接口中。
(1)平臺隔離接口
PII是一個函數(shù)集合,允許內(nèi)核和設(shè)備驅(qū)動程序訪問硬件和軟件所提供的功能。對于內(nèi)核,PII提供了一系列函數(shù),用于系統(tǒng)啟動和關(guān)閉、分配和翻譯內(nèi)存、鎖定和解鎖內(nèi)存以及建立異常處理程序。設(shè)備驅(qū)動程序可以訪問的PII函數(shù)有:用于安裝和卸載中斷處理程序、物理地址空間和進(jìn)程地址空間的映射和解除映射、獲得邏輯地址的物理址以及調(diào)用一個宿主操作系統(tǒng)的系統(tǒng)調(diào)用等一系列函數(shù)。
(2)設(shè)備驅(qū)動程序
設(shè)備驅(qū)動程序提供廣泛的用于和硬件接服務(wù)(比如I/O端口)以及軟件服務(wù)(比如與宿主操作系統(tǒng)的運行時接口)。設(shè)備驅(qū)動程序為每個設(shè)備系列提供了應(yīng)用程序接口(API)。對于那一系列的每個設(shè)備API保持相,但是每個設(shè)備驅(qū)動程序包含了具體平臺和處理器的代碼。這樣,任何一個設(shè)備驅(qū)動程序的實現(xiàn)對應(yīng)用程序是透明的,應(yīng)用程序不用知道設(shè)備驅(qū)動程序如何提供它的服務(wù)。應(yīng)用程序要使用某個設(shè)備驅(qū)動器,必須首先安裝它。所有的應(yīng)用程序?qū)⒁粋€設(shè)備驅(qū)動程序的用加入到一個叫作裝配表的查找表u34920表中,同時有一個字與這個引用相關(guān)聯(lián)。這樣,可以編寫一個新的設(shè)備驅(qū)動程序,代替裝配表中原來的版本。只要賦予它和原來設(shè)備驅(qū)動器相同的名字,應(yīng)用程序就可以訪問它,而意思到這一變化。
(3)Java原始接口
Java原始接口JNI(Java Native Interface)是一個標(biāo)準(zhǔn)的編程接口,用來編寫Java方法以及Java應(yīng)用程序中使用Java虛擬機(jī)實現(xiàn)的原始方法庫的二進(jìn)制兼容性。JNI的實現(xiàn)首先需建立兩個.h文件:host-md.h和host-hlp.h。它們?yōu)镴NI機(jī)制提供了宿主平臺的關(guān)信息。第一個文件定義了原始的類型,比如8、16、32、64位整數(shù);第二個文件定義了一系列與OS無關(guān)的函數(shù),用來分配內(nèi)存,啟動進(jìn)程和使用互斥變量等,然后為宿主主平臺重新編譯實現(xiàn)jni.c文件。
2 Intent中間件系統(tǒng)及其移植實現(xiàn)
2.1 Intent系統(tǒng)
Intent系統(tǒng)是一個典型的基于虛擬處理器的嵌入式中間件。它是一個專為連接家庭、可移動和專業(yè)網(wǎng)絡(luò)的數(shù)字裝置設(shè)計的多媒體內(nèi)容平臺;具有功能強(qiáng)大、二進(jìn)制可移植的特性,可廣泛運行于從低功耗裝置到工作站等各種設(shè)備。Intent內(nèi)部各系統(tǒng)組伯按照可移植程度分為兩大類——可移植性強(qiáng)的組件和可移植性弱的組件。Java組件和多全庫等可移植組件組成完全可移植的Intent媒體平臺;而其它與硬件和下層宿主操作系統(tǒng)直接相關(guān)的組件,如翻譯器(translator)、設(shè)備驅(qū)動程序等,與Intern的OS核心(kernel)一起組成Intent系統(tǒng)的底層操作系統(tǒng)——elate。Intent系統(tǒng)的體系結(jié)構(gòu)如圖2所示。
Elate是一個具有可移植性的實時操作系統(tǒng),它的移植通過將所有的代碼編譯到一個虛擬處理器來實現(xiàn),而不關(guān)心具體的具體硬件平臺。Elate的核心就是這個虛擬處理器VP(Virtual Processor)。它被定義為一個32位字長,RISC(精簡指令集計算機(jī))結(jié)構(gòu)的小端系統(tǒng)?;谶@種系統(tǒng)編寫代碼時,就像在真正的處理器上編寫一樣。當(dāng)將可移植的代碼轉(zhuǎn)換成準(zhǔn)備在鞭上執(zhí)行的目標(biāo)處理器的本代碼時,只需一個翻譯器tool。Tool是elate中的概念,是用定義的虛擬處理器語言VP Code所編寫的程序,與函數(shù)或方法相類似。
與大多數(shù)操作系統(tǒng)不同,elate的絕大多數(shù)代碼了基于VP編寫的,這些代碼以靜態(tài)或運動的方式被轉(zhuǎn)換為真實處理器的本地代碼。里的“真實處理器”指令在運行elate的處理器。這便利大段的代碼在系統(tǒng)平臺間轉(zhuǎn)移成可能。Elate向Intent內(nèi)核及其它應(yīng)用提供了與CPU、外圍設(shè)備等硬件的資源接口,是Intent系統(tǒng)軟硬件的界面。
Intent系統(tǒng)可廣泛運行于數(shù)字電視機(jī)頂盒、智能手機(jī)、PDA以及其它嵌入式數(shù)字設(shè)備。以下將以數(shù)字電視機(jī)頂盒為例,介紹Intent的具體實現(xiàn)。
2.2 Intent系統(tǒng)的移植實現(xiàn)
數(shù)字電視機(jī)頂盒是一種能夠讓用戶在同有模擬電視上觀看數(shù)字電視節(jié)目,進(jìn)行交互式數(shù)字化娛樂、教育和商業(yè)化活動的消費類電子產(chǎn)品。其基本功能是接收數(shù)字電視廣播節(jié)目,時具有所有廣泛和交互式多媒體應(yīng)用的功能。機(jī)頂盒系統(tǒng)由硬件平臺和軟件系統(tǒng)組成,可將其分為4層,從底向上分別為底層硬件、實時操作系統(tǒng)平臺、中間件、應(yīng)用軟件。底層硬件提供機(jī)頂盒的硬件平臺;實時操作系統(tǒng)平臺提供操作系統(tǒng)內(nèi)核以及各種硬件驅(qū)動程序;中間件(middleware)將應(yīng)用軟件與依賴于具體的硬件平臺;應(yīng)用軟件包括本機(jī)存儲的應(yīng)用和可不載的應(yīng)用。
圖2
這里,所研發(fā)的機(jī)頂盒系統(tǒng)以PowerPC為微處理器,PSOS為實時操作系統(tǒng)平臺,Intent系統(tǒng)作為中間件層。系統(tǒng)中,PSOS操作系統(tǒng)作宿主操作系統(tǒng);Intent系統(tǒng)以寄生模式建立,通過其高效的Java虛擬機(jī)以及媒體平臺,實現(xiàn)機(jī)頂盒的交互功能。Intent的移植實現(xiàn)同樣分成兩個步驟;移植到新的處理器和移植到新的平臺。
2.2.1 移植到PowerPC
由于Intent提供了廣泛的翻譯器,用來將一個VP代碼的tool轉(zhuǎn)換成一個本地tool,因此對于系統(tǒng)翻譯器只需選擇針對PowerPC的翻譯器,同時根據(jù)PowerPC的特點,作部分修改。對Intent系統(tǒng)CII部分的移植主要包括;對獨立處理器指令集的接口tool、任務(wù)切換期間調(diào)度tool、處理器之間起中介調(diào)停作用的tool以及用于棧操作的tool進(jìn)行針對PowerPC的重新編寫,這一層的代碼涉及到指令級調(diào)用。
2.2.2 移植到具體平臺
在宿主平臺(PSOS+設(shè)備)上,Intent的PII層將和PSOS接口。宿主模式下,VP代碼編寫的tool需要調(diào)用宿主端的函數(shù),以訪問宿主的庫函數(shù)和系統(tǒng)調(diào)用,包括系統(tǒng)內(nèi)存的管理、中斷的條開關(guān)閉操作,安裝時鐘中斷等操作,均需要調(diào)用宿主操作系統(tǒng)的函數(shù)。Intent中提供的一個跨系統(tǒng)調(diào)用的機(jī)制叫作Opentool。Opentool提供了一種機(jī)制,它使Intent端的tool在不考慮calling invention等環(huán)境因素的前提下,可以調(diào)用宿主端的函數(shù),并正確地傳遞參數(shù)。反之亦然。使用這種機(jī)制。VP代碼只要像調(diào)用普通tool一樣,調(diào)用類似以下的tool:
!<platform>/<function name>!<in>!(out)
其中platform可以是任意的名字,不過一般都取為平臺的名字;function name與宿主系統(tǒng)端函數(shù)一一對應(yīng),對應(yīng)關(guān)系可改動;in、out為函數(shù)的輸入、輸出,即可實現(xiàn)Intent與PSOS的接口。不過須重新實現(xiàn)opentool.c,編寫main.c或boot.c以及重新編寫用于系統(tǒng)啟動和關(guān)閉、分配和釋放內(nèi)存、鎖定和解鎖內(nèi)存、建立異常處理程序以及用于設(shè)備驅(qū)動程序的一些接口函數(shù);同時,還須實現(xiàn)Java原始接口(JNI)。
Intent提供了通用設(shè)備驅(qū)動程序(如鍵盤、鼠標(biāo)、圖形顯示等),用于和硬件接口。因此須為每個設(shè)備選擇具體的設(shè)備驅(qū)動程序,時安裝它。對于特殊的不在Intent所提供的設(shè)備驅(qū)動程序之列的設(shè)備(如OSD),須用VP代碼實現(xiàn)其驅(qū)動程序。由于elate操作系統(tǒng)支持基于對象的編程模式,所以設(shè)備驅(qū)動程序的編寫就顯得相對容易,可以將設(shè)備驅(qū)動器作為一個對象來進(jìn)行編程。
2.2.3 生成系統(tǒng)映像
為了生成可引導(dǎo)的系統(tǒng)映像,還需建立平臺系統(tǒng)配置文件。平臺系統(tǒng)配置文件可以分成以下幾個部分:
SETUP——設(shè)置指定平臺所需的配置,包括對一些AVE(Audio Video Environment)參數(shù)的設(shè)置,或者為鍵盤等定義串行口的配置;
DEPENDS——設(shè)置依賴于應(yīng)用程序和其它區(qū)域的平臺配置的可選部分;
MEMORY——定義平臺的內(nèi)存設(shè)置,包括平臺的Boot Tools、內(nèi)存區(qū)域等。
平臺系統(tǒng)配置文件信息還包含devices.sys。它定義了平臺支持的設(shè)備。這個文件的列表由依賴于平臺的設(shè)備驅(qū)動程序和通用的elate設(shè)備驅(qū)動程序組成??梢栽贗ntent的Shell命令行中輸入sysbuild,以調(diào)用sysbuild程序來生成一個可引導(dǎo)的系統(tǒng)映像。它的命令格式如下:
sysbuild<platform><appsysfile>。
<platform>指定建立映像的運行平臺,這里為PSOS;<appsysfile>指定應(yīng)用程序的sysbuild文件,也就是所生成映像的.sys文件。所應(yīng)用程序的sys文件都應(yīng)為.sys作為擴(kuò)展名,但是在命令行中,擴(kuò)展名不必指出。
2.3 Intent系統(tǒng)的運行
Intent系統(tǒng)實際上是宿主系統(tǒng)的一個進(jìn)程,它不會取代宿主系統(tǒng)的地位。宿主系統(tǒng)會像對待普通進(jìn)程一樣,為Intent系統(tǒng)分配必要資源,包括進(jìn)程優(yōu)先級、系統(tǒng)需要的內(nèi)存空間等等。Intent系統(tǒng)作為宿主系統(tǒng)的進(jìn)程,將依照自己優(yōu)先,參與宿主系統(tǒng)的進(jìn)程調(diào)度。Intent系統(tǒng)與其它進(jìn)程一起,共享享處理器資源在內(nèi)的系統(tǒng)資源。
移植到PSOS上以后,Intent系統(tǒng)通過OSOS環(huán)境中所建立的進(jìn)程引入系統(tǒng)映像文件。一個映像文件是一個可以被下載到目標(biāo)硬件上可引導(dǎo)的Intent映像。它描述了應(yīng)用程序所需的Tool和數(shù)據(jù),同時也描述了程序如何運行。當(dāng)映像文件成功引入后,將切換到iintent系統(tǒng)的運行環(huán)境。
結(jié)語
以上介紹了基于虛擬處理器的嵌入式中間件基本概念以及其抽象模型,給出了Intent的移植實現(xiàn),對基于虛擬處理器的嵌入式中間件作為初步探討。通過虛擬處理器,使不同處理器之間的代碼快速移植成為可能。使用虛擬處理器技術(shù),進(jìn)行組件化開發(fā),使得嵌入式中間悠揚可以很方便地實現(xiàn)完全移植?;谔摂M處理器的嵌入式中間件可以適用于同軟硬件平臺;通過翻譯器、CPU隔離層和平臺隔離層,使其能夠獨立于平臺和處理器能主可移植于不同操作系統(tǒng)與不同微處理器體系結(jié)構(gòu),從而使中間件環(huán)境的建立變得更加容易,可移植性更強(qiáng)。我們相信,嵌入式中間件的廣泛使用將使嵌入式應(yīng)用也能像Java語言一樣,可在各式各樣機(jī)器、操作平臺的環(huán)境中開發(fā)應(yīng)用軟件——“一次編譯,到處運行”。