重新編譯虛擬機
㈠ 如何在centos6.5的kvm虛擬機中永久激活windows2008
一、激活原理
目前激活Windows7/Windows2008的各種方法充斥互聯網,但公認比較完美的激活方式是將品牌機(例如DELL、LENOVO等)的SLIC信息表刷寫進需要安裝Windows系統的計算機BIOS中,將該計算機「模擬」為品牌機,然後安裝微軟的OEM版Windows7/Windows2008並自動激活。
相信喜歡搞破解的童鞋都應該知道其中的奧秘,微軟和PC廠商為了減輕對於操作系統的激活負荷,對大多數品牌機實行了有別於聯網激活的「SLIC激活機制」:當Windows操作系統啟動時,就會自行讀取本機BIOS中的SLIC信息表,以及操作系統的「OEM密鑰」和「OEM證書」,如果三者完全吻合、驗證一致,Windows7/Windows2008系統就會被識別為自動激活的OEM版本。
筆者研究發現,Windows2012(注意不是Windows2012_R2,下同)與以往激活Windows7/Windows2008的方式類似,依然可以採用刷寫BIOS中SLIC信息表安裝OEM版系統的方式實現永久激活,只不過激活Windows2012需要SLIC2.2版,經測試SLIC2.2能夠向下兼容SLIC2.1/2.0。
眾所周知,虛擬機軟體也是有BIOS的,目前市場上常見的虛擬機軟體,如VMware、Xen、Kvm等均通過軟體模擬的方式「模擬」硬體BIOS。既然可以採用刷寫計算機硬體BIOS的方式實現永久激活,那麼如果能夠將SLIC2.2信息表通過軟體再編譯方式「灌入」虛擬機的BIOS中,然後再安裝Windows2012的OEM版本,不就可以與刷寫BIOS硬體實現自動激活「異曲同工」了嗎?
二、核心問題
激活原理已經非常明確了,現在的關鍵問題是如何重新編譯Linux虛擬機的問題了,這涉及Linux內核的重新編譯,一些菜鳥可能望而生畏,盡管編譯 Linux全部內核確實需要較高的技術水平,但重新編譯Linux的BIOS難度並不高,初學者也可以輕松實現。本文以Linux的常見版本CentOs6.5為例,詳細講解重新編譯KVM虛擬機BIOS的步驟。本文的方法同樣適用Ubuntu等 Linux版本。
CentOs6.5虛擬機KVM的BIOS實際是一個二進制的可執行文件,默認安裝路徑為/usr/share/seabios/bios.bin。筆者研究發現,KVM虛擬機BIOS使用的是開源軟體 seabios,該軟體的源代碼可以在互聯網上找到,開源組織也製作了為seabios軟體增加相應SLIC信息表的補丁包,下載seabios的源代碼並打上該補丁包,然後重新編譯並替換Linux默認的bios.bin文件,就可以將虛擬機「模擬」為品牌機,然後自動激活OEM版的Windows2012系統了,這種激活方式是永久激活,激活後的Windows2012可以打上微軟的後續補丁且絕對不會被封殺。
三、詳細步驟
1.獲取SLIC2.2信息表。當前SLIC2.1的信息表網上很容易找到,SLIC2.2的信息表不多,比較容易找到的是DELL 版的SLIC2.2信息表。當然也可以找一台預裝了Windows2012的品牌機(市面上比較常見的是DELL的機器),然後使用SLIC_Toolkit3.2工具導出該機器的SLIC表。SLIC2.1/2.2表為二進制文件,長度均為374位元組(這一點一定要注意)。
2.安裝CentOs6.5_x64版操作系統。記得把gcc安裝上,然後將上一步已經獲取的SLIC2.2表拷貝在/ opt目錄中(假定文件名稱為DELL_SLIC2.2.BIN)。
3.在root用戶下安裝git,、iasl及所有依賴包。
#yum install git
#yum install iasl //這是必須安裝的包
4.使用git獲取sealic項目的源碼。
# mkdir bios //目錄可以自己隨便建
#cd bios
#git clone git://github.com/ghuntley/seaslic //獲取源代碼
#ls -ls
Seaslic //用git軟體獲取源代碼後會有多出一個目錄
# cd seaslic
#ls
patch.sh README.markdown seabios.patch seabios.submole
//該目錄共包含三個文件和一個子目錄,其中子目錄seabios.submole需要刪除掉,用我們後面下載的內容重建。
#rm -rf seabios.submole
5.從地址code.coreboot.org/p/seabios下載的SeaBios的源碼並解壓。注意源代碼一定要下載1.7.3.2版本的,這一點也很關鍵,千萬不能搞錯了。
#tar xzvf seabios-1.7.3.2.tar.gz 解壓在/bios目錄下。
6.重建seabios.submole
#cd /bios
# cp –r seabios-1.7.3.2 seaslic/seabios.submole
# cd seaslic
# ls
patch.sh README.markdown seabios.patch seabios.submole
進入我們重建的seabios.submole目錄,可以發現有bios的源代碼存在:
# cd seabios.submole
# ls
COPYING COPYING.LESSER Makefile README README.CSM src TODO tools vgasrc
# cd src
可以發現seabios的源代碼,我們需要重新編譯這些源代碼,生成新的bios.bin 文件,用於替代CentOs6.5系統自帶的bios.bin。
7.查看/bios/seaslic /patch.sh文件。這是一個批處理文件,只有2行有用。用Linux的命令方式執行,為防止輸入錯誤,最好從patch.sh中復制粘貼後在root用戶下執行:
①將SLIC2.2文件轉換為C語言包含文件格式(acpi-slic.hex)的命令:
#xxd -i /opt/DELL_SLIC2.2.BIN | grep -v -E "len "| sed 's/unsigned char.*/static char SLIC[] = {/' > seabios.submole/src/acpi-slic.hex
說明:這條命令執行後將會把SLIC2.2表(即/opt/DELL_SLIC2.2.BIN文件)轉換為C語言包含文件格式(文件名../src/acpi-slic.hex),並以數組形式存在。這一步非常非常關鍵,轉換完成的acpi-slic.hex文件應為2333位元組。如果本條命令執行不成功的話,編譯出來的bios.bin文件不會包含SLIC2.2信息,也就無法實現激活了。
②為acpi.c 文件打補丁的命令:
# cd /bios/seaslic /seabios.submole
#patch -p1 < ../seabios.patch
說明:這條語句執行後將給../ src/acpi.c 文件打上補丁,執行後系統將會提示:
Hunk #1 succeeded at 20 with fuzz 2 (offset -194 lines).
Hunk #2 succeeded at 37 with fuzz 2 (offset -194 lines).
Hunk #3 succeeded at 631 with fuzz 2 (offset -205 lines).
注意:至此我們的准備工作已經全部完成了,下面將重新編譯生成新的bios了。
8.重新編譯生成bios.bin文件
# cd /bios/seaslic /seabios.submole
#make //編譯需要花幾十秒鍾吧,應提示無錯誤、無警告,否則可能需要仔細檢查以上步驟。
查看..seabios.submole/out/bios.bin
看到最後生成的結果了吧,會在..seabios.submole/out/中多出一個bios.bin文件,這個文件就是我們重新編譯生成的虛擬機的bios,將用來替換KVM的系統原有的bios.bin文件。
說明:這里編譯生成bios.bin文件包含有DELL品牌機的SLIC2.2,可以激活DELL的Windows2012_OEM版。同理,我們只要找到其他品牌機的SLIC2.2信息表,重新編譯後就可以安裝激活其他品牌機的OEM版Windows7/2008/2012(SLIC2.1隻能支持Vista/Win7/2008,不支持 Win2012;SLIC2.2則支持XP/Vista以及Win2008/2012並兼容SLIC2.1),與刷寫計算機硬體BIOS實現自動激活的方式相比,採用這種方式激活Windows的風險為零,非常適合批量激活虛擬機的Windows2008/Windows2012。
9.替換CentOs6.5系統默認的bios.bin文件
# cp out/bios.bin /usr/share/seabios/bios.bin
#reboot //重新啟動一下宿主機,然後再重新啟動Windows虛擬機,在啟動KVM虛擬機的時候,可以發現虛擬機的bios 已經更新為最新版本了。
10.激活windows2012
至此KVM虛擬機的bios已經重新配置完成,在KVM中啟動WINDOWS客戶機,然後利用SLIC_Toolkit3.2工具檢查SLIC,會發現你的SLIC信息已經獲取成功,如果你安裝的是OEM版本的 Win2008/2012的話,無需輸入key和證書就能自動激活。你可以從網上網路如下OEM鏡像(我已試驗過可自動激活):
(1)Lenovo的OEM版Windows2008_R2鏡像:
Windows_Server-2008_R2_ENT_OEM.iso或者
Win_Server_08_R2_SP1_33in1.iso
(2)Dell的OEM版Windows2012鏡像:
Ser2012_ST_DA_OEM.iso
(3)如果你手上暫時沒有OEM版的話,也不要緊,可以用slmgr命令手工增加證書及OEM序列號也可以激活Windows2008/20012。直接用管理員身份進入命令行模式:
①slmgr -ilc DELL2.2.XRM-MS //這里找到的是DELL計算機的Windows2012版OEM證書。
②接下來就是寫入注冊號了:
slmgr -ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
說明:下面是我從網上找到的 OEM版序列號(經測試可以激活):
Windows Server 2012 Standard DELL OEM KEY
2G9DG-XKFR6-VG8D3-DN9T9-CDG98
Windows Server 2012 Datacenter DELL OEM KEY
2BVGY-TNRWK-6927W-866R9-66J3H
Windows Server 2008 R2 Standard DELL OEM KEY
D7TCH-6P8JP-KRG4P-VJKYY-P9GFF
Windows Server 2008 R2 Enterprise DELL OEM KEY
BKCJJ-J6G9Y-4P7YF-8D4J7-7TCWD
③執行slmgr –dlv //顯示全部激活信息
④執行slmgr -xpr //顯示Windows2008/2012已經永久激活。
㈡ java虛擬機版本過低
1、重新安裝較高版本的虛擬機。
2、使用早期版本的JDK重新編譯源代碼。虛擬機是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。
㈢ 在虛擬機內安裝了gcc編譯器後,重新啟動了本機。在打開虛擬機,安裝的文件在次消失,就像安裝了還原卡。
虛擬機問題,重裝虛擬機,這是虛擬機沒有保存數據,或者你創建安裝系統的路徑下不可寫造成的
㈣ windows安裝銀河麒麟虛擬機編譯不了
您好,在安裝銀河麒麟虛擬機時出現編譯不了的問題,可能是由於您的電腦系統不兼容造成的,首先您可以檢查一下您的電腦是否滿足虛擬機的安裝要求,比如操作系統,處理器,內存等,如果滿足,您可以嘗試重新安裝,或者更新您的操作系統,以確保虛擬機能夠正常運行。如果以上方法都不能解決您的問題,您可以嘗試更換虛擬機,或者聯系虛擬機的技術支持,以獲得更多幫助。
㈤ 什麼是虛擬機,要怎麼用
分類: 電腦/網路 >> 軟體
問題描述:
有什麼好的軟體來用?
解析:
什麼是虛擬機?
虛擬機的概念比較寬泛,通常人們接觸到的虛擬機概念有VMware那樣的硬體模擬軟體,也有JVM這樣的介於硬體和編譯程序之間的軟體。這里所指的是後者。
虛擬機是一個抽象的計算機,和實際的計算機一樣,具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。
Java虛擬機
一、什麼是Java虛擬機
Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。
2.誰需要了解Java虛擬機
Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。
3.Java虛擬機支持的數據類型
Java虛擬機支持Java語言的基本數據類型如下:
byte1位元組有符號整數的補碼
short2位元組有符號整數的補碼
int4位元組有符號整數的補碼
long8位元組有符號整數的補碼
float4位元組IEEE754單精度浮點數
double8位元組IEEE754雙精度浮點數
char2位元組無符號Unicode字元
幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬體標記。操作這些原始數據類型數據的位元組碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:
object對一個Javaobject(對象)的4位元組引用
returnAddress4位元組,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當作object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可
移植性。
二、Java虛擬機體系結構
Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。
1.Java指令集
Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。
虛擬機的內層循環的執行過程如下:
do{
取一個操作符位元組;
根據操作符的值執行一個動作;
}while(程序未結束)
由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:
第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。
2.寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。
Java虛擬機的寄存器有四種:
pc:Java程序計數器。
optop:指向操作數棧頂端的指針。
frame:指向當前執行方法的執行環境的指針。
vars:指向當前執行方法的局部變數區第一個變數的指針。
Java虛擬機
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。
(1)局部變數區 每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的。虛擬機提供了把局部變數中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變數的指令。
(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
·動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。
·正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。
·異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用
·程序使用了throw語句。
當異常發生時,Java虛擬機採取如下措施:
·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。
·由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。
(3)操作數棧區 機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。
每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數操作(操作符pe和swap),用於對運行時數據區進行操作時是不考慮類型的。
4.無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。
5.方法區
方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。
㈥ 虛擬機是干什麼使的
是虛擬出來的一台計算機,硬碟是分享驅動盤,虛擬機的一切做法就和一台真的電腦一樣,首先得安裝系統,驅動程序等,才可以用的,對學習計算機很有幫助的。
通過虛擬機,可以在一台計算機上同時運行多個(種)操作系統。
便於測試應用程序、操作系統、網路部署等等。通過虛擬機,可以在一台物理計算機上輕松的完成多種環境下的應用程序、操作系統的測試。
也可以模擬多台計算機組成的網路,從而完成各種網路部署的測試。
(6)重新編譯虛擬機擴展閱讀:
虛擬機(VirtualMachine)指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。
即使VirtualPC的兼容性很高,但不是所有軟體都能在VirtualPC中正常地運行,因為那些軟體可能使用一些未公開的硬體或使用一些不支援的指令。一些人或組織藉此貶低他。
比如,在VirtualPC2004SP1中,如果有列印機使用LPT1埠,則虛擬機不能識別。這個漏洞在VirtualPC2007中得到改善。
蘋果麥金塔電腦版本的VirtualPC用動態重新編譯轉換x86的機械碼至相等的PowerPC機械碼,使Mac可以執行標准pc的程序。
微軟Windows版本的VirtualPC也是用動態重新編譯,因為原本就能執行使用者模式和virtual8086mode的x86機械碼,所以就只是轉換核心模式和真實模式到使用者模式的x86機械碼。
通常還提供一些客戶端的呼叫函式庫(特別是使用某些客戶端的延伸功能),來加速模擬或提供更多的功能像整合原執行主機環境變數。
參考資料來源:網路-虛擬機
㈦ Android各版本虛擬機的Dexopt區別
從Android 2.1版本到現在的Android 11 , 中間虛擬機變化過三次 :
對於5.0以下的版本 , 載入Multidex的時候 , 會優先判斷 odex 是否存在 , 如果不存在 , 則會通過dexopt生成odex , 然後再載入odex , 同時 , 如果存在 多個Dex文件 的話 , Dexopt 也會執行多次.
使用Dalvik虛擬機 , 生成odex文件 . Dalvik採用的是JIT編譯+解釋器,也就是即時編譯,每次應用運行時會實時將Dex翻譯成機器碼.
使用ART虛擬機 , 生成oat文件. 在ROM OTA或者恢復出場設置後 , 會要進行dex2oat根據當前ROM進行重新編譯生成.oat文件.
使用ART虛擬機 , 但是在7.0之上 , 增加了 .vdex 與 .art 機制 , 在ART虛擬機再次啟動/升級 , 載入Dex/Oat文件時 , 會減少Dex的校驗時間 , 提升載入與運行效率
在ART虛擬機的基礎上 , 增加了 Cdex ( Compat Dex ) 機制 ,
compat_dex_file.h
在dex2oat的時候 , 會有一個目標編譯類型 , 會有以下幾類 , 根據時機不同dex2oat的編譯方式也會不同
配置
㈧ 如何做虛擬機
通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。通過虛擬機軟體,你可以在一台物理計算機上模擬出一台或多台虛擬的計算機,這些虛擬機完全就像真正的計算機那樣進行工作,例如你可以安裝操作系統、安裝應用程序、訪問網路資源等等。對於你而言,它只是運行在你物理計算機上的一個應用程序,但是對於在虛擬機中運行的應用程序而言,它就像是在真正的計算機中進行工作。因此,當我在虛擬機中進行軟體評測時,可能系統一樣會崩潰,但是,崩潰的只是虛擬機上的操作系統,而不是物理計算機上的操作系統,並且,使用虛擬機的「Undo」(恢復)功能,我可以馬上恢復虛擬機到安裝軟體之前的狀態。
目前流行的虛擬機軟體有VMware和Virtual PC,它們都能在Windows系統上虛擬出多個計算機,用於安裝Linux、OS/2、FreeBSD等其他操作系統。微軟在2003年2月份收購Connectix後,很快發布了Microsoft Virtual PC 2004。但出於種種考慮,新發布的Virtual PC 2004已不再明確支持Linux、FreeBSD、NetWare、Solaris等操作系統,只保留了OS/2,如果要虛擬一台Linux計算機,只能自己手工設置。相比而言,VMware不論是在多操作系統的支持上,還是在執行效率上,都比Virtual PC 2004明顯高出一籌,這也是本文選擇它的理由之一。
電腦一台變兩台,學用Linux不再有後顧之憂
VMware 4.5有Workstation、GSX server等多種版本,其中Windows版的Workstation應用最廣,本文即以它為基礎進行各種實戰演習。
虛擬機的概念比較寬泛,通常人們接觸到的虛擬機概念有VMware那樣的硬體模擬軟體,也有JVM這樣的介於硬體和編譯程序之間的軟體。這里所指的是後者。
虛擬機是一個抽象的計算機,和實際的計算機一樣,具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。
Java虛擬機
一、什麼是Java虛擬機
Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。
2.誰需要了解Java虛擬機
Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。
3.Java虛擬機支持的數據類型
Java虛擬機支持Java語言的基本數據類型如下:
byte://1位元組有符號整數的補碼
short://2位元組有符號整數的補碼
int://4位元組有符號整數的補碼
long://8位元組有符號整數的補碼
float://4位元組IEEE754單精度浮點數
double://8位元組IEEE754雙精度浮點數
char://2位元組無符號Unicode字元
幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬體標記。操作這些原始數據類型數據的位元組碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:
object//對一個Javaobject(對象)的4位元組引用
returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當作object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可
移植性。
二、Java虛擬機體系結構
Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。
1.Java指令集
Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。
虛擬機的內層循環的執行過程如下:
do{
取一個操作符位元組;
根據操作符的值執行一個動作;
}while(程序未結束)
由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:
第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。
2.寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。
Java虛擬機的寄存器有四種:
pc:Java程序計數器。
optop:指向操作數棧頂端的指針。
frame:指向當前執行方法的執行環境的指針。
vars:指向當前執行方法的局部變數區第一個變數的指針。
Java虛擬機
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。
(1)局部變數區 每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的。虛擬機提供了把局部變數中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變數的指令。
(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
·動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。
·正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。
·異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用
·程序使用了throw語句。
當異常發生時,Java虛擬機採取如下措施:
·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。
·由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。
(3)操作數棧區 機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。
每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數操作(操作符pe和swap),用於對運行時數據區進行操作時是不考慮類型的。
4.無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。
5.方法區
方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。
㈨ 虛擬機基礎知識
虛擬機指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。那麼你對虛擬機了解多少呢?以下是由我整理關於虛擬機基礎知識的內容,希望大家喜歡!
虛擬機模擬環境
即使Virtual PC的兼容性很高,但不是所有軟體都能在Virtual PC中正常地運行,因為那些軟體可能使用一些未公開的硬體或使用一些不支援的指令。一些人或組織藉此貶低他,比如,在VirtualPC 2004 SP1中,如果有列印機使用LPT1埠,則虛擬機不能識別。這個漏洞在Virtual PC 2007中得到改善。
蘋果麥金塔電腦版本的Virtual PC用動態重新編譯轉換x86的機械碼至相等的PowerPC機械碼,使Mac可以執行標准pc的程序。
微軟Windows版本的Virtual PC也是用動態重新編譯,因為原本就能執行使用者模式和virtual 8086 mode的x86機械碼,所以就只是轉換核心模式和真實模式到使用者模式的x86機械碼。
通常還提供一些客戶端的呼叫函式庫(特別是使用某些客戶端的延伸功能),來加速模擬或提供更多的功能像整合原執行主機環境變數。
Virtual PC 可以在你的電腦上能同時模擬多台電腦,虛擬的電腦使用起來與一台真實的電腦一樣,可以進行bios設定,可以給它的硬碟進行分區,格式化,操作系統你可以安裝 DOS,Windows 95, Windows 98,Windows ME,Windows 2000,Windows XP,Windows Server 2003,UNIX,LINUX等等,你可以在你的 Windows XP 里運行 Linux。
基於Intel的蘋果機支持
微軟宣布在2006 年8月7 日, 真正個人計算機認為Mac不會被端起對英特爾Mac 平台。微軟陳述了 “可選擇的解決方案由蘋果計算機公司和其它販賣者提供, 與窗口的一個充分地被包裝的零售拷貝被結合, 將滿足這需要。”
蘋果計算機公司宣布了和早先運輸了新兵訓練所預覽發行。根據蘋果計算機公司, 新兵訓練所的一個完成的版本將運輸以Mac OS x 10.5 "Leopard." 新兵訓練所將允許Windows XP 被安裝在新基於英特爾的橡皮防水布硬碟的另外分開。這允許用戶解僱入或Mac OS x 或窗口, 雖然不同時。一的包括對連續窗口根據應用的解決辦法在Macintosh 硬體減少需要對於真正個人計算機的英特爾版本。
有並且只能選其中之一的產品從Parallels, Inc. 告訴的Parallels Desktop 為Mac 。這種應用被設計利用Intel's 新技術叫做是新英特爾核心處理器的一部分多數Apple's 最新的計算機使用的英特爾Virtualization 技術。由使用I-VT, 它增加客人操作系統的表現, 使它更加實用至於規則使用。平行桌面並且看齊更新的硬體比微軟真正個人計算機。VMware 和VirtualBox 並且宣布, 他們發布他們的軟體的Mac OS x 版本。
虛擬機資源分配
虛擬機資源涉及多個方面:CPU、內存、網路以及磁碟。在規劃虛擬機時應該考慮這些資源之間的關系,否則,分配的資源不合理將導致虛擬機內的應用程序性能表現不佳。
CPU
虛擬機每個vCPU只運行在一個物理核心之上,因此CPU頻率越高虛擬機的運行速度也就越高,vCPU數量越多有助於提升應用的性能表現。一個比較復雜的因素就是在ESXi伺服器內,所有的虛擬機共享使用物理CPU。ESXi伺服器的核心數越多,每個vCPU獲得的核心份額也就越大,因此多核心的性能表現要強於核心頻率高但數量少的情況。
如果虛擬機需要佔用大量的CPU時間,那麼可以考慮為虛擬機分配第二個vCPU,但是,為虛擬機分配兩個以上vCPU並不一定讓應用運行的更快,因為只有多線程應用才能有效地使用多個vCPU。
RAM
ESXi伺服器內RAM資源通常有限,因此在給虛擬機分配RAM時需要格外小心。VMkernel在處理RAM時非常巧妙;允許虛擬機使用ESXi伺服器所有的物理內存而且會盡量避免佔用物理內存卻沒有真正使用的情況。
物理內存被完全用完後,VMkernel必須確定哪些虛擬機能夠保留物理內存,哪些虛擬機要釋放物理內存。這稱之為“內存回收”。當虛擬機佔用的物理內存被回收後,存在的一個風險就是會對虛擬機的性能造成影響。虛擬機被回收的內存越多,相應的風險也就越大。
最明智的是只為虛擬機分配完成工作所需要的內存。分配額外的內存將會增加回收風險。另一方面,當虛擬機操作系統將未被使用的內存用作磁碟緩存時,將會顯著降低對磁碟系統的性能要求,所以這里有一個折衷問題。
對於資料庫伺服器以及VDI桌面來說,為虛擬機分配更多的內存往往更劃算—在一台ESXi伺服器上運行更少的虛擬機—而不是購買高性能的磁碟陣列。關鍵在於針對虛擬機的負載分配足夠多內存而且沒有浪費。
網路帶寬
網路帶寬包括兩個方面:一是虛擬機和虛擬交換機之間的帶寬,二是虛擬交換機與外部網路之間的帶寬。如果希望虛擬機獲得最大帶寬那麼應該使用VMXNET3網路適配器,VMXNET3在最小的CPU開銷下提供了最好的吞吐量。如果情況允許,所有的虛擬機都應該使用VMXNET3網路適配器。
對於與外部物理網路的連接,一定要確保ESXi主機具備速度最快的物理網卡;10Gb是一個不錯的選擇,即使物理網卡的數量很少,但10Gb能夠允許虛擬機承受突發的網路流量。
請記住,進行大量網路傳輸的虛擬機,虛擬機以及數據包的傳輸都會消耗CPU時間。因此,運行在CPU受限的ESXi伺服器之上的虛擬機由於CPU無法快速響應請求可能會面臨網路吞吐量不高的情況。
磁碟性能
磁碟性能往往是無聲的性能殺手。虛擬機磁碟性能受陣列磁碟數量、類型以及運行在其上的虛擬機的數量的限制。因為集中地共享存儲架構將導致通過同一位置訪問所有的虛擬機磁碟,陣列的存儲控制器以及磁碟過載情況很容易出現,只剩下虛擬機在等待存儲的響應。
虛擬機等待磁碟IO、虛擬機CPU空閑對性能的影響有很大不同。等待IO的虛擬機無法做其他工作,因此高I/O等待時間意味著性能肯定會下降。進行周密的存儲設計以避免上述情況的發生至關重要。[3]
合理選擇磁碟 提升虛擬機性能
在虛擬化中,hypervisor將工作負載從運行在底層的物理硬體中抽象出來,允許快速分配並共享計算資源,遷移工作負載。盡管hypervisor以及與虛擬化兼容的處理器性能開銷很小,但是虛擬化層的存在卻對性能有影響。
當磁碟性能對工作負載至關重要時,某些管理員可能會選擇以直通模式配置LUN,允許虛擬機的操作系統繞過hypervisor與直接LUN進行通信。例如,Windows伺服器虛擬機可能使用直通模式繞過Hyper-V直接訪問磁碟,這對SQL Server資料庫的性能有些許提升。然而,由於客戶操作系統(採用直通模式)以及hypervisor試圖同時訪問磁碟,那麼hypervisor必須被配置為忽略直通LUN。
直通模式存在的問題是其不被某些重要的虛擬化功能比如虛擬機快照或者集群所支持。因此,虛擬機在實際上可能會受益於虛擬化提供的各種功能特性而非採用直通模式所帶來的處於邊緣地位的性能提升。管理員需要評估虛擬機的需求並確定直通模式的適宜性。
除直通模式外,Hyper-V以及其他hypervisor還提供了其他磁碟存儲選項。例如,當.VHD文件被創建時,大小固定的磁碟將分配所有的數據塊。一旦被創建,大小固定的磁碟就不能夠進行調整了。然而,動態擴展磁碟從一開始創建的就是沒有數據塊的.VHD文件,當數據寫入到.VHD文件中後磁碟空間才會被分配出去。這和精簡配置類似,盡管在邏輯上創建了一塊磁碟,但實際的磁碟空間只有數據寫入時才會被用到。
㈩ 電腦怎麼裝虛擬機系統
如果你用的是VMware Workstation 首先「新建虛擬機」
1、選擇 「新建虛擬機」 【 下一步】
2、選擇 「稍後安裝操作系統」 【下一步】
3、選擇 你想安裝的操作系統 【下一步】
4、選擇 安裝虛擬系統的位置,先在非系統盤里建好一個文件夾。【下一步】註:最好不要放在系統盤
5、選擇 虛擬磁碟大小 【下一步】
6、點擊 完成 也可以選擇「自定義硬體」列印機什麼的,要是不需要可以移除。
7、首先不要開機,先進入「編輯虛擬機設置」找到"CD/DVD (SATA)選擇"使用ISO映像文件「選擇你下載好的系統。單擊 」確定「 即可。然後開啟虛擬機,接下來的步驟 就像平時裝系統一樣
其他
1.在虛擬機中運行你安裝好的Vista操作系統,看到系統桌面後,執行「操作→安裝或升級附加模塊」命令,這時虛擬機會自動載入附加模塊到虛擬光碟機並自動運行安裝程序。一路Next完成安裝,然後重新啟動虛擬機。
提示:如果附加模塊沒有自動運行,請雙擊Vista操作系統中的光碟機圖標來運行它或右擊執行「Autorun」命令。
2.切換到「Virtual PC控制台」窗口,點擊「設置」按鈕,在打開的對話框中選擇「共享文件夾」項,點擊「共享文件夾」按鈕並選擇要共享的物理硬碟或文件夾,虛擬機會自動為這些共享文件夾分配盤符,你也可在「盤符」項中指定自己想要的任何盤符,最後勾選「始終共享」項,並按下「確定」按鈕(圖5)。
3.現在回到你的虛擬機Vista操作系統中,雙擊打開「Computer」在「我的電腦」中就能看到共享文件夾了,雙擊打開這些共享文件夾,就能在其中隨心所欲地對共享文件夾進行各種讀寫操作了。
提示:要讓虛擬機操作系統與真實電腦實現共享上網也很簡單,你可以在「設置」對話框中選擇「網路連接」項,然後將「適配器1」設置為「共享連接(NAT)」,再為虛擬機設置正確的網關便可輕松共享上網。要在虛擬機中調用列印機等外部設備,可在「設置」對話框中選擇你相應的埠如LPT1,將其值設為「物理LPT」便可,其它諸如COM埠等設備操作方法與此類似。
