KITL内核独立传输层,它的设计目标就是更方便地为WINCE用户提供支持各种调试服务。在6.0中与实现KITL功能有关的3个部分的源代码分3个目录为止存放。
1.private部分。起源代码存放目录是D:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KITL,这部分源代码是与具体硬件平台及KITL功能端口的设备类型无关的KITL传输协议,由微软负责开发维护,OEM用户一般不用改动。
2.HAL部分。源代码位于D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\KITL。这部分代码的函数都以OAL为函数名前缀,但是为了避免与操作系统的OAL模块混淆,这里用HAL命名。这部分代码与硬件有关,但不是与用户的特定硬件平台相关,实际上是微软将KITL功能传输端口的带有共性的内容抽取出来,以减轻OEM的工作开发量。
3.OEM部分。源代码存放目录是D:\WINCE600\PLATFORM\Micro2440\SRC\KITL,这部分才是需要OEM用户实现的与特定硬件平台相关的操作KITL传输端口的底层代码。
从6.0 开始,KITL模块单独构成一个动态链接库,在5.0以前的版本它只是OAL.EXE模块的一部分。以DeviceEmulator为例,它的KITL模块的动态链接库文件为kitlethernet.dll,以下是位于D:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\KITL\ETHERNET\DLL的指导wince的编译系统链接生成这个动态链接库的source工程文件的内容:
SYNCHRONIZE_DRAIN=1
RELEASETYPE=PLATFORM
TARGETNAME=kitlethernet
TARGETTYPE=DYNLINK
DLLENTRY=KitlDllMain
DEFFILE=
NOLIBC=1
LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO
SOURCES=\
..\args.c \
..\kitl.c \
..\name.c
TARGETLIBS=\
$(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\kitlcore.lib \
$(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\nkstub.lib \
$(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\oemstub.lib \
$(_PLATCOMMONLIB)\$(_CPUDEPPATH)\kitl_log.lib \
$(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_kitl.lib \
$(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_ethdrv_cs8900a.lib \
$(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_memory_arm.lib \
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ddk_io.lib \
$(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\vbridge.lib \
$(_TARGETPLATROOT)\lib\$(_CPUDEPPATH)\smflashk_lib.lib \
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib
以上的source工程文件可以看出:
首先DeviceEmulator的KITL模块的动态链接库命名为kitlethernet.dll;
其次这个动态链接库的入口点函数为KitlDllMain.
最后TARGETLIBS项的内容列出了所有的用于构造这个KITL模块动态链接库所需的静态库文件。其中的大多数是通用功能的静态库,而oal_kitl.lib库就是对应着前述的HAL部分的KITL源代码,kitlcore.lib库则对应Private部分的KITL源代码。
整个过程实际上就是:在开发机上,由Platform Builder提供的相关组件导出一些KITL传输时需要依赖的API函数的一个独立的DLL动态库,同时为了使KITL知道并使用这个DLL库中定义的关于传输功能端口,DLL动态库需要在桌面系统进行注册。在目标设备中,它被内置到OAL也就是内核中。早运行WINCE的目标设备上,KITL依赖于一些特定传输端口,这些传输端口都支持相关调试服务的API函数调用。
在实际开发中,尤其是当需要内核调试时,KITL的服务是必不可少的。下面介绍KITL的四大功能,在调试的初期非常有用。
(1)在最终的成品设备中,KITL还是能够按特定的要求被加载。
(2)KITL使用WINDOWS桌面系统定时器数据包让DHCP服务器为连接的设备重新分配IP地址。如果KITL的功能被打开,并且设备进入了挂起状态,那么相关的调试信息在设备的电源开关关闭之前将会被重定向到串口实现。
(3)电源处理工作可以再KITL中实现
(4)可以使用IOCTL_KITL_GEI_INFO来获取当前KITL的硬件信息,比如在数据传输过程中使用,传送的相关参数,驱动程序加载失败,这些信息有很大的参考价值。