KVM(K Virtual Machine)是SUN公司的一種主要面向嵌入式設備的小型java虛擬機,在PC機上也能使用。
KVM最大的特點是極為小巧,只有一個可執行文件,大概200K多一點。相應地,KVM的功能也很弱,它只有cldc1.1的類庫,所以沒有圖形界面;它也沒有采用優化技術來提高性能,是一種比較原始的虛擬機。
正因為KVM的小巧和簡單,它是Java愛好者研究虛擬機的理想入門教材。而且它是開源的,在http://www.sun.com/software/communitysource/j2me/cldc/download.xml可以下載到。
本人目前正在對KVM進行深入研究,并愿意把所學到的內容以blog的形式發布出來與大家分享,請大家給以指點。我的MSN是 fyzhao2004@hotmail.com,希望有共同愛好的朋友能和我取得聯系,交流經驗,共同進步。
編譯過程:
以PC-linux平臺為例,編譯用的主Makefile在build/linux目錄下,在默認的情況下,只要系統中安裝有gcc,輸入make命令就可以完成編譯,并在kvm/VmUnix/build目錄下生成可執行文件kvm。Kvm本身就是完整的可執行文件,不需要依賴于其它的庫和文件。
查看build/linux目錄下的Makefile文件,可看到make會分別再到其它4個目錄中再去編譯,下面分別看每一次編譯所做的工作:
1、tools/PReverifier/build/linux/Makefile – 在tools/preverifier/build/linux目錄中有一些源文件,它們是與虛擬機相獨立的,這個Makefile的作用就是把這些源文件編譯成可執行文件preverifier,即“預驗證器”。預驗證器只能在PC平臺上工作,它的作用是完成class文件字節碼的驗證。
字節碼的驗證本來是Java虛擬機在載入類時所進行的一次安全檢查,為什么在這里,在虛擬機之外,也要進行一個驗證呢?這與KVM使用系統類庫的方式有關:
通常,虛擬機只是一個Java程序的運行框架,要使用某個類時,就從文件系統或者網絡等媒體載入,所以,配合虛擬機使用的常常要有一個類庫,用于存放系統自帶的class文件。比如在JDK的lib目錄下存放了一些jar文件,它們就會在需要的時候被裝載。
kvm是針對嵌入式設備所設計的小型虛擬機,如果再配套一個外接的類庫就會很不方便,希望類庫也能集成在可執行文件中。但Java是一種動態裝載的語言,要把類庫放到可執行文件中,就要首先反類庫“靜態化”。在靜態化的過程中,首先就要載入類,并保證字節碼的安全性,所以也要有驗證,這里生成的preverifier就是用來驗證類文件的。與虛擬中的驗證器不同的是,preverifier的輸入是類文件,輸出也是類文件,只不過輸出的類文件已經是被驗證過的了,使用時不需要再進行驗證,preverifier相當于class文件在使用之前就進行了一次驗證,所以這個驗證器被稱為“預驗證器”。
2、api/Makefile – 在api目錄下存放有cldc1.1的所有Java源文件,這個Makefile的作用首先是把Java源文件編譯成.class文件,當然這要調用本機的javac,要確保PC上安裝有JDK;編譯完成后,調用上面生成的preverifier進行預驗證,經過預驗證的class已經是安全的;接下來把class文件打包成classes.zip。
3、tools/jcc/Makefile – 這就是把類庫“靜態化”的地方,在其中會調用java命令把classes.zip里的class文件轉化成C源文件。
4、kvm/vmunix/src/Makefile – 這是最后的一步,所把有虛擬機的源文件和第3步所生成的類庫的源文件編譯并連接成可執行文件kvm。
交叉編譯要注意的問題:
如果是要在嵌入式設備上使用kvm,就會需要使用arm-linux-gcc來編譯。由以上的編譯過程可知,前三個步驟都是只能在PC上完成的,只有最后一個步驟是面向目標平臺的。所以只要修改kvm/vmunix/src/Makefile中的CC為arm-linux-gcc就可以編出可以在嵌入式設備上運行的kvm啦。
進入討論組討論。(出處:http://m.survivalescaperooms.com)
|
新聞熱點
疑難解答