实验,7-1,WinCE启动与跟踪调试实验.pdf

1 实验 7 1 WinCE 启动过程与跟踪调试实验 一 一 WinCE 启动过程分析启动过程分析 第第 1 步步 启动 Source Insight 程序 新建一个 xsabse270 工程 分别将下列目录下的所有文件 添加到工程中 PLATROOT Xsbase270 src PUBLICROOT common src soc pxa27x ms v1 Inc PLATROOT common src Inc PLATROOT common src common 第第 2 步步 打开 PLATROOT Xsbase270 Src Common Startup Startup s 定位系统初始 化启动函数 Startup 分析 Startup 函数的对平台初始化处理过程 然后定位到调用函数 OALStartup 第第 3 步步 打 开 PLATROOT Xsbase270 Src Oal OalLib Startup s 定 位 并 分 析 OALStartup的功能 同时查找g oalAddressTable变量的内容 PLATROOT xsbase270 src Inc Oemaddrtab cfg inc 2 第 4 步第 4 步 利用文本编辑器打开 PRIVATEROOT WINCEOS COREOS NK LDR ARM armstart s 文 件 在 KernelStart 函数中分别定位到调用 ARMInit 初始化和转跳到 kernel dll 入口的位置 并分析 KernelStart 函数的基本作用 PRIVATEROOT WINCEOS COREOS NK LDR ARM armstart s LEAF ENTRY KernelStart continue initialization in C add r0 sp KData KStack r0 ptr to KDataStruct str r6 r0 pAddrMap store VA of OEMAddressTable in KData bl ARMInit call C function to per the rest of initializations upon return r0 entry point of kernel dll mov r12 r0 ldr r0 KData mov pc r12 jump to entry of kernel dll VirtualStart DCD VStart ENTRY END KernelStart 第第 5 步步 利用文本编辑器打开 PRIVATEROOT WINCEOS COREOS NK KERNEL ARM mdarm c文 件 根据源代码注释分析NKStartup函数作用 然后定位到OEMInitDebugSerial OEMInit KernelStart 函数的位置 3 PRIVATEROOT WINCEOS COREOS NK KERNEL ARM mdarm c void NKStartup struct KDataStruct pKData 1 pickup arguments from the nk loader 2 find entry of oal 3 setup vectors UC mappings mode stacks etc ARMSetup 4 common startup code OEMInitDebugSerial debugchk only works after we have something to print to OEMInit initialize firmware I KernelFindMemory DEBUGMSG 1 TEXT NKStartup done starting up kernel r n KernelStart never returned DEBUGCHK 0 第第 6 步步 利用文本编辑器打开 PRIVATEROOT WINCEOS COREOS NK OEMSTUB oemstub c文 件 分析 OEMInitDebugSerial OEMInit 两个函数的调用过程 void OEMInitDebugSerial void g pOemGlobal pfnInitDebugSerial void OEMInit void g pOemGlobal pfnInitPlat 第第 6 步步 利用文本编辑器打开 PRIVATEROOT WINCEOS COREOS NK OEMMAIN oemglobal c文 件 利用 PB 帮助文件分析OEMGLOBAL 结构体的作用和内容 并定位 OEMInitDebugSerial OEMInit 两个函数所对应的函数指针 static OEMGLOBAL OemGlobal MAKELONG CE MINOR VER CE MAJOR VER DWORD dwVersion 4 initialization OEMInitDebugSerial PFN InitDebugSerial pfnInitDebugSerial OEMInit PFN InitPlat pfnInitPlat 第第 7 步步 打开 PLATROOT xsbase270 src kernel Oal Init c 文件 分别定位OEMGLOBAL 结构体中 OEMInitDebugSerial 和 OEMInit 函数指针所对应的函数实际位置 分析在这两个 函数中调用其他函数的作用及其功能 第第 8 步步 查找并定位在 OEMInit 函数中调用的函数 OALIntrInit RTC4513 Init OALTimerInit KITLIoctlt 实现文件 并分析函数的实现功能及其调用的函数 5 第第 9 步步 利用文本编辑器打开 PRIVATEROOT WINCEOS COREOS NK KERNEL ARM armtrap s 文件 查找该文件中的 KernelStart 函数 然后定位到内核初始化函数 KernelInit 函数和 跳转第一个调度函数 FirtSchedule LEAF ENTRY KernelStart ldr r4 KData r4 ptr to KDataStruct ldr r0 APIRet str r0 r4 pAPIReturn set API return address mov r1 SVC MODE msr cpsr c r1 switch to Supervisor Mode w IRQs enabled CALL KernelInit initialize scheduler etc mov r0 0 no current thread mov r1 ID RESCHEDULE b FirstSchedule ENTRY END 第第 10 步步 打开 PRIVATEROOT WINCEOS COREOS NK KERNEL nkinit c 文件 查找该文件 中 KernelInit 函数 分析该函数的作用 void KernelInit void ifdef DEBUG g pNKGlobal pfnWriteDebugString TEXT Windows CE KernelInit r n endif APICallInit setup API set HeapInit setup kernel heap InitMemoryPool setup physical memory PROCInit initialize process VMInit g pprcNK setup VM for kernel THRDInit initialize threads MapfileInit ifdef DEBUG g pNKGlobal pfnWriteDebugString TEXT Scheduling the first thread r n endif 第第 11 步步 打开 PRIVATEROOT WINCEOS COREOS NK KERNEL ARM armtrap s文件 查找该文件的 FirstSchedule 标号地址 标号地址处通过调用HandleException函数进行系统调度 调度第 一个系统线程 SystemStartupFunc FirstSchedule 20 msr cpsr c SVC MODE enable interrupts CALL HandleException ldr r2 r0 TcxPsr r2 target status and r1 r2 0 x1f r1 target mode cmp r1 USER MODE 6 cmpne r1 SYSTEM MODE bne F30 not going back to user or system mode add r0 r0 TcxR3 ldmia r0 r3 r14 reload user system mode registers ldr r1 KData msr cpsr c SVC MODE OR 0 x80 disable all interrupts ldrb r1 r1 bResched r1 nest level reschedule flag cmp r1 1 mov r1 ID RESCHEDULE beq B20 interrupted reschedule again msr spsr r2 ldr lr r0 TcxPc TcxR3 ldmdb r0 r0 r2 movs pc lr return to user or system mode 第第 12 步 步 打开 PRIVATEROOT WINCEOS COREOS NK KERNEL schedule c文件 查找该文件的 SystemStartupFunc 函数 该函数作内核最后初始化 然后调用 KernelIoctl 函数 给 OEM 硬件作最后初始化 并创建装载文件系统 filesys dll 的线程 RunApps 最后进入整个系统 的启动过程 While 循环 void SystemStartupFunc ulong param KernelInit2 VERIFY LoaderInit initialize the compiler GS cookie this must happen before other threads start running security init cookie PagePoolInit This can only be done after the loader initialization LoggerInit Initialization for CeLog profiler code coverage etc SysDebugInit initialize System Debugger HW Debug stub Kernel dump capture SW Kernel Debug stub do this now so that we continue running after we ve created the new thread ifdef START KERNEL MONITOR THREAD hTh CreateKernelThread Monitor1 0 THREAD RT PRIORITY ABOVE NORMAL 0 HNDLCloseHandle g pprcNK hTh endif Give the OEM a final chance to do a more