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