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函数处理。