1.编辑阶段
Windows CE .NET 的编译分为4 个阶段。
(1)CESYSGEN 编译阶段
这是编译的第一阶段,由 sysgen.bat 完成。这部分首先将用户在定制平台时排除在外的系统功能所对应的文件从编译的列表中剔除,保留和定制功能相关的头文件、def 文件以及.lib文件,这些文件将被用来编译成DLL 以及在后续编译过程中所产生的其他文件。此外,被处理过的头文件和库文件可以被用来导出平台SDK。
在 IDE 集成开发环境中,这个部分有两个名称:generate system headers 和re-generatesystem headers。实际上它们的功能是一样的。re-generate system headers 首先把已经存在的头文件等全部删除,然后在重新过滤文件,再进行处理。re-generate system headers 将花去很多时间,但是当用户重新配置了系统结构后,这样做还是有必要的。当用户已经设置完系统配置后,本阶段编译并不是每次编译操作系统时都需要进行的。
图 19 是本阶段编译的示意图。
(2)BSP 编译阶段
这个阶段的编译由 Build.exe 完成。此阶段以后的编译过程将占据绝大部分的编译时间。
编译器将编译内核、图形界面模块、事件子系统、OEM 适配层的源代码,并且将这些部分和BSP 编译出的文件链接在一起。这些模块是和硬件平台息息相关的,因此必须得到BSP 的支持。内核模块和OAL 相链接,产生nk.exe。在本阶段中将使用到一组特殊的文件,这些文件将指导如何进行编译,并且决定哪些文件是需要被编译和链接的。DIRS 将指示从哪些路径寻找需要编译的文件。SOURCES 文件定义了那些文件是需要被编译,如何被编译的。这两个文件都只是文本文件,但是它们描述了大量编译过程的信息。这两个文件的格式都是基于makefile 文件的。DIRS 文件可以简单地等同于类似Visual C++环境中的workspace。而SOURCES 文件可以看作是工程文件。SOURCES 文件相对比较复杂,但是它基本上设置了各模块的编译和链接顺序以及所要包含和编译的源文件。
下面是 kaola BSP 下DIR 文件的内容:
DIRS= /
drivers/
gwe/
kernel /
pmu
以上列出了在本阶段编译时,要扫描的目录项。在编译器进入这些目录后,再扫描这些目录中的DIR 文件或者是SOURCES 文件(两者选其一),从而进行递归扫描所有的目录。
(3)BUILDREL 编译阶段
这个阶段主要由BuildRel.BAT 文件完成。它将前两个阶段编译生成的目标文件、EXE 或者DLL 文件,从它们各自的目录中复制到为编译image 而准备的release(_FLATRELEASEDIR)目录中。BSP 下的目标文件和子目录将被复制的目标文件夹下以获得前一阶段编译的各模块的中间文件。在集成开发环境中,操作系统的整体编译将在所有需要的文件被复制到_FLATRELEASEDIR目录后执行。
(4)MAKEIMG 编译阶段
这个阶段由 makeimg.exe 文件执行,这是最终的编译阶段,它将所有的二进制文件链接到一起,生成适合特定平台的操作系统镜像文件。本阶段根据配置处理所有release 目录下的文件。同样它还要寻找处理所有模块中XIP 的问题。
本编译阶段主要由 3 个子阶段组成。
第一阶段将各种的配置文件整合到一起,比如BIB、DAT、REG、DB 等,针对每种配置文件,整合的信息将存放到一个master 文件中。表1 显示了这些文件和对应的master文件。
表 1 各种配置文件和相应的master 文件
源 文 件 |
Merged master文件 |
Description |
Common.bib, Config.bib, Project.bib, latform.bib |
Ce.bib |
描述了将要被链接到操作系统镜像文件中的Windows CE 文件
|
Common.reg, Project.reg, Platform.reg
|
Reginit.ini |
提供了操作系统镜像文件的注册表入口点
|
Common.dat, Project.dat, Platform.dat
|
Initobj.dat |
提供了对操作系统镜像文件以及各种目录的描述
|
Common.db, Project.db, Platform.db
|
Initdb.ini |
定义了Windows CE 对象存储
|
在第二个子阶段中,makeimg 将用LOC 文件中指定的EXE 和DLL 模块来替换当前指定的模块。在资源被更新以后,makeimg 将启动RomImage 进入第三个编译子阶段。
在第三个子阶段中将链接并且定位所有 XIP 文件。同时建立ROM 文件系统的镜像文件。
这个文件系统将最终被整合到Windows CE 的统一文件系统中。在Windows CE 启动以后,所有/Windows 下的文件都是对应ROM 文件系统的。RomImage 将最终建立NK.BIN 镜像文件。这个镜像文件可以是SRE 格式或者BIN 格式,它们都能被编程器解释后下载到目标机中运行。SRE 是基于ASCII Hex 的文件格式,在嵌入式系统中被广泛使用;BIN 格式文件是微软公司提供的类似于SRE 的二进制文件格式。
2.编译中的配置文件解释
(1)REG 文件
Windows CE .NET 编译过程中使用的REG 文件和其他Windows 系统上的几乎一样。主要的区别在于REG version marker 从文件头上被删除了,这样做的理由是防止将默认的REG 文件直接整合到定制的平台中。因为如果REG version marker,保留的话,双击REG 文件的图标将直接把默认的REG 文件直接整合到定制的平台中,而不是编辑这个文件。
下面是注册表文件的内容样例,键被用括弧括起来,其下有子键并且已经被赋值,还有数据类型和默认值。
; StrataFlash block driver.
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/StrataFMD]
"MemBase"=dword:b8380000
"MemLen"=dword:01f80000
; PCMCIA Driver
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/PCMCIA]
"Dll"="PCMCIA.dll"
"Order"=dword:0
"IClass"=multi_sz:"{6BEAB08A-8914-42fd-B33F-61968B9AAB32}=PCMCIA
Card Services"
以上是节选自平台的注册表文件内容。在这段代码中定义了两种设备的驱动信息:Flash和PCMCIA 设备驱动。在 Flash 的键下是MemBase 和MemLen 子键。MemBase 代表Flash 的物理起始地址8380000,MemLen 定义了Flash 的容量,1f80000 也就是32MB。PCMCIA 驱动中,驱动程序位于PCMCIA.dll 的动态链接库中,并且定义了代表该设备的ICLASS 和GUID。
(2)BIB 文件
ROMIMAGE 使用Binary Image Builder(BIB)文件来配置ROM 文件系统。BIB 文件是文本格式的文件,其中使用了不同的关键词来定义不同的section。以关键词 MODULES 开头的是模块section,其中列出了XIP 的可执行文件。以关键词 FILE 开头的是其他需要被加入镜像的文件section。这些文件包括bitmaps、data file 和HTML pages)。同时也可以描述非XIP 的可执行模块。在FILE 中罗列的文件,默认是被压缩的,以减少空间占用。
下面是对 BIB 文件结构的描述:
<Target Name> <Whitespace> <Workstation path> <memory Section> <flags>
<Target Name>是将在ROM 文件系统也就是/Windows 下将出现的文件名。<Workstation
path>指在开发环境中这些文件的路径。<memory Section>一般为“NK”。
<flags>可以使用表2 中所列的值。
表2 flags的值及其说明
flags |
功能 |
C |
Compressed加密的(文件section默认加密节省空间) |
U |
Uncompressed未加密(modules section默认) |
R |
只加密资源 |
H |
把文件隐藏 |
S |
系统文件 |
BIB 文件中还有两个section,它们一般出现在Config.bib 文件中。它们都是:
memory section,它定义了目标系统的内存分布。它使用如下的格式标记:
<name> <Virtual Address> <Size> <TYPE>
<TYPE>可以使用表3 中的值:
表3 memory section 的TYPE 描述
值 |
功能 |
RAM |
此项描述可用的RAM 区,RAM 区用来运行进程和文件系统。这个RAM 区必须是连续的。 |
RAMIMAGE |
此项描述的区域将被视作ROM。 |
RESERVED |
此项范围内的内存区域是被保留的。这个区域的内存可能被用来当作video frame buffer 或者direct memory access(DMA) buffer。 |