在WinCE中使用的一个重要的文件就是 BIB文件,全称 Binary Image Builder File。在 WinCE的编 译过程中会用到 BIB文件,应该是在最后的 Makeimg阶段。所有的 BIB文 件会被合并成 CE.bib文件,然后 Romimage.exe会根据 BIB文件 中的描述来决定哪些文件最终被包含到 WinCE image中。当然, BIB文件还决定了 WinCE设备内存的分配,其中定义了 WinCE image占用哪块内 存, Framebuffer占用哪块内存等 。
在 BIB文件中分为 4大 项: MEMORY项, CONFIG项, MODULES项 和 FILES项。下面分别作个解释:
MEMORY : 定 义了内存分配的相关设置,一般在 BSP中的 config.bib 文件中。
CONFIG : 在 最后的 Makeimg阶段,为 Romimage.exe提供一些生成 WinCE image的配置属性。该项是可选的,一般也在 BSP中的 config.bib文件中定义。
MODULES : 定 义了一些会被打包到 WinCE image中的模块或者文件,比如 dll, exe等。这些 文件会被 Romimage.exe标记为加载到 RAM中或者 XIP。我 们可以在这里添加自己的 WinCE应用程序或者模块,但是不要添加 Managed Binaries,一般指 .NET的程序。
FILES : 定 义了一些操作系统会用到的其他的文件,比如字体文件,图片等。这些文件也会在 WinCE运行的时候被加载到 RAM中。
下面会详细介绍上面的 4大项:
1. MEMORY 项
一般都在 config.bib文件中定义,开头会有 MEMORY的字样。这里定义了为 WinCE image以及其他模块预留的 RAM,同时也定义了 WinCE可以使用的 RAM。具体格式如下:
MEMORY
NAME Start Address Memory Size Type
NAME : 该内存区域的名字,必须是唯一的。
Start Address : 该内存区域的起始地址,用十六进制表示。
Memory Size : 该内存区域的大小,用十六进制表示。
Type : 内存区域的类型。包涵的多种类型如下。
类型值 | 描述 |
FIXUPVAR | 用于在 WinCE编译的 Makeimg阶 段,就初始化一个内核中的全局变量。 |
NANDIMAGE | 当创建了一个使用 BinFS的 image的时 候, NAND设备上的 WinCE kernel重定向到 RAM中 的区域,当系统访问该区 域的时候, BinFS会负责访问 Nand设 备上相应的位置,并返回数据给系统,实际上就是在 Nand设备上面实现了 XIP的功能。 |
RAM | 定义了被 WinCE系统使用的 RAM区 域,这块内存必须是连续的,这里有一点要注意就是从硬件的角度来说,这 块内存不能跨越两片 SDRAM,也就是说整个区域空间必须在一片硬件 SDRAM上。 |
RAMIMAGE | 定义了一块内存区域用于加载 WinCE image,实际上 WinCE启动以后, image会 被拷贝到这块内存区域上面运行。 一个 image只能有一个连续的 RAMIMAGE区域。 |
RESERVED | 这块内存区域会被预留出来,一般用于 Frambuffer或者是 DMA Buffer,或者是一块共享内存用于 EBOOT传递参数 给 WinCE系统。 |
EXTENSION | 定义了一块 WinCE image中的区域作为 ROMHDR extension的数据区域。 |
2 . CONFIG 项
一般在 config.bib文件中定义,定义了一些额外的配置参数,其中一些对于 WinCE image来说也很重要。具体格式如下;
CONFIG
ITEM=Parameter
ITEM | 描述 |
AUTOSIZE | 允许未被使用的 WinCE image的 RAM被用作 WinCE系统的 RAM。默认值为 ON。 |
COMPRESSION | 允许 Romimage.exe压缩 WinCE image中的可写入部分。默认值为 ON。 |
BOOTJUMP | 定义了跳转跳转页在 RAMIMAGE空间的地址。而不是默认情况下的 RAMIMAGE的首地址。默认值为 NONE。 |
FSRAMPERCENT | 定义了文件系统使用的内存的百分比。默认值为 0x80808080。 Byte 0:第一个 2MB中,每 1MB所包含 的 4KB的倍数。 Byte 1:第二个 2MB中,每 1MB所包含 的 4KB的倍数。 Byte 2:第三个 2MB中,每 1MB所包含 的 4KB的倍数。 Byte 3:剩下的内存中,每 1MB所包含的 4KB的倍 数。 |
KERNELFIXUPS | 定义了 Romimage.exe是否重新定向内核的可写入区域。默认值为 ON,内核的可写入区域被重新定向到 RAMIMAGE的起始位置。 |
OUTPUT | 定义了最终生成的 image存放的路径。默认为 %_FLATRELEASEDIR%。 |
PROFILE | 定义了是否在 WinCE image中包含 profiler的结构和符号。默认值为 OFF。 |
RESETVECTOR | 重新指定跳转页的位置,一般针对 MIPS芯片从 0x9FC00000开始引导的问题。 |
ROMFLAGS | 内核标记位,可以进行组合: 0x01表示禁用按需分页。 0x02表示禁用完全内核模式,完全内核模式表示所有的线程都运行在内核模式。 0x10表示只信任 ROM MODULES中的模块。 0x20表示停止刷新 TLB。 0x40表示 按 照 /base链接选 项中的地址加载 DLL。 |
ROMSTART | 指 WinCE image在内存中的起始地址。 |
ROMSIZE | 指 WinCE image的大小。 |
ROMWIDTH | 指数据总线的宽度。 |
ROMOFFSET | 指定一个偏移量来修改 .bin文件中的每一个记录的地址。一般用于 ROM中的 .bin文件加 载到 RAM来运行 的情况,主要是表示存储 .bin的位置和运行 .bin的位置不一样。 |
SRE | 使 Romimage.exe产生一个 .sre文 件。默认值为 OFF。 |
X86BOOT | 定义是否插入一条跳转指令,在 x86复位向量地址的时候。 |
3 . MODULES 项和 FILES 项
该项列出了所有被包含在 WinCE image中的模块以及文件,以及这些模块和文件以什么方式被加载到内存中 。具体格式如下:
MODULES
Name Path Memory Type
Name : 模块的名字,比如一个 dll或者 exe文件的文件名。
Path : 路径,一般都是 WinCE的工程的 Release目录。
Memory : 指定该模块被放在哪个区域,一般都是 NK区域。
Type : 定义了文件的类型。具体如下:
类型 | 描述 |
S | 系统文件。 |
H | 隐藏文件。 |
R | 只压缩模块的资源部分。 |
C | 压缩模块的所有部分。 |
D | 禁止调试。 |
N | 模块是不可信任的。 |
P | 告诉 Romimage.exe不需要检查 CPU的 类型。 |
K | 告诉 Romimage.exe必需固定该模块的内核地址。有该标记的模块只能被 LoadKernelLibrary函数加载。 |
X | 告诉 Romimage.exe对该模块签名。 |
M | 运行时加载整个模块,不要按需分页。 |
L | 告诉 Romimage.exe不要分离 ROM DLL。 |
一般 FILES项的 Type只支持 S, H, N, D几个类型,而 MODULES项的 Type是都 支持的。
举个例子吧:
INIT.EXE %_WINCEROOT%"RELEASE"INIT.EXE NK SH
MYDLL.DLL %_WINCEROOT%"RELEASE"MYDLL.DLL NK SHC
对于 BIB文件来说同样支持“条件编译”,我们可以通过设置环境变量来选择性地将某些模块打包到 WinCE image中。一般在 BSP中, 对于一些驱动模块的环境变量我们 IF来进行条件判断。而对于 WinCE的系统模块来说,一般都是 SYSGEN变量,应该使用 @CESYSGEN IF来判断。
我们在 BSP的开发中最常见的主要就是 eboot.bib, config.bib, platform.bib和 project.bib。下面简单介绍一下:
project.bib : 该文件主要自创建的 WinCE工程中所需的一些文件。
platform.bib : 该文件包含了和硬件平台相关的文件,主要以驱动程序为主。
config.bib : 该文件描述了 WinCE系统的内存的配置。
eboot.bib : 该文件描述了 WinCE的 eboot的内存的配置。
还有其他的一些 bib文件,在 WinCE系 统编译后都会背拷贝到工程的 release目录下面。比如 common.bib, ie.bib等。 这些文件列出了 WinCE的组件相关的文件,根据用户订制的系统,会被选 择性的打包到 WinCE image中。