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”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】itk、vtk、qt 显示dicom 数据

转自:https://blog.csdn.net/Zzhouzhou237/article/details/107199076/ 以下代码实现了itk读取dicom数据,转换为vtkData,然后用Qt显示。 1、Qt Designer 搭建界面,QVTKOpenGLNativeWidget 是vtk的一个类,连接qt与vtk…

页面执行顺序

今天写绑定下拉用户控件中,下拉列表的数据时,发现竟然后台的数据为空. 今天才有点明白页面的执行顺序。 转载于:https://www.cnblogs.com/jskingli/archive/2008/05/09/1190176.html

Windows CE创建桌面快捷方式

在使用Platform Builder创建Windows CE系统的内核映入文件NK.bin时, 创建一个桌面快捷方式的步骤如下:1、创建一个快捷方式文件Test.lnk,格式如下: 17#/Windows/Test.exe 其 中,17表示#后面有多少个字符 2、将此文件拷…

php 国密,PHP实现国密算法SM4

1.SM4算法实现class SM4{const SM4_CK [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3eaf1, 0xf8ff…

【转】WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同

转自:https://blog.csdn.net/newstarao/article/details/3775690 WM_MESSAGE是最普通的WINDOWS消息,对于这种类型的消息没什么好说的。那WM_COMMAND和WM_NOTIFY消息都是WINDOWS CONTROL给它的父窗体发的消息,那这两种消息有什么不同呢&#…

修改了WINCE自带的驱动程序后如何编译

修改了WINCE自带的驱动程序后如何编译?如果是自己开发的驱动程序如何编译? 1、分为IDE方式和命令行方式。 IDE 方式的编译很简单,以PB5.0为例,打开定制内核的工程,在左边的“workspace”—“FileView”中找到你已经修…

Properties 类的使用

Properties 类已不是新东西了,它在 Java 编程的早期就有了,并且几乎没有什么变化。J2SE 的 Tiger 版本增强了这个类,不仅可以用它在单独一行中指定用等号分隔的多个键-值对,还可以用XML 文件装载和保存这些键-值对。在 驯服 Tiger…

php 9000 端口没起来,ubuntu fpm-php 未监听9000端口问题

今天搞一台新的ubuntu服务器;配置好nginx后 死活解析不了php文件,反复修改配置文件未果;于是怀疑fpm-php,遂 :netstat -ant |grep 9000惊奇的发现9000端口竟然没有被占用,可是php5-fpm服务已经开启了;于是查…

【转】控件通知消息

转自:https://blog.csdn.net/kinghzking/article/details/6180956 2008年04月06日 星期日 00:09 控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述…

python 装饰器 java,python之各种装饰器的使用

"""装饰器,带参数的装饰器,类的装饰器判断是否为可迭代的from collections import Iterableprint(isinstance([1,2,3],Iterable))"""# 1、简单的装饰器def debug(func):def wrap():print(fdebug:func name is {func.__nam…

WINCE 网卡控制

最近在搞wifi上网,看了些这方面的资料,稍微总结点东西:) DeviceIoControl和底层通信: 方法1 :把第二个参数设为IOCTL_NDIS_REBIND_ADAPTER。 方法2 :把第二个参数设为IOCTL_NDIS_UNBIND_ADAPTER…

【转】调用约定__cdecl、__stdcall和__fastcall的区别

什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的。它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出栈,(3)以及产生…

WCF从理论到实践(14):WCF解决方案模板 (转)

WCF从理论到实践(14):WCF解决方案模板 正所谓磨刀不误砍柴工,虽然VS2008为我们提供了WCFServiceLibrary项目模板,但在实际开发的时候,我们通常更喜欢按照自己的方式来建立WCF项目,通常情况下,我们将服务契约(通常是接口)数据契约,消息契约等契约单独作为一个项目,而将服务的实现…

java面试宝典 多线程,《java面试宝典》之java多线程面试题

1:什么是线程?轻量级的进程2:线程的三个部分是?处理机代码数据3:为什么使用多线程使UI响应更快利用多处理器系统简化建模4:代码示例:Java中实现多线程的两种方式,包括如何定义多线程…

【转】__declspec用法详解

__declspec用法详解 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和 C语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C语言关于Microsoft的扩展。 用法&am…

EBOOT跳转到NK的过程

先做个说明:我的平台环境是:CE5.0(S3C2450)。 我的config.bib定义的镜像起始地址为0x8c20 0000(虚拟地址), EBoot将镜像下载到以0x8c20 0000为起始地址的RAM中, 但实际上OS跳转的地址却是0x8c20 1000, 也就是说, 传递到Lauch函数的…

thinkphp index.php隐藏,thinkphp5怎么隐藏index.php入口文件?

隐藏方法:1、打开apache的http.conf配置文件,开启mod_rewrite.so模块;2、AllowOverride None项中将None改为All;3、修改“.htaccess”的配置内容,将原代码替换为官方手册提供的代码。thinkphp现在的php主流框架之一&am…

【转】extern “C“和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析

转自:https://blog.csdn.net/xupan_jsj/article/details/9028759 前面的extern "C" __declspec(dllexport) __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern "C"放在class的前面,…

JAGUARSDN1网络的开机自动启动 禁用,WIFI模块的启动关闭控制

先确认下系统中有没有加载NDISPWR.DLL,如果没有的话,把这个组件加上 WIFI在默认情况下,是开机自动打开的,如果要开机禁用,在HKEY_LOCAL_MACHINE/Comm/NdisPower创建一个键值 name 4 name是你用的WIFI的名字 如果想…

高考临考突发情况应急预案大全

临考感冒看卷头痛如何应对 高考应急预案助考生 明天,全省49万余考生就将走进高考考场,考生顺利迎考是全社会的心愿,可种种意外总有可能出现在考生面前。高考过程中遇到意外情况如何处理?昨天,本报记者约请了多位考试专…