Gdb/Armulator 源代码分析
--àsim_fetch_register(-1) /*此函数指针是在将current_target指向sim时,通过注册target_ops 结构完成挂接的*/
sim_fetch_register (sd, rn, memory, length)
{
ARMword regval;
init (); file://就在这,Amulator进行了初始化
…
}
至此Armulator被装载完毕,其后Gdb就是通过target_ops(定义在target.h)结构中的各个函数指针来完成对它的调试工.
B. Armulator 内
部机制
a. 初始化
从上述可知整个模拟器的初始化入口是在wrapper.c中的init( )函数,那么它到底又做了些什么呢?
(原始的Gdb5.0中的Armulator是模拟ARM7DTMI 的,而补丁代码修改了memory map 并添加了timer 和uart 的IO能力使其能够模拟AT91.因为后者是对前者的增强,所以我们的分析以后者为准)
Once the armulator to reset ,the ARMul_NewState will be called.And its task is to malloc a ARMul_state stuct which saves the armulator’s states and initialize it .And the ARMul_MemoryInit() will malloc 4m ram for you.
#1 static void
#2 init ()
#3
#4 static int done;
#5 if (!done)
#6 {
#7 ARMul_EmulateInit (); file://Call this routine once to set up the emulator's tables.
#8 state = ARMul_NewState ();
#9 state->bigendSig = (big_endian ? HIGH : LOW);
#10 RMul_MemoryInit (state, mem_size); file://原始代码中的内存初始,但现在无用
#11 ARMul_OSInit (state); file://预装系统初始化
#12 ARMul_CoProInit (state); file://协处理器初始
#13 state->verbose = verbosity;
#14 done = 1;
#15 file://the below is added for AT91
#16 ARMul_SelectProcessor(state, ARM600);
#17 ARMul_SetCPSR(state, USER32MODE);
#18 ARMul_Reset(state);
#19 }
#20 }
因为这是补丁代码,难免又冗余出现,实际10-11行的两处掉用是没有实际意义的,而12行是协处理器的初始化,因为并没又模拟协处理器所以此处只是以备扩展.
重点的初始化过程是在ARMul_NewState(…)中的.首先它给模拟器的核心状态结构ARMul_State分配了空间,这个结构里保存了Armulator的所有方面的状态,包括arm寄存器,流水线状态等等.
并赋予初值,我们以后就用state表示之.然后调用ARMul_Reset(…)进行更近一步的设置.而后者又主要完成模拟器内存结构的分配和rom映象的加载--/sim/arm/armmem.c/mem_reset(…),IO设备的状态初始—/sim/arm/armio.c/io_reset(…),你也
《Gdb/Armulator 源代码分析(第2页)》