青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C/C++/Linux/Embedded

學(xué)習(xí)也是一種樂趣
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計

  • 隨筆 - 4
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

常用鏈接

留言簿(1)

隨筆檔案

文章分類

文章檔案

收藏夾

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

SkyEye硬件模擬平臺,第三部分: 硬件仿真實現(xiàn)之一SkyEye的設(shè)計實現(xiàn)

?

文檔選項
將此頁作為電子郵件發(fā)送

將此頁作為電子郵件發(fā)送

未顯示需要 JavaScript 的文檔選項


拓展 Tomcat 應(yīng)用

下載 IBM 開源 J2EE 應(yīng)用服務(wù)器 WAS CE 新版本 V1.1


級別: 初級

陳渝 (yuchen@tsinghua.edu.cn)清華大學(xué)

2004 年 10 月 01 日

?

前兩篇文章分別介紹了 SkyEye 項目及其安裝,下面的幾篇文章將對其設(shè)計實現(xiàn)展開討論。

一. SkyEye的總體結(jié)構(gòu)

SkyEye基于GDB/ARMulator(目前由David McCullough 維護),并進行了全面的改變和擴展。SkyEye建立在GNU GDB的底層,可以模仿多種完整的嵌入式計算機系統(tǒng),目前模擬的硬件包括CPU、內(nèi)存、I/O寄存器、時鐘、UART、網(wǎng)絡(luò)芯片、MMU、CACHE,將來還會模擬 LCD、USB等各種硬件。在SkyEye上運行的操作系統(tǒng)和各種系統(tǒng)軟件"意識"不到它們是在一個虛擬的計算機系統(tǒng)上運行。

SkyEye從總體上分為四個層次:

  • 用戶接口模塊:包括命令行用戶界面和圖形用戶界面,完成處理用戶的輸入命令,并把相關(guān)調(diào)試數(shù)據(jù)輸出給用戶的任務(wù)。這一部分基本上直接利用了GDB的用戶接口模塊,并在此基礎(chǔ)上有一定的擴充。
  • 符號處理模塊:主要處理執(zhí)行文件的頭信息,解釋執(zhí)行文件中內(nèi)嵌的debuger調(diào)試信息,對符號表的管理,對源代碼表達式的解析,定位源代碼中的語句位置和機器碼的位置關(guān)系等。這一部分也是直接利用了GDB的符號處理模塊,也正是有了這個模塊的支持,SkyEye可以支持源碼級調(diào)試。
  • 目標控制模塊:主要完成執(zhí)行控制(如中斷程序的執(zhí)行,設(shè)置中斷條件等),程序棧結(jié)構(gòu)分析,對具體目標硬件的控制(如本地調(diào)試、遠程調(diào)試和模擬調(diào)試的控制)。這一部分完成對SkyEye上運行的軟件的控制,提供了多種調(diào)試手段。
  • 目標模擬模塊:這一部分是SkyEye的核心。它的功能是模仿計算機系統(tǒng)中的主要硬件(包括CPU、內(nèi)存和各種硬件外設(shè)等)的執(zhí)行,對執(zhí)行文件的機器指令進行解釋,并模擬執(zhí)行每一條機器指令,產(chǎn)生相應(yīng)的硬件響應(yīng)等。




回頁首


二. SkyEye目標模擬模塊功能劃分




SkyEye目標模擬模塊模擬的硬件邏輯結(jié)構(gòu)圖如圖 0 1所示。SkyEye目標模擬模塊從功能上可分為如下幾大模塊:

  • 配置選項解析和初始化模塊:在模擬硬件開始運行前,根據(jù)配置文件的選項,控制對模擬硬件的配置和初始化。相關(guān)文件包括:
    • arminit.c:控制各種模擬硬件的初始化
    • skyeye_config.[ch]:解析配置文件的選項行
    • skyeye_options.c:根據(jù)各種硬件的選項,完成各種配置
  • 處理器模擬宏模塊:主要完成與處理器體系結(jié)構(gòu)相關(guān)的模擬,它可細分為:CPU指令模擬執(zhí)行模塊、MMU/CACHE模擬模塊、CoProcessor(又稱協(xié)處理器)模擬模塊。
  • CPU指令模擬執(zhí)行模塊:其主要任務(wù)是:當模擬硬件開始運行,完成指令讀取,指令譯碼,指令執(zhí)行的工作;如果CPU狀態(tài)發(fā)生了改變,調(diào)整指令和各種寄存器值;在指令執(zhí)行前,調(diào)用開發(fā)板IO模擬模塊的io_do_cycle驅(qū)動模擬各種外設(shè)的行為。主要的文件包括:
    • armemu.[ch]:模擬CPU的3級流水線,并具體執(zhí)行各種指令
  • MMU/CACHE模擬模塊:本模塊分為兩部分:與具體CPU類型無關(guān)的MMU/CACHE模擬子模塊和與具體CPU類型相關(guān)的模擬子模塊。主要的任務(wù)是:根據(jù)配置文件進行初始化;進行MMU/CACHE模擬;執(zhí)行與MMU/CACHE相關(guān)的指令。如果CPU指令模擬模塊執(zhí)行讀寫存儲器的操作指令,則轉(zhuǎn)到MMU/CACHE模擬模塊。如果模擬的CPU類型不支持MMU(如ARM7TDMI),則SkyEye會根據(jù)將訪問的地址,直接轉(zhuǎn)到MEMORY模擬模塊或開發(fā)板IO模擬模塊;否則轉(zhuǎn)到具體CPU類型相關(guān)的模擬子模塊進行MMU/CACHE模擬。主要的文件包括兩部分:
    • 與具體CPU類型無關(guān)的MMU/CACHE模擬子模塊:
      • armvirt.c、armmmu.c、mmu/*.[ch]
    • 與具體CPU類型相關(guān)的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(又稱協(xié)處理器)模擬模塊:其主要任務(wù)是:完成各種協(xié)處理器的初始化;執(zhí)行各種協(xié)處理器的指令。實際上MMU/CACHE模擬模塊的一部分工作是模擬ARM的第15號協(xié)處理器,它的主要功能是配置MMU/CACHE等。主要的文件包括:
    • armcopro.c:根據(jù)配置信息,完成對ARM協(xié)處理器的初始化配置
    • xscale_copro.c:模擬xscale的協(xié)處理器cp13、cp14、cp15
    • sa_mmu.[ch]、arm7100_mmu.[ch]:模擬strongarm、ep7312的協(xié)處理器cp15
    • arm920t_mmu.[ch]:模擬arm920t的協(xié)處理器cp13、cp14、cp15
  • IO模擬宏模塊:本模塊包含各種邏輯行為各異的外設(shè)模擬,主要包括系統(tǒng)IO模擬模塊、網(wǎng)絡(luò)芯片模擬模塊、LCD模擬模塊等。
  • 系統(tǒng)IO模擬模塊:本模塊的主要任務(wù)包括:根據(jù)配置文件進行IO和外設(shè)初始化;完成各種外部IO設(shè)備的模擬(如時鐘計數(shù)器累加、產(chǎn)生中斷、LCD顯示等);進行各種特定CPU和外設(shè)的IO寄存器讀寫的模擬。本模塊與各種具體的開發(fā)板和CPU有很緊密的聯(lián)系,主要的文件包括:
    • armio.[ch]:建立在各個特定模擬子模塊上的抽象層模塊
    • skyeye_mach_at91.c:模擬Atmel AT91X40開發(fā)板
    • skyeye_mach_ep7312.c:模擬cirrus ep7312開發(fā)板
    • skyeye_mach_pxa.c:模擬intel xscale lubbock開發(fā)板
    • skyeye_mach_s3c4510b.c:模擬基于samsung s3c4510b的開發(fā)板
    • skyeye_mach_s3c44b0.c:模擬基于samsung s3c44b0的開發(fā)板
    • skyeye_mach_sa.c:模擬基于intel strongam的adsbitsy開發(fā)板
    • skyeye_mach_lpc.c:模擬基于philip lpc2249的開發(fā)板
    • skyeye_mach_sharp.c:模擬基于sharp lh7a400的開發(fā)板
    • skyeye_mach_at91rm92.c:模擬基于atmel at91rm9200的開發(fā)板
    • skyeye_mach_cs89712.c:模擬基于cs89712的開發(fā)板
  • 網(wǎng)絡(luò)芯片模擬模塊:本模塊主要完成了對8019AS網(wǎng)絡(luò)芯片的模擬工作,主要任務(wù)包括:模擬8019AS的控制邏輯、8019AS與具體開發(fā)板IO模擬模塊的接口、虛擬網(wǎng)絡(luò)輸入輸出接口處理。主要的文件包括:
    • skyeye-ne2k.[ch]:8019AS的硬件邏輯模擬
    • skyeye_mach_at91.c:部分內(nèi)容完成接收虛擬網(wǎng)絡(luò)輸入處理模擬
    • skyeye_net_tuntap.c:配置tuntap虛擬網(wǎng)絡(luò)的接口
    • skyeye_net_vnet.c:配置vnet虛擬網(wǎng)絡(luò)的接口
    • vnet.c、if_vnet.h:獨立存在的軟件包,vnet虛擬網(wǎng)絡(luò)的具體實現(xiàn)
  • LCD/TouchScreen模擬模塊:本模塊主要完成LCD/TouchScreen控制邏輯的模擬,是目前唯一需要GUI支持的模塊,它的主要任務(wù)是:配置LCD/TouchScreen硬件模擬、模擬LCD/TouchScreen控制邏輯。有關(guān)LCD/TouchScreen模擬相關(guān)的文件包括:
    • skyeye_lcd.[ch]: LCD/TouchScreen配置和LCD/TouchScreen模擬的通用控制邏輯
    • skyeye_mach_*.c:與開發(fā)板相關(guān)LCD/TouchScreen的控制邏輯和中斷處理,目前支持ep7312和pxa255的skyeye模擬。
  • MEMORY模擬模塊:本模塊與具體的CPU和開發(fā)板無關(guān),它的主要任務(wù)包括:根據(jù)配置文件進行內(nèi)存初始化,并加載binary image文件;進行RAM/ROM讀寫的模擬。主要的文件包括:
    • armmem.[ch]:主要完成RAM/ROM讀寫模擬




回頁首


三. SkyEye關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

SkyEye目標模擬模塊中,各種數(shù)據(jù)結(jié)構(gòu)很多,用于模擬硬件總體機構(gòu)定義的主要數(shù)據(jù)結(jié)構(gòu)有skyeye_config_t和ARMul_State。把握這兩個數(shù)據(jù)結(jié)構(gòu),是理解整個skyeye模擬的硬件體系結(jié)構(gòu)的關(guān)鍵,在這兩個數(shù)據(jù)結(jié)構(gòu)上進行進一步細化分析,則可充分了解skyeye的硬件體系結(jié)構(gòu)細節(jié)。

1. skyeye_config數(shù)據(jù)結(jié)構(gòu)

skyeye_config_t結(jié)構(gòu)描述了SkyEye模擬的整個硬件的靜態(tài)配置,它的具體內(nèi)容如下:

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結(jié)構(gòu)包含了CPU核心配置信息-cpu、開發(fā)板配置信息-mach、memory map 配置信息-mem、網(wǎng)絡(luò)芯片和網(wǎng)絡(luò)環(huán)境配置信息-net、面向主機的輸入輸出配置信息-uart、測試記錄輸出配置信息-log、模擬執(zhí)行起始地址配置信息-start_address、是否有LCD-no_lcd和記錄文件名信息-config_file。這里面與模擬硬件緊密相關(guān)的是CPU核心配置信息、開發(fā)板配置信息、memory map 配置信息、網(wǎng)絡(luò)芯片和網(wǎng)絡(luò)環(huán)境、LCD配置信息。

2. cpu_config_t數(shù)據(jù)結(jié)構(gòu)

描述CPU核心的結(jié)構(gòu)定義在cpu_config_t數(shù)據(jù)結(jié)構(gòu)中,具體內(nèi)容如下:

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體系結(jié)構(gòu)的名稱,根據(jù)ARM CPU內(nèi)核的發(fā)展,其體系結(jié)構(gòu)已經(jīng)從Version1發(fā)展到了Version5,其最新版本為Version5TE。而Intel在其基礎(chǔ)上又進行了自己的擴展體系結(jié)構(gòu)StrongARM(基于ARM version4)和XScale(基于ARM version5)。目前SkyEye支持"armv3"、"armv4"、"arm5"、"arm5TE"、"xscale"的體系結(jié)構(gòu)。
  • 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。操作系統(tǒng)根據(jù)這個ID來識別cpu的類型并執(zhí)行相關(guān)配置。
  • cpu_mask:這是用來確定process id的屏蔽位數(shù)。由于process id中的某些位用于其它目的,并不用來表示具體的CPU類型。實際上操作系統(tǒng)在確定CPU類型時用到的數(shù)字是cpu_val&cpu_mask。
  • cache_type:基于ARM內(nèi)核的CPU種類繁多,但如果根據(jù)CACHE類型來分,可分為三種:無CACHE類型、統(tǒng)一結(jié)構(gòu)CACHE類型和哈佛結(jié)構(gòu)CACHE類型。SkyEye支持這三種類型。統(tǒng)一結(jié)構(gòu)CACHE類型的CPU中,指令和數(shù)據(jù)共用同一個CACHE;而哈佛結(jié)構(gòu)CACHE類型的CPU中,存在相互獨立的數(shù)據(jù)CACHE和指令CACHE。無CACHE的CPU尺寸比有CACHE的CPU尺寸要小很多,成本上有優(yōu)勢,但在性能上要低于有CACHE的CPU。

SkyEye定義了一個cpu_config_t結(jié)構(gòu)的數(shù)組(位于skyeye_option.c中),結(jié)構(gòu)如下:

cpu_config_t arm_cpu[] = {
      {"armv3", "arm710",      0x41007100, 0xfff8ff00, DATACACHE},
      {"armv3", "arm7tdmi",   0x41007700, 0xfff8ff00, NONCACHE},
      {"armv4", "arm720t",     0x41807200, 0xffffff00,  DATACACHE},
      {"armv4", "sa1110",       0x6901b110, 0xfffffff0,   INSTCACHE},
      {"armv4", "sa1100",       0x4401a100, 0xffffffe0,   INSTCACHE},
      {"xscale", "xscale",         0x69052100, 0xfffffff0,   INSTCACHE}
};

3. machine_config_t數(shù)據(jù)結(jié)構(gòu)

machine_config_t結(jié)構(gòu)描述了開發(fā)板配置信息,定義在skyeye_config.h中,具體內(nèi)容如下:

typedef struct machine_config{
    const char *machine_name;  
    void (*mach_init)(ARMul_State *state,\
                      struct machine_config *this_mach);
    void (*mach_io_do_cycle)(ARMul_State *state);
    void (*mach_io_reset)(ARMul_State *state);
    void (*mach_update_int)(ARMul_State *state);
    ARMword (*mach_io_read_byte)(ARMul_State *state, ARMword addr);
    void (*mach_io_write_byte)(ARMul_State *state, ARMword addr,\   
                                 ARMword data);
    ARMword (*mach_io_read_halfword)(ARMul_State *state, \
                                           ARMword addr);
    void (*mach_io_write_halfword)(ARMul_State *state, ARMword addr,\
                                     ARMword data);
    ARMword (*mach_io_read_word)(ARMul_State *state, ARMword addr);
    void (*mach_io_write_word)(ARMul_State *state, ARMword addr,\   
                                 ARMword data);} machine_config_t;
}machine_config_t

其具體描述解釋如下:

  • machine_name:開發(fā)板的名稱。目前支持的開發(fā)板有:atmel的基于AT91X40 CPU的開發(fā)板、基于Cirrus Logic ep7312的開發(fā)板、基于Intel StrongARM的adsbitsy開發(fā)板、基于Intel XScale PXA25x的Lubbock開發(fā)板等。
  • mach_init:開發(fā)板初始化配置函數(shù),主要初始化一些與開發(fā)板相關(guān)的變量和配置mach_io_do_cycyle、mach_io_read/write_byte/halfword/word函數(shù)。mach_init函數(shù)被wrappe.c中的init函數(shù)調(diào)用。
  • mach_io_reset:開發(fā)板運行初始化函數(shù)。主要初始化與開發(fā)板相關(guān)的變量。
  • mach_update_int :定義了與開發(fā)板相關(guān)的中斷處理函數(shù)。
  • mach_io_read/write_*:分別定義與開發(fā)板相關(guān)的I/O函數(shù)。

SkyEye定義了一個machine_config_t結(jié)構(gòu)的數(shù)組(位于skyeye_option.c中),結(jié)構(gòu)如下:

machine_config_t arm_machines[] = {     
      {"at91",              at91_mach_init,          NULL, ......},
      {"ep7312",         ep7312_mach_init,      NULL, ......},
      {"s3c4510b",      s3c4510b_mach_init,  NULL, ......},
      {"s3c44b0",        s3c44b0_mach_init,    NULL, ......},
      {"sa1100",          sa1100_mach_init,      NULL, ......},
      {"pxa_lubbock",  pxa_mach_init,           NULL, ......} …… 
};

4. mem_config_t和mem_bank_t數(shù)據(jù)結(jié)構(gòu)

SkyEye的內(nèi)存映射配置結(jié)構(gòu)由mem_config_t和mem_bank_t數(shù)據(jù)結(jié)構(gòu)描述。ARM體系結(jié)構(gòu)與x86體系結(jié)構(gòu)在I/O內(nèi)存映射上有所不同。X86體系結(jié)構(gòu)可以使用I/O端口來映射外部設(shè)備上的寄存器和設(shè)備內(nèi)存;而ARM體系結(jié)構(gòu)是通過標準的memory地址空間來映射外設(shè)的寄存器或設(shè)備內(nèi)存,而且在通常情況下,I/O地址空間不會通過CACHE進行緩存。目前SkyEye支持三種類型的內(nèi)存映射:ROM SPACE(只讀)、RAM SPACE(可讀寫)、IO SPACE(可讀寫,與特定開發(fā)板相關(guān))。SkyEye對這三種類型的內(nèi)存映射的處理是不同的。在SkyEye中把一段連續(xù)的地址空間稱為一個mem_bank,多個mem_bank之間不一定連續(xù)。mem_config_t數(shù)據(jù)結(jié)構(gòu)的具體內(nèi)容如下:

typedef struct {
        int bank_num;
        int current_num;
        mem_bank_t mem_banks[MAX_BANK];
} mem_config_t;

其中 bank_num用來記錄當前的硬件配置中的mem_bank總數(shù),current_num是用于解析skyeye.conf中的mem_bank配置信息的一個輔助變量,mem_banks數(shù)組具體記錄了每個mem_bank的類型和相關(guān)的訪問函數(shù)。mem_bank_t數(shù)據(jù)結(jié)構(gòu)的具體內(nèi)容如下:

typedef struct mem_bank_t {
  ARMword (*read_byte)(ARMul_State *state, ARMword addr);
  void (*write_byte)(ARMul_State *state, ARMword addr, ARMword data);
  ARMword (*read_halfword)(ARMul_State *state, ARMword addr);
  void(*write_halfword)(ARMul_State *state, ARMword addr, ARMword data);
  ARMword (*read_word)(ARMul_State *state, ARMword addr);
  void (*write_word)(ARMul_State *state, ARMword addr, ARMword data);
  unsigned long   addr, len;
  char    filename[MAX_STR];
  unsigned type;
} mem_bank_t;

其中的read/write_* 函數(shù)指針分別對應(yīng)了不同類型內(nèi)存映射的訪問函數(shù);addr表示mem_bank的起始地址;len表示mem_bank_的大?。籪ilename是binary image文件名;type表示mem_bank的類型。函數(shù)指針賦值等配置過程由skyeye_options.c中的函數(shù)do_mem_bank_option完成。如果在skyeye.conf中存在binary image文件名,則do_mem_bank_option函數(shù)會把文件內(nèi)容讀入到對應(yīng)的mem_bank中。





回頁首


5. net_config_t數(shù)據(jù)結(jié)構(gòu)

SkyEye支持網(wǎng)絡(luò)模擬,目前描述網(wǎng)絡(luò)配置的數(shù)據(jù)結(jié)構(gòu)是net_config_t,它的具體內(nèi)容如下:

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表示網(wǎng)絡(luò)芯片工作,它為0表示網(wǎng)絡(luò)芯片不工作。
  • macaddr用來保存網(wǎng)絡(luò)芯片的mac地址
  • hostip用來保存主機上與SkyEye進行網(wǎng)絡(luò)通信所用的IP地址
  • ethmod:表示與主機的模擬網(wǎng)絡(luò)交互的方式;目前定義的交互方式有:
    • #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內(nèi)核模塊進行網(wǎng)絡(luò)交互)和 NET_MOD_TUNTAP(與linux的tun.on內(nèi)核模塊進行網(wǎng)絡(luò)交互)。

  • fd:表示SkyEye用于與主機進行網(wǎng)絡(luò)交互的設(shè)備文件描述符。
  • hubindex:用于NET_MOD_VNET方式,表示所處的是第幾個虛擬hub網(wǎng)段。如果它的值是i,則處于第i個hub網(wǎng)段中。
  • net_init/net_input/net_output:這三個函數(shù)與具體的模擬網(wǎng)絡(luò)交互方式有關(guān),分別完成初始化操作和與主機網(wǎng)絡(luò)的輸入輸出操作。相關(guān)的實現(xiàn)在文件skyeye_net_*.c中。

有關(guān)8019AS模擬芯片(NE2000兼容)的具體配置與實現(xiàn)位于文件skyeye-ne2k.[ch]中。有關(guān)網(wǎng)絡(luò)模擬的具體實現(xiàn)可參考錯誤!未找到引用源。節(jié)。

6. ARMul_State數(shù)據(jù)結(jié)構(gòu)

上面講述的是與SkyEye的硬件配置相關(guān)的數(shù)據(jù)結(jié)構(gòu),可以理解為一種靜態(tài)硬件配置的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)中的域基本不隨著SkyEye模擬硬件的運行而改變。而ARMul_State描述的是一種動態(tài)硬件配置的數(shù)據(jù)結(jié)構(gòu),它保存了隨著SkyEye模擬硬件的運行而時刻改變的硬件數(shù)據(jù)。由于ARMul_State中的域數(shù)量繁多,大體分為

  • 與CPU模擬相關(guān)的域
  • 與協(xié)處理器模擬相關(guān)的域
  • 與內(nèi)存和MMU/CACHE相關(guān)的域
    • 與統(tǒng)計相關(guān)的域
    • 與具體開發(fā)板相關(guān)的io部分

這里只描述其中關(guān)鍵的部分:

  • 與CPU模擬相關(guān)的域
    • ARMword Reg[16]:CPU當前模式下的寄存器值
    • ARMword RegBank[7][16]:CPU所有七種模式下的寄存器值
    • ARMword Cpsr:CPU的當前程序狀態(tài)寄存器
    • ARMword Spsr[7]:CPU所有七種模式下的程序狀態(tài)保存寄存器
    • ARMdword Accumulator:40bit的累加寄存器,目前用于xscale體系結(jié)構(gòu)中
    • ARMword NFlag, ZFlag, CFlag, VFlag, IFFlags, Sflag,TFlag:各種狀態(tài)位
    • ARMword Bank:CPU對應(yīng)模式寄存器組的索引值
    • ARMword Mode:CPU模式索引值
    • ARMword instr, pc:pc是目前正在執(zhí)行的程序指針,instr是pc所指地址的內(nèi)容
    • ARMword loaded, decoded:loaded是正在加載的指令,decoded是正在解碼的指令
    • unsigned NfiqSig:FIQ信號
    • unsigned NirqSig:IRQ信號
  • 與協(xié)處理器模擬相關(guān)的域
    • ARMul_CPInits *CPInit[16]:16個協(xié)處理器的初始化函數(shù)
    • ARMul_CPExits *CPExit[16]:16個協(xié)處理器的退出函數(shù)
    • ARMul_LDCs *LDC[16]:16個協(xié)處理器的LDC指令函數(shù)
    • ARMul_STCs *STC[16]:16個協(xié)處理器的STC指令函數(shù)
    • ARMul_MRCs *MRC[16]:16個協(xié)處理器的MRC指令函數(shù)
    • ARMul_MCRs *MCR[16]:16個協(xié)處理器的MCR指令函數(shù)
    • ARMul_CDPs *CDP[16]:16個協(xié)處理器的CDP指令函數(shù)
    • ARMul_CPReads *CPRead[16]:16個協(xié)處理器的讀CP寄存器函數(shù)
    • ARMul_CPWrites *CPWrite[16]:16個協(xié)處理器的寫CP寄存器函數(shù)
    • unsigned char *CPData[16]:16個協(xié)處理器的數(shù)據(jù)指針
    • ARMword CP14R0_CCD:在xscale體系結(jié)構(gòu)的CP14協(xié)處理器中,用于統(tǒng)計時鐘周期
  • 與內(nèi)存和MMU/CACHE相關(guān)的域
    • mmu_state_t mmu:mmu/cache的數(shù)據(jù)結(jié)構(gòu),在armmmu.h中定義,詳解請參考"SkyEye的MMU/CACHE和Memory模擬實現(xiàn)"一節(jié)
    • mem_state_t mem:memory的數(shù)據(jù)結(jié)構(gòu),在armmem.h中定義,詳解請參考"SkyEye的MMU/CACHE和Memory模擬實現(xiàn)"一節(jié)
  • 與統(tǒng)計相關(guān)的域
    • unsigned long NumScycles, NumNcycles, NumIcycles, NumCcycles, NumFcycles:用于統(tǒng)計不同狀態(tài)下的周期數(shù)
    • unsigned long NumInstrs:當前執(zhí)行的指令數(shù)

其它與特定CPU和開發(fā)板相關(guān)的各種io寄存器的定義放到了各個與開發(fā)板相關(guān)的文件中,如skyeye_mach_at91/ep7312/pxa/sa.c等處,詳解請參考"SkyEye的開發(fā)板IO模擬實現(xiàn)"。

與具體開發(fā)板相關(guān)的io部分
ARMul_io mach_io;
其中ARMul_io的結(jié)構(gòu)目前為

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是記錄當前的中斷狀態(tài)
net_flag判斷網(wǎng)絡(luò)選項是否打開
net_int用來記錄網(wǎng)絡(luò)中斷號
lcd_is_enable來記錄LCD是否使能
lcd_addr_begin記錄lcd顯存的起始位置
lcd_addr_end記錄顯存的結(jié)束位置

7. SkyEye邏輯執(zhí)行流程

了解SkEye的總體邏輯執(zhí)行流程,對了解硬件的體系結(jié)構(gòu)和軟件/硬件的接口有較大幫助。從總體上,可把SkyEye邏輯執(zhí)行流程按執(zhí)行的時間順序劃分為兩個階段:

1. SkyEye加載與配置處理過程

2. SkyEye模擬執(zhí)行過程

第一階段為第二階段的正常執(zhí)行做了充分的準備,具體的執(zhí)行內(nèi)容包括;

  • 讀入帶調(diào)試信息的操作系統(tǒng)執(zhí)行文件(由GDB完成)
  • 根據(jù)配置文件skyeye.conf的信息配置模擬硬件
  • 如果skyeye.conf中存在binary image格式文件,加載這些文件
  • 根據(jù)操作系統(tǒng)執(zhí)行文件的內(nèi)容加載調(diào)試信息(由GDB完成)
  • 根據(jù)操作系統(tǒng)執(zhí)行文件信息加載執(zhí)行文件中的代碼段和數(shù)據(jù)段等(由GDB完成)
  • 執(zhí)行相關(guān)模擬硬件的初始化函數(shù)

其中總的初始化函數(shù)是位于wrapper.c中的init函數(shù),它調(diào)用如下函數(shù)完成整個模擬硬件的初始化工作:

  1. ARMul_EmulateInit:初始化與執(zhí)行機器指令相關(guān)的數(shù)據(jù)ARMul_ImmedTable和ARMul_BitList
  2. ARMul_NewState:初始化結(jié)構(gòu)為ARMul_State的全局變量state
  3. skyeye_option_init:初始化全局變量skyeye_config
  4. skyeye_read_config:讀取配置文件skyeye.conf并根據(jù)配置文件進行相關(guān)配置
  5. nic_init:根據(jù)配置文件信息配置網(wǎng)絡(luò)模擬環(huán)境
  6. skyeye_config.mach->mach_init(state, skyeye_config.mach):根據(jù)配置文件信息配置CPU和開發(fā)板的相關(guān)I/O函數(shù)
  7. ARMul_Reset(state):進一步初始化全局變量state,并根據(jù)配置文件信息配置MMU/CACHE和memory
  8. io_reset:初始化特定CPU和開發(fā)板的IO寄存器

第二階段根據(jù)特定硬件的配置描述,開始執(zhí)行特定硬件模擬處理。整個過程圍繞CPU執(zhí)行指令展開,根據(jù)模擬硬件可分為如下幾個階段:

  • CPU執(zhí)行三級流水線處理,即取指令、譯碼、執(zhí)行指令,主要處理集中在armemu.c中的ARMul_Emulate32/26函數(shù)。
  • 在執(zhí)行指令過程中,如果有中斷產(chǎn)生,CPU調(diào)整運行模式,并改變指令指向中斷向量起始地址,主要處理集中在arminit.c中的函數(shù)ARMul_Abort函數(shù)、armemu.c中的ARMul_Emulate32/26函數(shù)。
  • 在執(zhí)行指令過程中,如果指令是協(xié)處理器指令,則把指令轉(zhuǎn)交給協(xié)處理器模擬模塊進行進一步處理,主要處理集中在文件armcopro.c、xscale_copro.c等文件中。
  • 在執(zhí)行指令過程中,如果發(fā)現(xiàn)指令是訪問內(nèi)存/IO的指令,則根據(jù)SkyEye模擬的特定CPU是否有MMU/CACHE分別進行處理:
    • 如果CPU有MMU/CACHE,則進入MMU/CACHE模擬模塊,如果還需要內(nèi)存訪問,則進入memory模擬模塊處理。如果訪問地址屬于IO地址空間,則轉(zhuǎn)到特定CPU和開發(fā)板的IO模擬模塊處理。
    • 如果CPU沒有MMU/CACHE,則直接進入memory模擬模塊處理。如果訪問地址屬于IO地址空間,則轉(zhuǎn)到特定CPU和開發(fā)板的IO模擬模塊處理。

處理訪問內(nèi)存/IO的指令的相關(guān)內(nèi)容集中在armvirt.c;與MMU/CACHE處理、read/write buffer(用于StrongARM和XScale體系結(jié)構(gòu)的模擬)處理相關(guān)的文件包括armmmu.[ch]、mmu/*.[ch];與訪問memory模擬有關(guān)的內(nèi)容主要集中在armmem.[ch]中。

  • 如果要執(zhí)行IO地址訪問,這具體的處理過程由特定CPU和開發(fā)板IO模擬模塊中的read/write_byte/halfword/word函數(shù)處理。
    • 為了模擬外設(shè)的執(zhí)行,在執(zhí)行指令過程的每一個周期,會執(zhí)行一個io_do_cycle函數(shù),它會調(diào)用特定CPU和開發(fā)板的IO模擬模塊中的*_io_do_cycle函數(shù),完成對時鐘、網(wǎng)絡(luò)輸入輸出、UART輸入輸出等的處理,并根據(jù)條件產(chǎn)生中斷信號。

下一篇文章將討論 CPU/開發(fā)板仿真。



參考資料



關(guān)于作者

陳渝, 清華大學(xué),通過 yuchen@tsinghua.edu.cn 可以和他聯(lián)系。

posted on 2007-03-12 16:36 陳長虹 閱讀(374) 評論(0)  編輯 收藏 引用 所屬分類: Linux

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品乱码久久久久久按摩观 | 欧美成人午夜激情在线| 性欧美大战久久久久久久免费观看 | 激情欧美一区二区三区在线观看| 亚洲自拍偷拍视频| 欧美综合国产| 樱桃视频在线观看一区| 免费视频一区| 一本久道久久综合中文字幕| 一区二区电影免费观看| 欧美色精品在线视频| 亚洲欧美日韩在线一区| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美综合精品久久成人| 99精品视频免费观看视频| 久久亚洲不卡| 亚洲视频在线观看一区| 精久久久久久久久久久| 伊人久久成人| 宅男噜噜噜66国产日韩在线观看| 国产精品99久久99久久久二8 | 欧美—级在线免费片| 欧美综合国产| 一区二区欧美精品| 亚洲一区日韩| 亚洲日韩成人| 欧美a一区二区| 亚洲一区影音先锋| 在线播放一区| 亚洲视频一区| 在线成人欧美| 亚洲免费视频一区二区| 亚洲日韩欧美视频| 亚洲欧美影院| 一本色道久久综合亚洲精品婷婷 | 亚洲国产日韩一区| 先锋资源久久| 亚洲清纯自拍| 久久精品视频免费观看| 亚洲影院免费观看| 免费看黄裸体一级大秀欧美| 国产精品久久网站| 欧美丝袜一区二区三区| 国内精品一区二区三区| 狠狠色2019综合网| 日韩亚洲欧美综合| 99精品国产高清一区二区| 夜夜爽99久久国产综合精品女不卡| 欧美中文字幕在线| 国产精品午夜在线观看| 国产精品性做久久久久久| 在线看片一区| 亚洲电影在线播放| 国产精品午夜在线| 亚洲午夜日本在线观看| 99www免费人成精品| 久久这里只有精品视频首页| 亚洲视频免费在线| 欧美一级淫片播放口| 久久国产视频网站| 久久久夜精品| 欧美成人日韩| 亚洲激情校园春色| 日韩一本二本av| 欧美a级片一区| 久久阴道视频| 欧美精品成人| 日韩一级裸体免费视频| 亚洲国产一区二区三区青草影视| 久久久精品2019中文字幕神马| 国产视频在线观看一区 | 欧美日韩激情网| 国产欧美日韩综合一区在线播放 | 欧美在线播放一区| 免费成人av在线| 亚洲精品少妇30p| 欧美一级久久久| 国产精品有限公司| 在线欧美日韩国产| 免费视频一区| 能在线观看的日韩av| 亚洲精品国精品久久99热一| 亚洲国产欧美一区二区三区同亚洲| 欧美成人一品| 亚洲一区二区三区色| 亚洲曰本av电影| 在线免费不卡视频| 一二美女精品欧洲| 国产一区二区三区自拍 | 欧美伊久线香蕉线新在线| 午夜视频一区在线观看| 欧美高清在线视频| 国产精品一区二区在线观看不卡| 欧美一区二区三区视频在线观看 | 国产精品高清网站| 欧美成人有码| 午夜视频在线观看一区二区三区| 在线性视频日韩欧美| 亚洲在线视频观看| 午夜精品久久久久久久蜜桃app| 一区二区三区欧美| 久久午夜影视| 国产综合婷婷| 可以免费看不卡的av网站| 亚洲国产精品电影| 亚洲综合精品四区| 国内精品久久久| 欧美高清视频在线| 亚洲一区自拍| 亚洲精品资源| 亚洲激情国产| 夜夜爽av福利精品导航| 国产精品久久久久久久久动漫| 久久久91精品| 久久成人18免费网站| 亚洲午夜高清视频| 欧美诱惑福利视频| 亚洲欧美在线免费| 午夜日韩在线| 久久riav二区三区| 久久久夜色精品亚洲| 在线播放精品| 激情六月婷婷综合| 国产在线一区二区三区四区 | 亚洲午夜精品久久| 亚洲毛片播放| 亚洲调教视频在线观看| 性欧美videos另类喷潮| 久久综合久久综合久久综合| 久久亚洲欧美国产精品乐播| 久久精品国产综合精品| 另类激情亚洲| 久久在线免费| 亚洲靠逼com| 亚洲自拍偷拍福利| 麻豆精品一区二区综合av| 99综合在线| 亚洲一区二区精品在线观看| 一区二区三区久久网| 亚洲欧美999| 欧美紧缚bdsm在线视频| 欧美精品在线视频观看| 免费久久久一本精品久久区| 久久野战av| 国产精品www| 久久亚洲欧洲| 欧美精品在线视频| 国产精品免费区二区三区观看| 国产精品综合久久久| 中文久久精品| 久久综合给合久久狠狠狠97色69| 欧美va亚洲va香蕉在线| 亚洲在线观看免费视频| 欧美大尺度在线| 老司机免费视频久久| 亚洲一区图片| 另类激情亚洲| 久久亚洲捆绑美女| 国产精品国产成人国产三级| 国语自产精品视频在线看| 亚洲一区二区3| 亚洲私人黄色宅男| 欧美激情精品久久久| 国内激情久久| 亚洲另类在线一区| 日韩亚洲欧美一区二区三区| 亚洲国产精品v| 久久免费精品视频| 黑人操亚洲美女惩罚| 亚洲国产另类久久久精品极度 | 蜜臀久久久99精品久久久久久| 欧美日韩亚洲一区二区| 国产精品亚洲欧美| 欧美11—12娇小xxxx| 一区二区三区在线视频观看| 欧美一区二区三区免费视频| 欧美成年网站| 欧美日本在线| 久久九九热re6这里有精品| 欧美在线免费观看视频| 亚洲在线不卡| 亚洲国产一区二区三区青草影视| 欧美jjzz| 国产精品久久激情| 欧美国产日韩一区二区三区| 欧美在线视频免费| 香蕉久久夜色精品国产| 国产一区二区成人| 一区二区三区久久久| 国产一区日韩一区| 亚洲精品在线观| 日韩视频在线一区二区三区| 中文在线资源观看视频网站免费不卡| 国产精品中文字幕欧美| 西瓜成人精品人成网站| 欧美色偷偷大香| 欧美成人一区二区三区在线观看| 国产精品看片你懂得| 亚洲香蕉在线观看| 日韩午夜视频在线观看|