您好,登錄后才能下訂單哦!
怎么用java源代碼分析jvm.dll裝載過(guò)程,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
簡(jiǎn)述
眾所周知java.exe是java class文件的執(zhí)行程序,但實(shí)際上java.exe程序只是
一個(gè)執(zhí)行的外殼,它會(huì)裝載jvm.dll(windows下,以下皆以windows平臺(tái)為例,
linux下和solaris下其實(shí)類似,為:libjvm.so),這個(gè)動(dòng)態(tài)連接庫(kù)才是java
虛擬機(jī)的實(shí)際操作處理所在。本文探究java.exe程序是如何查找和裝載jvm.dll
動(dòng)態(tài)庫(kù),并調(diào)用它進(jìn)行class文件執(zhí)行處理的。
源代碼
主要分析的源代碼為:
j2sesrcshareinjava.c
j2sesrcwindowsinjava_md.c
java.c是什么東西
‘java程序’源代碼
所謂‘java程序’,包括jdk中的java.exejavac.exejavadoc.exe,java.c源
代碼中通過(guò)JAVA_ARGS宏來(lái)控制生成的代碼,如果該宏沒(méi)定義則編譯文件控制生
成java.exe否則編譯文件控制生成其他的‘java程序’。
比如:
j2semakejavajavacMakefile(這是javac編譯文件)中:
$(CD) ../../sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)
j2semakesunjavacjavacMakefile(由上面Makefile文件調(diào)用)中:
JAVA_ARGS = "{ "-J-ms8m", "com.sun.tools.javac.Main" }"
則由同一份java.c代碼生成的javac.exe程序就會(huì)直接調(diào)用java類方法:
com.sun.tools.javac.Main,這樣使其執(zhí)行起來(lái)就像是直接運(yùn)行的一個(gè)exe文件,
而未定義JAVA_ARGS的java.exe程序則會(huì)調(diào)用傳遞過(guò)來(lái)參數(shù)中的類方法。
從java.c的main入口函數(shù)說(shuō)起
main()函數(shù)中前面一段為重新分配參數(shù)指針的處理。
然后調(diào)用函數(shù):CreateExecutionEnvironment,該函數(shù)主要查找java運(yùn)行環(huán)境的
目錄,和jvm.dll這個(gè)虛擬機(jī)核心動(dòng)態(tài)連接庫(kù)文件路徑所在。根據(jù)操作系統(tǒng)不同,
該函數(shù)有不同實(shí)現(xiàn)版本,但大體處理邏輯相同,我們看看windows平臺(tái)該函數(shù)的處
理(j2sesrcwindowsinjava_md.c)。
CreateExecutionEnvironment函數(shù)主要分為三步處理:
a、查找jre路徑。
b、裝載jvm.cfg中指定的虛擬機(jī)動(dòng)態(tài)連接庫(kù)(jvm.dll)參數(shù)。
c、取jvm.dll文件路徑。
實(shí)現(xiàn):
a、查找jre路徑是通過(guò)java_md.c中函數(shù):GetJREPath實(shí)現(xiàn)的。
該函數(shù)首先調(diào)用GetApplicationHome函數(shù),GetApplicationHome函數(shù)調(diào)用windows
API函數(shù)GetModuleFileName取java.exe程序的絕對(duì)路徑,以我的jdk安裝路徑為例,
為:“D:javaj2sdk1.4.2_04injava.exe”,然后去掉文件名取絕對(duì)路徑為:
“D:javaj2sdk1.4.2_04in”,之后會(huì)在去掉最后一級(jí)目錄,現(xiàn)在絕對(duì)路徑為:
“D:javaj2sdk1.4.2_04”。
然后GetJREPath函數(shù)繼續(xù)判斷剛剛?cè)〉穆窂?injava.dll組合成的這個(gè)java.dll
文件是否存在,如果存在則“D:javaj2sdk1.4.2_04”為JRE路徑,否則判斷取得
的“D:javaj2sdk1.4.2_04”路徑+jreinjava.dll文件是否存在,存在則
“D:javaj2sdk1.4.2_04jre”為JRE路徑。如果上面兩種情況都不存在,則從注
冊(cè)表中去查找(參見(jiàn)函數(shù)GetPublicJREHome)。
函數(shù):GetPublicJREHome先查找
HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime EnvironmentCurrentVersion
鍵值“當(dāng)前JRE版本號(hào)”,判斷“當(dāng)前JRE版本號(hào)”是否為1.4做為版本號(hào),如果是則
取HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment“當(dāng)前JRE版本號(hào)”
JavaHome的路徑所在為JRE路徑。
我的JDK返回的JRE路徑為:“D:javaj2sdk1.4.2_04jre”。
b、裝載jvm.cfg虛擬機(jī)動(dòng)態(tài)連接庫(kù)配置文件是通過(guò)java.c中函數(shù):ReadKnownVMs實(shí)現(xiàn)
的。
該函數(shù)首先組合jvm.cfg文件的絕對(duì)路徑,JRE路徑+lib+ARCH(CPU構(gòu)架)+jvm.cfg
ARCH(CPU構(gòu)架)的判斷是通過(guò)java_md.c中GetArch函數(shù)判斷的,該函數(shù)中windows平
臺(tái)只有兩種情況:WIN64的‘ia64’,其他情況都為‘i386’。我的為i386所以jvm.cfg
文件絕對(duì)路徑為:“D:javaj2sdk1.4.2_04jrelibi386jvm.cfg”。文件內(nèi)容如
下:
## @(#)jvm.cfg 1.7 03/01/23# # Copyright 2003 Sun Microsystems, Inc. All rights reserved.# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.# # ### List of JVMs that can be used as an option to java, javac, etc.# Order is important -- first in this list is the default JVM.# NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release.## You may also select a JVM in an arbitrary location with the# "-XXaltjvm=
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。