一. SkyEye的總體結構 SkyEye基於GDB/ARMulator(目前由David McCullough 維護),並進行了全面的改變和擴展。SkyEye建立在GNU GDB的底層,可以模仿多種完整的嵌入式計算機系統,目前模擬的硬件包括CPU、內存、I/O寄存器、時鐘、UART、網絡芯片、MMU、CACHE,將來還會模擬 LCD、USB等各種硬件。在SkyEye上運行的操作系統和各種系統軟件"意識"不到它們是在一個虛擬的計算機系統上運行。 SkyEye從總體上分為四個層次: 用戶接口模塊:包括命令行用戶界面和圖形用戶界面,完成處理用戶的輸入命令,並把相關調試數據輸出給用戶的任務。這一部分基本上直接利用了GDB的用戶接口模塊,並在此基礎上有一定的擴充。 符號處理模塊:主要處理執行文件的頭信息,解釋執行文件中內嵌的debuger調試信息,對符號表的管理,對源代碼表達式的解析,定位源代碼中的語句位置和機器碼的位置關系等。這一部分也是直接利用了GDB的符號處理模塊,也正是有了這個模塊的支持,SkyEye可以支持源碼級調試。 目標控制模塊:主要完成執行控制(如中斷程序的執行,設置中斷條件等),程序棧結構分析,對具體目標硬件的控制(如本地調試、遠程調試和模擬調試的控制)。這一部分完成對SkyEye上運行的軟件的控制,提供了多種調試手段。 目標模擬模塊:這一部分是SkyEye的核心。它的功能是模仿計算機系統中的主要硬件(包括CPU、內存和各種硬件外設等)的執行,對執行文件的機器指令進行解釋,並模擬執行每一條機器指令,產生相應的硬件響應等。
二. SkyEye目標模擬模塊功能劃分 SkyEye目標模擬模塊模擬的硬件邏輯結構圖如圖 0 1所示。SkyEye目標模擬模塊從功能上可分為如下幾大模塊: 配置選項解析和初始化模塊:在模擬硬件開始運行前,根據配置文件的選項,控制對模擬硬件的配置和初始化。相關文件包括: arminit.c:控制各種模擬硬件的初始化 skyeye_config.[ch]:解析配置文件的選項行 skyeye_options.c:根據各種硬件的選項,完成各種配置 處理器模擬宏模塊:主要完成與處理器體系結構相關的模擬,它可細分為:CPU指令模擬執行模塊、MMU/CACHE模擬模塊、CoProcessor(又稱協處理器)模擬模塊。 CPU指令模擬執行模塊:其主要任務是:當模擬硬件開始運行,完成指令讀取,指令譯碼,指令執行的工作;如果CPU狀態發生了改變,調整指令和各種寄存器值;在指令執行前,調用開發板IO模擬模塊的io_do_cycle驅動模擬各種外設的行為。主要的文件包括: armemu.[ch]:模擬CPU的3級流水線,並具體執行各種指令 MMU/CACHE模擬模塊:本模塊分為兩部分:與具體CPU類型無關的MMU/CACHE模擬子模塊和與具體CPU類型相關的模擬子模塊。主要的任務是:根據配置文件進行初始化;進行MMU/CACHE模擬;執行與MMU/CACHE相關的指令。如果CPU指令模擬模塊執行讀寫存儲器的操作指令,則轉到MMU/CACHE模擬模塊。如果模擬的CPU類型不支持MMU(如ARM7TDMI),則SkyEye會根據將訪問的地址,直接轉到MEMORY模擬模塊或開發板IO模擬模塊;否則轉到具體CPU類型相關的模擬子模塊進行MMU/CACHE模擬。主要的文件包括兩部分: 與具體CPU類型無關的MMU/CACHE模擬子模塊: armvirt.c、armmmu.c、mmu/*.[ch] 與具體CPU類型相關的MMU/CACHE模擬子模塊: sa_mmu.[ch]:模擬strongarm的MMU/CACHE arm7100_mmu.[ch]:模擬arm7[12]0T的MMU/CACHE xscale_copro.c:模擬xscale的MMU/CACHE arm920t_mmu.[ch]:模擬arm920t的MMU/CACHE CoProcessor(又稱協處理器)模擬模塊:其主要任務是:完成各種協處理器的初始化;執行各種協處理器的指令。實際上MMU/CACHE模擬模塊的一部分工作是模擬ARM的第15號協處理器,它的主要功能是配置MMU/CACHE等。主要的文件包括: armcopro.c:根據配置信息,完成對ARM協處理器的初始化配置 xscale_copro.c:模擬xscale的協處理器cp13、cp14、cp15 sa_mmu.[ch]、arm7100_mmu.[ch]:模擬strongarm、ep7312的協處理器cp15 arm920t_mmu.[ch]:模擬arm920t的協處理器cp13、cp14、cp15 IO模擬宏模塊:本模塊包含各種邏輯行為各異的外設模擬,主要包括系統IO模擬模塊、網絡芯片模擬模塊、LCD模擬模塊等。 系統IO模擬模塊:本模塊的主要任務包括:根據配置文件進行IO和外設初始化;完成各種外部IO設備的模擬(如時鐘計數器累加、產生中斷、LCD顯示等);進行各種特定CPU和外設的IO寄存器讀寫的模擬。本模塊與各種具體的開發板和CPU有很緊密的聯系,主要的文件包括: armio.[ch]:建立在各個特定模擬子模塊上的抽象層模塊 skyeye_mach_at91.c:模擬Atmel AT91X40開發板 skyeye_mach_ep7312.c:模擬cirrus ep7312開發板 skyeye_mach_pxa.c:模擬intel xscale lubbock開發板 skyeye_mach_s3c4510b.c:模擬基於samsung s3c4510b的開發板 skyeye_mach_s3c44b0.c:模擬基於samsung s3c44b0的開發板 skyeye_mach_sa.c:模擬基於intel strongam的adsbitsy開發板 skyeye_mach_lpc.c:模擬基於philip lpc2249的開發板 skyeye_mach_sharp.c:模擬基於sharp lh7a400的開發板 skyeye_mach_at91rm92.c:模擬基於atmel at91rm9200的開發板 skyeye_mach_cs89712.c:模擬基於cs89712的開發板 網絡芯片模擬模塊:本模塊主要完成了對8019AS網絡芯片的模擬工作,主要任務包括:模擬8019AS的控制邏輯、8019AS與具體開發板IO模擬模塊的接口、虛擬網絡輸入輸出接口處理。主要的文件包括: skyeye-ne2k.[ch]:8019AS的硬件邏輯模擬 skyeye_mach_at91.c:部分內容完成接收虛擬網絡輸入處理模擬 skyeye_net_tuntap.c:配置tuntap虛擬網絡的接口 skyeye_net_vnet.c:配置vnet虛擬網絡的接口 vnet.c、if_vnet.h:獨立存在的軟件包,vnet虛擬網絡的具體實現 LCD/ToUChScreen模擬模塊:本模塊主要完成LCD/TouchScreen控制邏輯的模擬,是目前唯一需要GUI支持的模塊,它的主要任務是:配置LCD/TouchScreen硬件模擬、模擬LCD/TouchScreen控制邏輯。有關LCD/TouchScreen模擬相關的文件包括: skyeye_lcd.[ch]: LCD/TouchScreen配置和LCD/TouchScreen模擬的通用控制邏輯 skyeye_mach_*.c:與開發板相關LCD/TouchScreen的控制邏輯和中斷處理,目前支持ep7312和pxa255的skyeye模擬。 MEMORY模擬模塊:本模塊與具體的CPU和開發板無關,它的主要任務包括:根據配置文件進行內存初始化,並加載binary image文件;進行RAM/ROM讀寫的模擬。主要的文件包括: armmem.[ch]:主要完成RAM/ROM讀寫模擬
三. SkyEye關鍵數據結構 SkyEye目標模擬模塊中,各種數據結構很多,用於模擬硬件總體機構定義的主要數據結構有skyeye_config_t和ARMul_State。把握這兩個數據結構,是理解整個skyeye模擬的硬件體系結構的關鍵,在這兩個數據結構上進行進一步細化分析,則可充分了解skyeye的硬件體系結構細節。
1. skyeye_config數據結構 skyeye_config_t結構描述了SkyEye模擬的整個硬件的靜態配置,它的具體內容如下: typedef struct { cpu_config_t *cpu; machine_config_t *mach; mem_config_t mem; net_config_t net[NET_MAXNICNUM_PER_HOST]; uart_config_t uart; log_config_t log; ARMWord start_address; ARMword no_lcd; char config_file[MAX_FILE_NAME]; } skyeye_config_t; skyeye_config_t結構包含了CPU核心配置信息-cpu、開發板配置信息-mach、memory map 配置信息-mem、網絡芯片和網絡環境配置信息-net、面向主機的輸入輸出配置信息-uart、測試記錄輸出配置信息-log、模擬執行起始地址配置信息-start_address、是否有LCD-no_lcd和記錄文件名信息-config_file。這裡面與模擬硬件緊密相關的是CPU核心配置信息、開發板配置信息、memory map 配置信息、網絡芯片和網絡環境、LCD配置信息。
2. cpu_config_t數據結構 描述CPU核心的結構定義在cpu_config_t數據結構中,具體內容如下: typedef struct { const char *cpu_arch_name; const char *cpu_name; ARMword cpu_val; ARMword cpu_mask; ARMword cachetype; } cpu_config_t; 其具體描述解釋如下: cpu_arch_name:描述了arm cpu體系結構的名稱,根據ARM CPU內核的發展,其體系結構已經從Version1發展到了Version5,其最新版本為Version5TE。而Intel在其基礎上又進行了自己的擴展體系結構StrongARM(基於ARM version4)和XScale(基於ARM version5)。目前SkyEye支持"armv3"、"armv4"、"arm5"、"arm5TE"、"xscale"的體系結構。 cpu_name:描述了具體的arm cpu名稱,如arm7TDMI、ARM720T、StrongARM1100/1110、XScale PXA2xx等。目前SkyEye支持"arm710"、"arm7TDMI"、"arm720t"、"sa1100"、"xscale"等。 cpu_val:這是用來表示process id,一般而言每種具體的ARM CPU 都有一個ID,更詳細的描述可參考《ARM Architecture Reference Manual》的B2-6。操作系統根據這個ID來識別cpu的類型並執行相關配置。 cpu_mask:這是用來確定process id的屏蔽位數。由於process id中的