wince6移植之内核启动

      到目前,我移植的s3c2440bsp在wince6下可以跑到oeminit了,并且已经跑完。下面的事情似乎就是移植相关的drivers了。
      其实从可以编译nk.nb0到可以跑完oal没有什么太多要做的事情。首先调整了下config.bib文件中的nk的地址,以至于可以让原来现成的bootloader与其配套。修改debug.c中的调试串口的初始化,由于代码中用的是uart1,而我现在板子上要用uart0。
      在这里主要简单说下wince6内核的启动过程:
在bootloader加载内核到指定地址,并跳到内核中运行的时候,WINCE600\PLATFORM\SMDK2440\Src\oal\oallib下的startup.s文件中便包含了第一条要执行的命令。进行一些硬件的初始化(看门狗,中断,和时钟等),然后就是直接跳到KernelStart(此处kernelstart,我的理解是kernel.dll的入口,而并非armtrap.s中的kernelstart)。
     下面就是进入内核了,传说中的kernel.dll。NKStartup是这个文件的入口函数。具体实现在WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM下的mdarm.c中。在这里有调用OEMInitDebugSerial,OEMInit。在这个函数的最后调用了一个KernelStart()。
     KernelStart的实现在WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM下的armtrap.s文件中。在这里call了一个KernelInit和跳到FirstSchedule处执行调度第一个进程。
KernelInit函数在WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL下的nkinit.c中,主要是为内核启动做准备。调用的函数有APICallInit ();HeapInit ();InitMemoryPool ();PROCInit ();VMInit (g_pprcNK);THRDInit ();MapfileInit ();以后有空再详细分析下这几个函数。
     可惜我的nk跑着跑着出现了一个abort,在gwes中,郁闷!

你可能感兴趣的:(启动,内核,移植,休闲,wince6)