Platform Builder实践之配置文件
这篇文章主要讲解PB的配置文件。从用途方面分析,PB包含两种配置文件。分别是源码配置文件和镜像配置文件。下面分别讲解这两种配置文件。
一、源码配置文件:
源码配置文件用于编译源码时使用。这里的源码是指Windows CE公开的源码,如驱动程序、系统应用程序等。PB在编译平台时将这些公开的源码即时编译并将编译链接后的文件复制到平台工程子目录里。记得前面讲过PB在开始编译时调用cebuild.bat批处理文件,cebuild.bat执行的一个步骤是针对_DEPTREES变量指定的所有目录执行build.exe和sysgen.bat。build.exe在编译源码文件时会寻找当前目录下存放的源码配置文件,根据配置文件的信息来编译和链接,产生EXE、DLL、LIB文件。CE的源码文件所在的目录中都包含了相应的配置文件,这些配置文件只对当前目录或者子目录的源码有效,具体分为三种:
DIRS文件 :文件内容和解释如下:
DIRS:指定哪个子目录的源码要被编译
DIRS_CE:只有为CE编写的源码才被编译
OPTIONAL_DIRS:指定可选的目录(很少使用这个选项),可以只编译指定目录而不是全部编译。
SOURCES文件 :通过宏定义来指定编译和链接涉及到的文件,文件内容和解释如下:
TARGETNAME:指定编译链接产生的主文件名
TARGETTYPE:指定编译链接产生的文件的类型(决定了扩展名)。文件共分三种:.lib(LIBRARY)和.dll(DYNLINK)和.exe(PROGRAM)。
TARGETLIBS:定义.lib链接文件,链接时需要这个文件。
SOURCES:源码文件。包含扩展名为*.c或*.h 或*.cpp的文件。
EXEENTRY:.exe文件的执行代码入口点。
sources.cmn文件是通用的SOURCES文件。在这个文件中可以指定作用于所有源码文件的配置选项。
MAKEFILE文件 :包含默认的编译和链接选项
整个编译和链接过程:build.exe收集编译和链接需要的数据(源码文件、链接文件、编译和链接选项)产生一系列的内部环境变量,然后调用nmake.exe,nmake.exe根据内部环境变量执行编译、链接,最后产生最终文件(*.lib *.exe *.dll)。
二、镜像配置文件:
镜像配置文件用于在制作CE镜像文件时使用。CE的镜像文件扩展名为.bin。制作镜像工具romimage.exe除了能够产生.bin文件外,还能够产生.abx和.sre文件。整个镜像的制作过程由makeimg.exe控制,它调用cenlscmp.exe、fmerge.exe、res2.exe、txt2ucde.exe、regcomp.exe、romimage.exe等。这些工具大部分在前面已经介绍过了。镜像配置文件类型有.bib、.reg、.db、.dat、.str。如果主文件名为Common,表示是通用的配置文件。如果主文件名为Platform,表示是某一个BSP的配置文件。如果主文件名是Project,表示是定制的一个平台的配置文件。在PB中修改配置文件前如果没有把握最好先做好备份。
l .bib(Binary image builder)
定义包含在内核镜像中的文件和模块的名称、加载位置。主要的bib文件有Common.bib,Config.bib, Project.bib, Platform.bib等。.bib文件内部分为几个部分:
【MEMORY】用于定义有效的物理内存块,在此将整个RAM分为几个部分。
格式: 名称 首地址 大小 内存类型
名称: 内存区域的唯一名称(RESERVE是预定义名称,可以用多次,表示此区域保留)
首地址: 内存区域的首地址(十六进制表示)
大小: 内存区域的大小(十六进制表示)
内存类型:分为三种。
RAM: 运行所有进程的内存区域(整个区域必须是连续的,且不能含空洞)
RAMIMAGE:专用于保存镜像的内存区域。(每个.bin中只能指定一个RAMIMAGE)
RESERVED: 保留内存区域(这样的区域一般用于驱动程序使用,如显卡缓冲区、DMA缓冲区)
举例:
;名称 首地址 大小 内存类型
IF IMGRAM64
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 03000000 RAM
UMABUF 83C00000 00400000 RESERVED
ENDIF
注:整个内核的地址都是从0x8000 0000开始的。如果是x86系列的CPU,那么物理内存地址与虚拟地址映射关系在oeminit.asm中指定。
【CONFIG】类似环境变量,PB预设置了一些配置变量。常用的配置及说明如下:
AUTOSIZE:
格式:AUTOSIZE = OFF | ON
默认值为OFF。在config.bib中的MEMORY部分定义了有效的内存区域,其中两部分RAM、RAMIMAGE分别用于进程使用区域和保存镜像区域。如果为ON,romimage.exe在创建nk.bin时将RAM和RAMIMAGE两部分合并成一个部分,然后从最低地址开始保留RAMIMAGE大小的内存,其余都作为RAM使用。
BOOTJUMP:
格式:BOOTJUMP = address | NONE
默认值为NONE。每次重新启动CE内核,默认执行的代码从RAMIMAGE的首地址开始。如果在BOOTJUMP指定一个地址(必须在RAMIMAGE范围内),那么将从指定的地址开始执行。
COMPRESSION:
格式:COMPRESSION = OFF | ON
默认值为ON。romimage.exe在创建内核时默认压缩所有可写部分。对于文件,默认全部压缩。对于模块(.exe、.dll),默认压缩可写部分。模块的可写部分包括数据段,也就是在模块运行时一定加载到内存中的部分。如果模块在.bib中定义时具有C属性(表明压缩模块所有部分),那么当前这个选项就忽略了。
FSRAMPERCENT:
格式:FSRAMPERCENT = number
默认值为0x80808080。指定为文件系统分配的内存的百分比。number分为四个字节,由十六进制表示。
byte0的值(单位为4KB)表示在第一个2MB中,其中每1MB包含的4KB的整数倍。
byte1的值(单位为4KB)表示在第二个2MB中,其中每1MB包含的4KB的整数倍。
byte2的值(单位为4KB)表示在第三个2MB中,其中每1MB包含的4KB的整数倍。
byte3的值(单位为4KB)表示在剩下的内存中,每1MB包含的4KB的整数倍。
计算一下默认值0x80808080表示的百分比:0x80*4K/1M = 0.5,因为每个字节都等于0.5,所以整个占用的百分比是50%。
KERNELFIXUPS:
格式:KERNELFIXUPS = OFF | ON
默认值为ON。如果为ON,romimage.exe创建内核前重定位内核到RAM的开始位置。
OUTPUT:
格式:OUTPUT = path
指定romimaeg.exe将创建完成的内核文件nk.bin放置到的路径。一般放置到%_FLATRELEASEDIR%下。
ROMFLAGS
格式:ROMFLAGS = Flags
设置内核选项的位掩码,多个位掩码可以组合使用。
0x0001 禁止按需分页:EXE和DLL默认是按需分页的。
0x0002 禁止全内核模式:进程运行在两种模式下,用户模式和内核模式。全内核模式下所有线程运行在内核模式。全内核模式能够提高执行效率,但会增加系统的不稳定性。如果允许执行用户程序,那么不适合采用全内核模式。
0x00000010 只信任来自ROM的模块(DLL、EXE)。默认ROM中的模块和所有文件系统的模块都是内核信任的。OEM能够在OAL层实现对所有运行模块的检查,这个标志将忽略对来自ROM保存的模块的检查。
0x00000020 停止刷新TLB。这个标志仅用于运行在x86CPU上的内核。TLB(Translation Look-aside Buffer),有人翻译成变换
索引缓冲区,它的作用是在虚拟地址和物理地址之间转换。对于具有实时性的内核,这个标志应该设置。
0x00000040 按照/base链接选项中的地址加载DLL。这样内核将不采用重定位加载DLL。不建议采用。
ROMSIZE
格式:ROMSIZE = size
指定内核镜像的大小
ROMSTART
格式:ROMSTART = address
指定内核镜像的首地址
ROMWIDTH
格式:ROMWIDTH = width
指定数据宽度,一般为32位
ROMOFFSET
格式:ROMOFFSET = address
指定偏移地址。
SRE
格式:SRE = OFF | ON
指定romimage.exe是否产生.src文件,一般烧录ROM的程序能够识别此文件。
注:config中绝大多数【CONFIG】选项不需要修改。凡是配置文件都可以使用IF/ENDIF 条件语句。
【MODULES】定义镜像要包含的模块并指定模块(DLL、EXE)如何被加载到内存表中。
格式:模块名称 路径 内存块 类型
模块名称一般为模块的真实名称;路径为当前文件所处的位置(路径中指定的文件名和前面模块名称最好一致);内存块是指这个模块将被存放到哪个内存块中,内存块的定义见前面MEMORY部分;类型指定这个模块将被存放的属性,具体类型如下:
S:系统文件
H:隐藏文件
R:只压缩模块的资源部分(默认模块是不压缩的)
C:压缩模块所有部分
D:禁止调试
N:标志模块是非信任的
P:忽略CPU类型
K:指定romimage.exe修正模块(仅用于调试或者内核跟踪)
X:指定romimage.exe对此模块验证签名
M:运行时加载整个模块,而不是按需分页
L:不分离DLL在进程地址空间和Slot 1
举例:
MODULES
init.exe %_WINCEROOT%\RELEASE\INIT.EXE NK SH
nk.exe $(_FLATRELEASEDIR)\kitlnokd.exe NK SHD
nk.exe $(_FLATRELEASEDIR)\kitlnokd.exe NK SHN
【FILES】定义镜像要包含的文件并指定文件如何被加载到内存表中。
格式:模块名称 路径 内存块 类型
具体类型如下:
S:系统文件
H:隐藏文件
U:不压缩文件(默认是压缩的)
举例:
FILES
initobj.dat %_WINCEROOT%\RELEASE\INITOBJ.DAT NK SH
【.dat File System File】定义目录和指定文件位置。当冷启动CE平台时,filesys.exe用这些数据创建目录、快捷方式、
文件(在RAM文件系统)。
举例:
;;创建根目录下子目录Program Files
root:-Directory("Program Files")
;;创建目录Program Files下一个子目录My Projects
Directory("\Program Files"):-Directory("My Projects")
;;复制文件从\Windows\Myproj.exe到\Program Files\My Projects\My Project.exe
Directory("\Program Files\My Projects"):-File("My Project.exe", "\Windows\Myproj.exe")
;;复制文件从\Windows\control.lnk到\control.lnk
root:-File("\control.lnk", "\Windows\control.lnk")
快捷方式的运用:如果要在CE平台的桌面上显示一个程序的快捷方式,实现步骤为:
1、创建一个快捷方式。在开发机上用记事本一类的文字编辑软件写入字符格式为:长度#路径。其中长度为路径的字符个数。
例如“16#\windows\abc.lnk”,注意路径中空格也算在内。完成后保存为ASCII码的扩展名为.lnk的文件。
将此快捷方式文件*.lnk复制到%_FLATRELEASEDIR%下,也就是PB编译的所有文件存放的目录。
2、在project.bib中的FILES部分下按FILES的格式键入字符。例如:
FILES
abc.lnk $(_FLATRELEASEDIR)\abc.lnk NK S
3、在project.dat中指定abc.lnk文件所存放的位置。例如:
root:-Directory("\Windows")
Directory("\Windows"):-Directory("LOC_DESKTOP_DIR")
Directory("\Windows\LOC_DESKTOP_DIR"):-File("abc.lnk","\Windows\abc.lnk")
【.reg Registry file】设置注册表项。关于注册表见我的文章《开发实例二:保存信息》。
数据类型 格式
REG_SZ "my string"
REG_DWORD DWORD: NNNNN (十六进制)
REG_MULTI_SZ multi_sz: "my string"
REG_BINARY hex: xx,xx,xx,xx ...
HEX hex(xxxxxxxx): xx,xx,xx,xx
例如:
[HKEY_LOCAL_MACHINE\init]
"Launch60"="myproc.exe" ///REG_SZ类型
"Depend60"=hex:14,00, 1e,00 ///REG_BINARY类型
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\TRUEFFS_UNAND\FATFS]
"MountFlags"=dword:2 ///REG_DWORD类型
【.db The database files】数据库文件保存在对象存储中。实际应用的不多,在这里不再过多讲解。
【.str string files】类似EVC中的字符串资源。用于指定ID与字符串的关联。CE支持很多国家语言,所以内核使用的字符串可能采用不同国家的语言。为此,CE将字符串用ID来定义,在.str文件中指定ID对应的字符串。包含.str文件的目录名采用国家码来设置,例如“C:\......\0410\cepc.str”。
Platform Builder实践之配置文件相关推荐
- Platform Builder实践之两个要点(转)
增加对大容量物理内存的支持和永久存储注册表是在定制内核工作中常遇到的问题 <script language="JavaScript" type="text/ja ...
- 使用Platform Builder配置Windows CE操作系统
使用Platform Builder配置Windows CE操作系统 摘要:Windows CE操作系统是嵌入式系统的开发利器.Windows CE Platform Builder 3.0提供创建. ...
- Platform Builder和Embedded visual C++简介
1 Platform Builder 介绍 Platform Builder 是微软公司提供给Windows CE 开发人员进行基于Windows CE 平台下嵌入式操作系统定制的集成开发环境.它提供 ...
- Platform Builder 5下WinCE 5.0目录结构
Platform Builder 5下WinCE 5.0目录结构 Platform Builder 5已经自带WinCE 5.0,安装过程会指定WinCE 5.0的安装路径,默认为X:\WINCE50 ...
- .NET Compact Framework 2.0 SP2 for Platform Builder (4.2, 5.0, 6.0)
.NET Compact Framework 2.0 SP2 前段时间已经发布了,详情看我之前写的 .NET Compact Framework 2.0 SP2 悄悄来临.在2007年3月份的 Win ...
- 试用版Platform Builder 6.0到期后的解决办法
a)删除目录C:\Program Files\Microsoft Platform Builder\6.00下的EtkRemov.inf文件 b)新建一个文本文档 c)重命名新建文本文档为EtkRem ...
- Platform Builder
上一章所说,当用PB的"定制平台向导"选取了一个平台的所有特征(feature)后,接下来的工作就是编译了.即使你从来未曾编译过,你也能想象得到编译的时间一定很长.因为PB是在编译 ...
- Platform Builder 6.0与Windows 7兼容性的问题
重装Windows 7之后,今天第一次正式编译WinCE内核,结果又遇到了一点状况,截图如下. 从编译的阶段来看,Sysgen已经成功完成,在执行Post-Sysgen Build的操作时编译PLAT ...
- platform Builder导出SDK
一.编译好wince系统 二.选择[platform]->[configur SDK],第一次进入的话,会要求输入一些SDK名字等信息.完成后再一次进入才是配置SDK的属性. 三.有几项需要注意 ...
最新文章
- 从比尔·盖茨说起,中国AI到底能否超过美国?
- 自学python清单-机器学习和Python怎样快速掌握?你一定需要这27张清单
- 数据结构与算法:二分法
- Python中的Mixin详解
- win10安装ipython_windows10下安装IPython notebook 用来查看.ipynb文档
- mysql against包含英文_在MySQL中使用MATCH和AGAINST选择特定列中包含字符串的行
- csdn个人主页下如何添加微信公众号及超链接
- mysql常用操作记录
- java学习笔记之DBUtils工具包
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- vos3000 2009 3000 4.0-8.0客户端下载
- HenCoder自定义View学习整理
- 都来看电影!手机播FLV格式视频全攻略(转)
- RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received
- 人脸识别技术离滥用仅一步之遥?
- KSO-.NET 6 中的新增功能
- 如何优雅的完成一场说来就来的APP自建
- 破壳——小鸟初识linux
- springboot整合mysql5.7_SpringBoot+MySQL,如何整合并使用MyBatis框架
- C++循环语句之在0-1000之间找出水仙花数。