《電子技術應用》
您所在的位置:首頁 > 嵌入式技术 > 业界动态 > 多线程ARM虚拟机的设计与实现

多线程ARM虚拟机的设计与实现

2009-07-16
作者:胡小龙,周艳科

  摘 要: 虛擬機技術廣泛應用于代碼移植、跨平臺計算和模擬硬件機器、嵌入式系統模擬等領域。該技術以軟件的方式構建通用機器的硬件的仿真環境,實現機器指令在處理器中的運算過程。在介紹了虛擬機原理的基礎上,設計并實現了基于多線程的ARM虛擬機,初步模擬了ARM9的指令執行過程。
??? 關鍵詞: 虛擬機;多線程;ARM

?

  所謂虛擬化就是把計算機的資源,如運算能力,存儲空間以及IO設備抽離出來,讓資源的使用方式更具效率。虛擬化技術可以提高硬件的處理能力,簡化軟件的重新配置過程。其主要作用體現在服務器整合、動態負載均衡、快速應用部署、災難恢復、處理器的前期開發的軟件模擬、代碼移植、反病毒等領域。
  虛擬化技術最早產生于上世紀60年代[1],但是被廣泛地應用卻是近兩年的事情。虛擬化技術成為研究熱點的主要原因有兩個:首先是服務的細分,為了提高應用的靈活性,很多技術都將IT應用從大型系統轉向“模塊化”,這就需要一個個應用獨立出來,這種需求也正符合如今人們所熟知的SOA思想;同時硬件發展為這種細分需求提供了一個平臺,硬件發展速度越來越快,如雙核、四核CPU的推動,服務器內存擴展能力越來越大。也就是說,僅僅一個簡單的應用已經無法充分利用服務器的資源,很多資源被浪費,虛擬化技術可以幫助用戶大大地提高服務器資源的利用率,降低成本,并且能夠迎合細分的服務。
  實現虛擬化,主要有三種方法:完全虛擬化,如圖1所示;準虛擬化,如圖2所示;操作系統虛擬化,如圖3所示[2]。

?


1 虛擬機原理
??? 虛擬機用軟件模擬指令在硬件機器中執行的全過程,即先從磁盤中讀取字節碼文件,存儲到虛擬機開辟的內存段中,再將指令加載到虛擬機寄存器并予以執行。它并不是指某個特定的軟件,而是一整套完整的規范,可以用不同的程序設計語言在不同的硬件平臺上實現[3]。不論是硬件機器還是虛擬機系統,只要遵循相同的規范,即可運行遵循該規范的可執行代碼。下面將從處理器引擎、內存管理、任務管理和輸入輸出4個方面分別討論ARM虛擬機的實現規范。
1.1 處理器引擎
  ? 根據運算數據交換平臺的不同,主要有基于堆棧的處理器和基于寄存器的處理器兩種引擎。前者在運行時對系統資源的消耗要遠小于后者,但堆棧將會延伸到內存;后者的計算處理則全部在芯片內部的寄存器上完成,因此后者的處理速度要遠遠高于前者。由于基于堆棧的處理器已經退出主流的行列,ARM虛擬機將采用基于寄存器的執行引擎來模擬具體硬件實現,并在ARM虛擬機中構建堆棧,從而繼承堆棧在處理函數調用和遞歸等問題上的優勢。虛擬寄存器是系統的核心,ARM虛擬機通過寄存器之間的運算來執行字節碼指令。作為處理器中的數據存儲單元,各類寄存器均有不同用途,例如通用寄存器用來存儲和轉換數據和地址,指針寄存器指向堆棧段的棧頂位置,段寄存器則標識出代碼段、數據段和堆棧段之間的界限。
1.2 內存管理
??? 程序指令和數據在內存中的存儲方式有兩種:降序(big-endian)和升序(little-endian)。降序是指數據的高位字節存放在內存中的低位地址中;升序則相反,是指數據的低位字節存放在內存中的低位地址中。內存管理負責內存的分配和回收問題,主要有顯式內存管理法 EMM(Explicit Memory Management)和自動內存管理法AMM(Automatic Memory Management)兩種方法[4]。其中,前者由程序員人工完成內存的分配和回收工作,例如C語言用malloc()調用來實現分配一段內存空間,用free()函數來釋放不再使用的內存。后者則由程序員完成內存的分配,由系統負責自動回收,例如Java語言對于已分配的內存,由內存管理根據其作用域完成與否決定是否收回該段內存。一般來說,顯示內存管理法要比自動內存管理法的速度要快,內存分配算法相對簡單。
1.3 任務管理
  現代計算機使用多任務技術[5],即多個任務共享同一處理器。該技術主要依靠隊列和堆棧,為排隊等候的每個任務分配一段時間,并在系統中建立一張進程表,記錄每一個進程的狀態。相應的狀態有3種:正在執行、被掛起和阻塞。通常采用搶占式多任務技術,即由操作系統決定進程間的切換。例如在著名的時間片輪轉(round-robin)算法里,每個進程所分配的執行時間的長度是固定的,進程調度不停地依次遍歷整個進程表,讓每個進程都有機會占用同樣長度的處理器時間。
1.4 輸入/輸出
  虛擬機依托于宿主平臺,因此輸入/輸出功能的實現相對較簡單,在系統調用層基礎上的標準輸入/輸出函數即可勝任。運算速度有所限制,但無須接觸機器級的中斷調用和輸入/輸出操作。
2 32位ARM虛擬機的設計
  32位處理器的地址空間僅能支持4 GB,ARM虛擬機采用32位地址空間技術,在Win32位平臺上開辟一個4 B的空間來表示32位整型,并涉及一組虛擬寄存器、一段虛擬內存空間和一個類ARM9的指令集,分別對應于需要仿真的機器部件。在32位地址空間的基礎上,采用寄存器引擎、顯示內存管理法、搶占式多任務技術等基本工作機制,構建虛擬機軟件的基本結構。


2.1 虛擬寄存器
 ?  ARM虛擬機共有37個寄存器,包括31個32位的通用寄存器(包括程序計數器PC在內),6個32位的狀態寄存器[6]。ARM處理器共有7種不同的處理模式,在每一處理器模式中有一組相應的寄存器組。在任意的處理器模式下,可見的寄存器包括15個通用寄存器(R0~R14),一個或兩個狀態寄存器及程序計數器(PC)。在所有的寄存器中,有些是各模式共用同一個物理寄存器,有一些寄存器是各模式自己擁有的獨立的物理寄存器。表1列出了各處理器模式下可見的寄存器情況。
2.2 虛擬的MMU的設計和管理
  在ARM虛擬機設計中,通過C++的vector來開辟一塊連續的內存地址作為虛擬內存空間,存儲程序的字節碼指令。由于在32位機器上無法提供這么多的物理內存,因此ARM虛擬機采用先預讀后分配的原則來開辟虛擬內存,即先對字節碼文件的大小進行預讀,根據其大小再從物理內存中分配足夠的內存作為虛擬內存,如果剩余的物理內存無法滿足需要,則退出該次分配。由于當前主流硬件平臺(如Intel公司的系列處理器)均采用降序方式,在ELF文件的加載過程中無須改變數據存儲方式,因此在ARM虛擬機的設計中使用降序方式,提高了虛擬機的執行效率,同時保證了設計的通用性和簡單性。另外,在內存的管理和回收方面,采用顯式內存管理法,從而確保虛擬機的運行速度、內存分配的靈活性和對程序的控制權。
2.3 虛擬機基本結構
??? 圖4是ARM虛擬機的總體結構,由以下模塊組成:


  指令集功能仿真模塊和系統調用仿真模塊都屬于功能仿真模塊,前者按序仿真每條指令(現在不包含時序模擬),其主要用于性能模擬器執行結果正確性驗證;后者采用宿主機代理方式仿真系統調用處理過程[7]。
  ? 流水線模塊、功能部件模塊、寄存器模塊和分支預測模塊共同組成了性能模擬器內核,為ARM虛擬機的主要組成部分。其中,流水線模塊包含所有和流水線相關的數據結構和處理函數;功能部件和寄存器模塊用于建模功能部件和ARM寄存器組;分支預測模塊用于建模分支預測器。
  ? Cache模塊、TLB模塊、總線邏輯和MMU模塊共同組成了存儲器層次模塊組,其模擬了一個ARM存儲器的行為過程。
?   ELF文件加載器模塊、數據收集統計模塊、參數處理模塊和調試器模塊為ARM虛擬機的輔助模塊,ELF文件加載器模塊用于將可執行文件加載到模擬器內存中;數據收集統計模塊用于收集統計模擬器各項狀態數據,如指令執行條數;參數處理模塊用于處理命令行參數;調試器模塊用于調試用戶程序。
??? 檢驗模塊用于驗證性能模擬器的正確性,它通過將每條指令的性能模擬結果并與其功能仿真結果進行比較,就可以判斷出指令是否被正確執行,然后可以根據用戶要求采取不同的操作。
3 ARM虛擬機的工作流程
3.1 基本流程
  ARM虛擬機從讀入ELF文件到執行完畢的全過程,算是一個生命周期。該周期按功能不同,可分為5個階段:(1)啟動虛擬機,并處理命令行輸入;(2)初始化虛擬機運行環境;(3)調入并加載文件;(4)格式化內存存儲方式;(5)執行指令。其中,第(2)和(5)階段是整個程序運行的核心,完成了虛擬機的初始化和執行ELF文件中分析出的代碼段指令的主要工作。
3.2 初始化虛擬機
  階段(1)通過對命令行的處理,獲取字ELF文件的信息。該信息通過ELF文件加載器得到程序代碼段、數據段、堆棧段的信息傳遞到階段(2)初始化虛擬機的InitVM函數中。其中數據段和堆棧段的缺省長度均為64 KB,而代碼段的長度為ELF文件中代碼指令所占用的實際長度。
  InitVM函數的執行流程是:(1)函數從文件頭中提取必要的信息后,立即檢查字節碼長度,將其與數據段和堆棧段的長度之和與宿主機的可用內存比較。如果可用內存不夠,則報錯并退出虛擬機;否則宿主機將分配一段大小為三者之和的內存給虛擬機。(2)將段寄存器分別設置成為相應段的值。(3)將ELF代碼加載到內存空間的代碼段。具體算法如下:
??? If (ELF文件大小為零或文件打開錯誤)
????   {記錄并打印錯誤,并直接返回 }
??? If (代碼段、數據段和堆棧段的長度之和 > 宿主機的可用內存)
?   ?? {記錄并打印錯誤,并直接返回 }
??? 分配內存 R=malloc(代碼段、數據段和堆棧段的長度之和);
????   初始化寄存器;
??   ? 重新返回ELF文件的代碼段部分,調用fseek()定位代碼段部分的位置;
??? 讀取代碼段部分,并將其加載入所開辟的內存代碼段中。
  如果上述過程順利執行,所獲取的虛擬機內存地址空間如圖5所示。


3.3 執行代碼段
  ? run()函數是ARM虛擬機的指令執行引擎,負責完成代碼段指令的執行工作。該函數將字節碼指令從虛擬地址0處開始逐條執行,當遇到HALT指令或發生錯誤時停止。指針寄存器IP始終指向下一條所需執行的指令。參照基于寄存器的處理器的設計方法,第(5)階段指令執行過程的算法如下(其中,CPSR表示指令指針寄存器值;CPSR中表示內存地址為CPSR所存值的地址處的指令):
??? void run()
???? {
?????? while(內存地址為CPSR不等于中止指令HALT)
?????? {
???    switch(內存地址為CPSR的指令)
???    {
    ??? case MOV:{…;}break;
???????????? …各種指令的具體執行;
    ???????? default:{ERROR;}break;
?????????? }
???????? 將指令指針CPSR指向下一條指令;
???  }
??? }
??? ARM指令按照指令功能的不同來分,包括數據處理指令(如MOV、MVN、CMP)、內存訪問指令(如LDR、STR)、內存批訪問指令、跳轉指令(如B、BL)、訪問狀態寄存器指令(如MRS)、軟中斷指令等。
??? 指令模擬執行過程如圖6所示。


3.4 流水線的實現
  ARM9采用哈佛結構的設計[8],采用5級流水線,其功能分別描述如下:
??? (1)取指。從存儲器(CACHE/Memory)取出指令,并將其放入指令流水線。
??? (2)譯碼。指令譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆中有3個操作數讀端口,大多數ARM指令能在一個周期內讀取其操作數。
??? (3)執行。一個操作數移位,產生ALU的結果,如果指令是LOAD或STORE,則在ALU中計算存儲地址。
??? (4)緩沖/數據訪存。如果需要,則訪問數據存儲器;否則,ALU只是簡單的緩沖一個時鐘周期,以便所有的指令具有同樣的流水線流程。
??? (5)回寫。將指令產生的結果回寫(Write back)至寄存器堆,包括任何從存儲器中讀取的數據。
??? 采用多線程模擬5級流水線的執行過程如圖7所示。


??? ARM指令的實現方式(單線程和多線程),如表2所示,在ARM虛擬機運行ARMlinux,記錄了10次兩種方式的起始時間,計算平均值。


??? 從表2中可以看出,多線程的方法對指令流水線模擬的性能有很大改進。
  本文主要采用顯式內存管理、代碼段的解析、基于寄存器的機器引擎,多線程等關鍵技術,在以Win32為宿主平臺的基礎上,設計并實現了基于多線程的ARM虛擬機系統,能夠在32位的內存地址空間和虛擬寄存器上執行指令,為模擬ARM處理器的仿真環境做出了有益的嘗試。今后將進一步完善ARM嵌入式系統模擬的設計,充分發揮虛擬機在嵌入式開發方面的優勢。


參考文獻
[1] 李林華,盛浩,馬世龍.基于寄存器引擎的64位虛擬機的實現[J].計算機工程,2005,31(2):91-93.
[2] 劉洪浩.虛擬化,熱潮不等于機會[J].程序員2007年精華本,2007.
[3] BLUNDEN B. Virtual Machine Design and Implementation in C/C++[M]. Wordware Publishing, 2002.
[4] JONES R, LINES R. Garbage Collection: Algorithms for Automatic Dynamic Memory Management[M]. John Wiley & Sons,1996.
[5] TANENBAUM A S, WOODHULL A S. Operating System: Design and Implementation[M]. Prentice Hall, 1997.
[6] 杜春雷.ARM體系結構與編程[M].北京:清華大學出版社,2003.
[7] 萬寒,高小鵬. Design and Implementation of a Simulation Framework for the ARM Embedded System. IEEE Computer Society,北京:北京大學,2008.
[8] 譚華.嵌入式系統軟件仿真器的研究與實現[D].西安:電子科技大學,2006.

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 亚洲综合精品伊人久久| 色妞一区二区三区| 91精品国产成人| 国精产品一区一区三区视频| 国产三区在线视频| 99精品免费在线观看| 久久久国产视频91| 国产v综合v亚洲欧美久久| 无码无遮挡又大又爽又黄的视频| 国产精品亚洲视频在线观看| 亚洲a∨一区二区三区| 久久久亚洲天堂| 国产精品视频中文字幕91 | 国产精品免费观看高清| 国产aⅴ精品一区二区三区黄 | 国产精品高清网站| 日韩中文字幕一区二区| 欧美日韩国产精品一卡| 国产精品初高中精品久久| 久久久中文字幕| 91精品国产91久久久久| 国产成人在线精品| 久久人人爽亚洲精品天堂| 亚洲字幕一区二区| 久久久99免费视频| 国产欧美欧洲在线观看| 日本久久久网站| 日本一区二区视频| 国产日韩视频在线播放| 亚洲日本精品国产第一区| 日韩在线三区| 欧美激情网站在线观看| 欧美日韩一区二区视频在线观看 | 国产精品二区在线观看| 亚洲一区二区三区在线观看视频| 欧美激情一级精品国产| 亚洲欧美精品在线观看| 91国内在线视频| 国产精品盗摄久久久| 久久久免费精品| 国产亚洲精品网站|