备注:这里的内核指kernel,其表现形式为kernel.dll,OS指操作系统,core指核心。
图1 WINCE6.0体系结构
1. kernel的组成和功能
WINCE6.0操作系统内(kernel)在代码中的表现形式是kernel.dll(也就是kern.dll), WINCE5.0中内核的表现形式为NK.exe,而WINCE6.0中的NK.exe中仅仅包含一些OAL代码和保持兼容性的程序了。
内核提供任何WINCE6.0设备的基本OS功能,这些基本功能包括进程、线程和内存管理,另外内核也提供一些文件管理功能、线程调度、实时性能、装载器(loader)、系统调用、电源管理和OS提供的多种多样的服务。内核服务(service)使应用程序可以使用这些核心(core)功能。
NK.exe是OAL层的进程,在OAL层启动的过程中加载kernel.dll。使用内核进程和线程函数可以创建、终止、同步进程和线程,并且可以调度和挂起线程。进程是正在运行的程序(比如iexplore.exe)的单个实例,这样使得同时可以运行多个程序,对于WINCE5.0来说能够同时运行的进程是32个,假如我们同时打开多个Internet Explorer浏览器(对应一个iexplore.exe),那这时内存中就相应有多个浏览器的进程,所以WINCE5.0操作系统如果要应用在网络系统,尤其是同时运行多进程的系统中并不是很好的选择。WINCE6.0支持同时运行的进程数达到32000个,就基本不存在这方面应用的限制。线程使得程序一次可以执行多个任务,因为一个程序可以创建多个线程。线程优先等级、优先级继承、中断支持、和计时(timing)与调用也都是内核包含的功能。内核的所有功能共同为对时间要求很严格的系提供实时应用。
WINCE内核基于页式虚拟内存系统(virtual-memory system)来管理和分配应用内存,虚拟内存系统提供连续的大小为64KB内存块,每块的大小为4KB,所以应用程序不需要管理内存的分配。如果一个应用程序需要使用小于64KB的内存,那么它可以使用局部堆(local heap)或是创建独立的堆来提供内存空间。内核也要为每个新的进程或线程分配栈(stack)空间。
内核使用内存函数来分配和释放虚拟内存,可以使用local堆和独立堆的内存,可以从栈中分配内存,也可以使用装载应用程序所需要分配但又没有使用的静态数据库内存。而且进程可以使用内存映射对象(memory-mapped object)来共享数据。
2. Kernel.dll的编译生成
在common.bib文件中可以找到下面的内容:
IF IMGPROFILER !
kernel.dll $(_FLATRELEASEDIR)\kern.dll NK SHZ
ENDIF IMGPROFILER !
可知kernel.dll实际就是kern.dll,那kern.dll在哪里生成的呢?没有找到和kern.dll相关的sources文件,但在\WINCE600\PUBLIC\COMMON\CESYSGEN\makefile文件中,从下面的内容可以看到kern.dll是如何编译生成的
图2 指示生成kern.dll的makefile内容