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