SkyEye支持網絡模擬,目前描述網絡配置的數據結構是net_config_t,它的具體內容如下:
typedef struct { int state; unsigned char macaddr[6]; unsigned char hostip[4]; int ethmod; int fd; int hubindex; int (*net_init)(int index, unsigned char *macaddr, unsigned char *hostip); unsigned char (*net_output)(int if_fd, ARMul_State *state,\ unsigned char startpage,unsigned short packet_len); void (*net_input)(int if_fd, ARMul_State *state); }net_config_t;
其中各個field的含義描述如下: ●state:是一個布爾變量,為1表示網絡芯片工作,為0表示網絡芯片不工作 ●macaddr:用來保存網絡芯片的mac地址 ●hostip:用來保存主機上與SkyEye進行網絡通信所用的IP地址
●ethmod:表示與主機的模擬網絡交互的方式,目前定義的交互方式有: #define NET_MOD_LINUX 0 #define NET_MOD_TUNTAP 1 #define NET_MOD_WIN 2 #define NET_MOD_VNET 3 目前可以使用的兩種方式有 NET_MOD_VNET(與SkyEye提供的vnet.o內核模塊進行網絡交互)和 NET_MOD_TUNTAP(與linux的tun.on內核模塊進行網絡交互)。 ●fd:表示SkyEye用于與主機進行網絡交互的設備文件描述符 ●hubindex:用于NET_MOD_VNET方式,表示所處的是第幾個虛擬hub網段。如果它的值是i,則處于第i個hub網段中。 ●net_init/net_input/net_output:這三個函數與具體的模擬網絡交互方式有關,分別完成初始化操作和與主機網絡的輸入輸出操作。相關的實現在文件skyeye_net_*.c中。 有關8019AS模擬芯片(NE2000兼容)的具體配置與實現位于文件skyeye-ne2k.[ch]中。
6、ARMul_State數據結構: 上面講述的是與SkyEye的硬件配置相關的數據結構,可以理解為一種靜態硬件配置的數據結構,這些數據結構中的域基本不隨著SkyEye模擬硬件的運行而改變。而ARMul_State描述的是一種動態硬件配置的數據結構,它保存了隨著SkyEye模擬硬件的運行而時刻改變的硬件數據。
ARMul_State中的域數量繁多,大體分為: 與CPU模擬相關的域、與協處理器模擬相關的域、與內存和MMU/CACHE相關的域 、與統計相關的域、與具體開發板相關的io部分。
這里只描述其中關鍵的部分: ●與CPU模擬相關的域 : ARMword Reg[16]:CPU當前模式下的寄存器值 ARMword RegBank[7][16]:CPU所有七種模式下的寄存器值 ARMword Cpsr:CPU的當前程序狀態寄存器 ARMword Spsr[7]:CPU所有七種模式下的程序狀態保存寄存器 ARMdword Accumulator:40bit的累加寄存器,目前用于xscale體系結構中 ARMword NFlag, ZFlag, CFlag, VFlag, IFFlags, Sflag,TFlag:各種狀態位 ARMword Bank:CPU對應模式寄存器組的索引值 ARMword Mode:CPU模式索引值 ARMword instr, pc:pc是目前正在執行的程序指針,instr是pc所指地址的內容 ARMword loaded, decoded:loaded是正在加載的指令,decoded是正在解碼的指令 unsigned NfiqSig:FIQ信號 unsigned NirqSig:IRQ信號
● 與協處理器模擬相關的域: ARMul_CPInits *CPInit[16]:16個協處理器的初始化函數 ARMul_CPExits *CPExit[16]:16個協處理器的退出函數 ARMul_LDCs *LDC[16]:16個協處理器的LDC指令函數 ARMul_STCs *STC[16]:16個協處理器的STC指令函數 ARMul_MRCs *MRC[16]:16個協處理器的MRC指令函數 ARMul_MCRs *MCR[16]:16個協處理器的MCR指令函數 ARMul_CDPs *CDP[16]:16個協處理器的CDP指令函數 ARMul_CPReads *CPRead[16]:16個協處理器的讀CP寄存器函數 ARMul_CPWrites *CPWrite[16]:16個協處理器的寫CP寄存器函數 unsigned char *CPData[16]:16個協處理器的數據指針 ARMword CP14R0_CCD:在xscale體系結構的CP14協處理器中,用于統計時鐘周期
●與內存和MMU/CACHE相關的域: mmu_state_t mmu:mmu/cache的數據結構,在armmmu.h中定義,詳解請參考"SkyEye的MMU/CACHE和Memory模擬實現"一節 mem_state_t mem:memory的數據結構,在armmem.h中定義,詳解請參考"SkyEye的MMU/CACHE和Memory模擬實現"一節 與統計相關的域 unsigned long NumScycles, NumNcycles, NumIcycles, NumCcycles, NumFcycles:用于統計不同狀態下的周期數 unsigned long NumInstrs:當前執行的指令數 其它與特定CPU和開發板相關的各種io寄存器的定義放到了各個與開發板相關的文件中,如skyeye_mach_at91/ep7312/pxa/sa.c等處,詳解請參考"SkyEye的開發板IO模擬實現"。
●與具體開發板相關的io部分: ARMul_io mach_io; 其中ARMul_io的結構目前為
struct ARMul_io { ARMword *instr; //to display the current interrupt state ARMword *net_flag;//to judge if network is enabled ARMword *net_int; //netcard interrupt
ARMword *lcd_is_enable; //turn lcd on? ARMword *lcd_addr_begin; //the begining display mem addr of lcd ARMword *lcd_addr_end; //the end display mem addr of lcd };
instr:是記錄當前的中斷狀態 net_flag:判斷網絡選項是否打開 net_int:用來記錄網絡中斷號 lcd_is_enable:來記錄LCD是否使能 lcd_addr_begin:記錄lcd顯存的起始位置 lcd_addr_end:記錄顯存的結束位置
7、SkyEye邏輯執行流程: 了解SkEye的總體邏輯執行流程,對了解硬件的體系結構和軟件/硬件的接口有較大幫助。從總體上,可把SkyEye邏輯執行流程按執行的時間順序劃分為兩個階段: 1、SkyEye加載與配置處理過程 2、SkyEye模擬執行過程
第一階段為第二階段的正常執行做了充分的準備,具體的執行內容包括: ●讀入帶調試信息的操作系統執行文件(由GDB完成) ●根據配置文件skyeye.conf的信息配置模擬硬件 ●如果skyeye.conf中存在binary image格式文件,加載這些文件 ●根據操作系統執行文件的內容加載調試信息(由GDB完成) ●根據操作系統執行文件信息加載執行文件中的代碼段和數據段等(由GDB完成) ●執行相關模擬硬件的初始化函數 其中總的初始化函數是位于wrapper.c中的init函數,它調用如下函數完成整個模擬硬件的初始化工作:
ARMul_EmulateInit:初始化與執行機器指令相關的數據ARMul_ImmedTable和ARMul_BitList ARMul_NewState:初始化結構為ARMul_State的全局變量state skyeye_option_init:初始化全局變量skyeye_config skyeye_read_config:讀取配置文件skyeye.conf并根據配置文件進行相關配置 nic_init:根據配置文件信息配置網絡模擬環境 skyeye_config.mach->mach_init(state, skyeye_config.mach):根據配置文件信息配置CPU和開發板的相關I/O函數 ARMul_Reset(state):進一步初始化全局變量state,并根據配置文件信息配置MMU/CACHE和memory io_reset:初始化特定CPU和開發板的IO寄存器
第二階段根據特定硬件的配置描述,開始執行特定硬件模擬處理。整個過程圍繞CPU執行指令展開,根據模擬硬件可分為如下幾個階段:
●CPU執行三級流水線處理,即取指令、譯碼、執行指令,主要處理集中在armemu.c中的ARMul_Emulate32/26函數。 ●在執行指令過程中,如果有中斷產生,CPU調整運行模式,并改變指令指向中斷向量起始地址,主要處理集中在arminit.c中的函數ARMul_Abort函數、armemu.c中的ARMul_Emulate32/26函數。 ●在執行指令過程中,如果指令是協處理器指令,則把指令轉交給協處理器模擬模塊進行進一步處理,主要處理集中在文件armcopro.c、xscale_copro.c等文件中。 ●在執行指令過程中,如果發現指令是訪問內存/IO的指令,則根據SkyEye模擬的特定CPU是否有MMU/CACHE分別進行處理: 如果CPU有MMU/CACHE,則進入MMU/CACHE模擬模塊,如果還需要內存訪問,則進入memory模擬模塊處理。如果訪問地址屬于IO地址空間,則轉到特定CPU和開發板的IO模擬模塊處理。 如果CPU沒有MMU/CACHE,則直接進入memory模擬模塊處理。如果訪問地址屬于IO地址空間,則轉到特定CPU和開發板的IO模擬模塊處理。 處理訪問內存/IO的指令的相關內容集中在armvirt.c;與MMU/CACHE處理、read/write buffer(用于StrongARM和XScale體系結構的模擬)處理相關的文件包括armmmu.[ch]、mmu/*.[ch];與訪問memory模擬有關的內容主要集中在armmem.[ch]中。 如果要執行IO地址訪問,這具體的處理過程由特定CPU和開發板IO模擬模塊中的read/write_byte/halfword/word函數處理。 為了模擬外設的執行,在執行指令過程的每一個周期,會執行一個io_do_cycle函數,它會調用特定CPU和開發板的IO模擬模塊中的*_io_do_cycle函數,完成對時鐘、網絡輸入輸出、UART輸入輸出等的處理,并根據條件產生中斷信號。
|