注册 | 登录 | RSS订阅 | BLOG | 站内留言 | 欢迎你投稿

分类: ‘其他’

Platform Builder之旅(四)

2008年3月2日 没有留言

Platform Builder之旅(四)

作者:付林林

  本篇文章是对前面讲过的关于PB的系列文章做一些补充,因为PB包含的知识面太广也太杂,所以针对一些杂项归纳在一起写成这一篇文章。当然一篇文章绝不可能包罗万象,有时间我会陆续写出来。

  • 【Windows CE安装目录】
    Windows CE.NET v4.1默认安装路径为C:\wince410。其子目录名及目录包含内容如下:
    Others 包含ATL、MFC运行时文件等。
    Platform 包含所有BSP子目录。每个目录包含BSP文件。
    Private 包含大多数CE公开的源码
    Public 包含大多数SDK文件、配置文件、编译工具。
    SDK 包含PB使用的工具
    public目录下一些子目录名及包含内容如下:
    Common 核心操作系统模块
    Datasync 同步数据传送模块
    Dcom DCOM模块
    DirectX directx、DVD-VIDEO模块
    IE IE模块
    NetCF .NET框架模块
    RDP 远程桌面模块
    Servers HTTP服务扩展模块
    Script JavaScript和VBScript脚本模块
    Speech SAPI模块
    Viewers FileView模块
     
  • 【build options】
    PB菜单"Platform"-"Settings"中常见的编译选项。
    Enable CE Target Control Support: 支持对实际平台的控制。可以执行 CESH 命令。
    Enable Event Tracking During Boot:在引导过程中支持事件跟踪。
    Enable Full Kernel Mode: 支持全内核模式。全内核模式参见配置文件。
    Enable Kernel Debugger: 允许调试内核。
    Enable KITL: KITL(内核独立传输层)用于在开发平台和实际平台之间相互通信。
    Enable Profiling: 能够评测内核的性能。评测内核性能的工具在以前讲过。
     
  • 【Object Icon Types】
    Object Icon是指PB中"Workspace"和"Catalog"列出的对象对应的图标。当定制了平台后,如果在"Workspace"中删除某些特征时,PB很可能弹出对话框说明此特征无法删除。本节将讲述其中原因,之前要介绍"Workspace"-"FeatureView"中相关图标。

    特征组 锚定特征 非锚定特征

    1、把一个特征组缩减成一个特征叫Resolve(分解)。点击菜单"platform"-"resolve feature(s)",弹出一个对话框显示整个CE平台所有能够分解的特征组,可以在每一个特征组中选择单个特征。比如显卡驱动组,当从PB的"catalog"中加入显示驱动时,即使加入一个驱动,PB也会在"FeatureView"显示一个特征组。通过Resolve可以任意选择一个需要的显卡驱动。
    2、锚定特征。在PB创建一个CE平台时,有一些特征默认被加上锚定特征(anchor feature)。用户从PB"catalog"中选择特征加到左边项目里时,这个加入的特征被自动加上锚定特征。同时PB将检查CE平台中的所有特征是否与新加入的特征冲突,然后根据cesysgen.bat中包含的从属规则,将和用户选择的特征相关的特征加到项目里。由PB根据从属规则带到项目里的特征是非锚定特征(非用户选择)。
    3、查看特征从属关系。通过右键菜单"feature dependencies"选项来查看指定特征的从属关系。"Depends on"表明当前特征需要哪些其它特征,"Dependency of" 表明哪些特征需要当前特征。
    4、每次从定制的CE平台中删除或者加入特征,PB都会在执行删除或者添加特征后重新整理平台的所有特征。在"Output"窗口中可以看到平台所有增加的非锚定特征。
    5、删除特征:锚定特征可以直接删除,而非锚定特征必须先删除它的父特征(父特征在加入到平台时将子特征带进来)后才能被删除。另外锚定特征也可能和另一个锚定特征属于从属关系。所以锚定特征也可能不允许被直接删除。
    通过以上5点读者一定会了解为什么有些特征不能被直接删除了。
     

  • 【cec文件】
    .cec文件是目录特征文件。这个文件用于将自定义的目录特征导入到PB的"catalog"中。适合于将编写的驱动程序、BSP等给其它开发商使用,开发商只需加载cec文件后就能够将驱动、BSP等加入到自己的平台上。用记事本就可以打开查看.cec文件的内容。一般编写.cec文件采用PB的工具"cec editor",单击PB菜单"tools"-"cec editor",弹出一个窗口,窗口标题为"platform Builder CEC Editor"。

    1、编写.cec文件:假如我们要加入一个驱动程序,这个驱动程序包含两个文件,一个驱动文件mydll.dll,另一个驱动注册信息mydll.reg。单击"cec editor"的"create a new cec file"按钮。在新窗口左边树型控件中"catalog"项位置单击右键,在弹出的菜单中单击"insert feature grout…",在弹出的对话框"insert feature group"的"name"中输入特征名字例如"mydll",带"*"的必须填写,其它可以不添。在窗口左边树型控件中"mydll"项位置单击右键,在弹出的菜单中单击"insert feature",在弹出的对话框的"name"中再次输入"mydll"。接着在窗口左边树型控件中"mydll"项位置单击右键,在弹出的菜单中单击"insert build method",在弹出的对话框中选择支持的CPU类型。在此对话框中的"Step"中共有12个选项,将PB编译平台的过程分为四个部分,每个部分又加入"Pre"和"Post"表示此前和此后。这四个部分分别为CESYSGEN(执行cesysgen.bat过程)、BSP(编译BSP等源码文件的过程)、BuildRel(复制文件的过程)、MakeImg(制作镜像文件的过程)。按照我举的例子,我只需复制这两个文件到%_FLATRELEASEDIR%中,所以在MakeImg之前执行即可,选择"PreMakeImg"。在窗口左边树型控件中"PreMakeImg"项位置单击右键,在弹出的菜单中单击"insert action"-"copy",在弹出的对话框中指定源文件路径和目的路径。目的路径可以输入"$(_FLATRELEASEDIR)"。因为我们有两个文件,所以要重复操作一遍,将另一个文件也复制过去。最后保存。
    2、导入到PB的"catalog"中:单击工具栏上"add the cec file to the catalog"按钮将此cec文件导入到"catalog"中。
    3、删除.cec文件:如果加入到"catalog"后,单击PB菜单"File"-"Manage Catalog Feature",找到你的cec文件,单击"remove"。
     

  • 【loadcepc.exe】
    loadcepc.exe是一个MS-DOS程序,它是一种Boot Loader。Boot Loader的主要工作是加载CE平台(nk.bin),将nk.bin解压后的所有文件加载到内存,然后将CPU的控制权交给CE内核,CE内核执行初始化工作,运行nk.exe实现操作系统内核功能、运行device.exe管理常用的设备驱动程序、运行filesys.exe加载文件系统、运行gwes.exe管理图形窗口事件子系统等等。采用x86 CPU的硬件系统共有两种启动模式,一种是采用BIOS(基本输入输出系统)实现硬件的检测和初始化,之后启动MS-DOS操作系统,运行loadcepc.exe加载nk.bin。另一种方法是采用The x86 ROM boot loader (romboot),它是一个很小的引导程序,有256KB大小。可以将它存放到Flash/EEPROM中替换BIOS程序,它能够实现硬件的检测和初始化,在这之后如果系统采用硬盘等IDE接口存储设备,那么romboot会自动寻找活动分区上的nk.bin文件并加载。romboot的优点是检测速度和加载速度都很快,但是在支持的硬件系统方面不如BIOS全面。
      loadcepc.exe支持通过并口、串口、网卡从开发机上下载nk.bin文件。在loadcepc后需要指定要加载的.bin文件的文件名,如果为nk.bin,那么可以不指定文件名,如果不是nk.bin,那么必须指定文件名,例如"loadcepc abc.bin"。下面简单介绍几个常见的参数:
    /B:指定串口的波特率。例如 /B:19200
        /C:指定串口的端口。1指"COM1:",2指"COM2:"。  例如 /C:1
        /D:指定显示分辨率。0指320 x 200,1指480 x 240,等等。
        /E:指定网卡IO地址和IRQ。例如/e:300:5
        /L:指定显示分辨率和色深。它需要指定具体的分辨率,所以能够指定不标准的分辨率。例如/l:768x576x8,
        表示分辨率为768 x 576,颜色位数为8位。
        /P:指定使用并口传递数据。
        /Q:指定使用串口传递数据。
        /V:指定当loadcepc加载时添加状态信息。        
  • 【调试平台和运行程序】
    要调试平台,先要配置远程连接。单击PB菜单"Target"-"Configure Remote Connection",在弹出的菜单中将"Download"和"kernel"下拉框都设置为"Emulator",单击"Download"后面的"Configure",在弹出的菜单中将"Memory(MB)"设置为64MB,因为前面我们设置了"IMGRAM64"。分辨率设置为800×600。退出"Configure Remote Connection"后单击"Target"-"Download/Initialize"将nk.bin下载到模拟器上执行。如果向定制的平台添加或者删除特征后,当执行"Build Platform"时,PB不会全部重新编译,而是将修改的部分重新编译。        要在定制的CE平台上运行应用程序或者DLL,先要将EXE或者DLL复制到%_FLATRELEASEDIR%中,再单击PB菜单上"Target"-"Run Programs",在程序列表中找到指定的EXE文件,再单击"Run",在模拟器上就可以看到你所运行的应用程序了。因为EVC附带的模拟器不支持中文,所以有些应用程序需要到PB的模拟器上运行。CE的帮助文档中介绍了如何在PB的模拟器上对应用程序设置断点进行调试,但是我没实验成功。另外凡是基于x86指令集编译的EXE、DLL都可以在模拟器上运行,除非EXE、DLL包含的功能模拟器无法模拟(模拟器的限制在我以前的文章中有说明)。
作者: 分类: 分类:其他 标签: 关键词:

Platform Builder之旅(三)

2008年3月2日 没有留言

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中修改配置文件前如果没有把握最好先做好备份。

.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

注:整个内核的地址都是从0×8000 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 

  默认值为0×80808080。指定为文件系统分配的内存的百分比。number分为四个字节,由十六进制表示。

byte0的值(单位为4KB)表示在第一个2MB中,其中每1MB包含的4KB的整数倍。
byte1的值(单位为4KB)表示在第二个2MB中,其中每1MB包含的4KB的整数倍。
byte2的值(单位为4KB)表示在第三个2MB中,其中每1MB包含的4KB的整数倍。
byte3的值(单位为4KB)表示在剩下的内存中,每1MB包含的4KB的整数倍。

  计算一下默认值0×80808080表示的百分比:0×80*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

设置内核选项的位掩码,多个位掩码可以组合使用。

  • 0×0001 禁止按需分页:EXE和DLL默认是按需分页的。
  • 0×0002 禁止全内核模式:进程运行在两种模式下,用户模式和内核模式。全内核模式下所有线程运行在内核模式。全内核模式能够提高执行效率,但会增加系统的不稳定性。如果允许执行用户程序,那么不适合采用全内核模式。
  • 0×00000010 只信任来自ROM的模块(DLL、EXE)。默认ROM中的模块和所有文件系统的模块都是内核信任的。OEM能够在OAL层实现对所有运行模块的检查,这个标志将忽略对来自ROM保存的模块的检查。
  • 0×00000020 停止刷新TLB。这个标志仅用于运行在x86CPU上的内核。TLB(Translation Look-aside Buffer),有人翻译成变换索引缓冲区,它的作用是在虚拟地址和物理地址之间转换。对于具有实时性的内核,这个标志应该设置。
  • 0×00000040 按照/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之旅(二)

2008年3月2日 没有留言

Platform Builder之旅(二)

作者:付林林

  上一章所说,当用PB的"定制平台向导"选取了一个平台的所有特征(feature)后,接下来的工作就是编译了。即使你从来未曾编译过,你也能想象得到编译的时间一定很长。因为PB是在编译一个操作系统,而非一个应用程序。当然,越快的硬件环境编译的速度就越快。一般我编译一个内核需要5分钟到10分钟之间。
  在编译之前你可能还要对这个CE平台的某些特征进行修改。为此,你必须熟悉PB的操作环境。下面图1是PB打开一个平台工程文件的界面。


图一 PB主界面

图一中数字所指示的内容描述如下:

  1. "Build"工具栏。此工具栏上按钮、下拉框都用于编译、调试。数字1指向的下拉框是编译指令集,可以指定不同的指令集来编译CE平台或者应用程序。
  2. "Workspace"窗口。此窗口有三个子视图,分别为FeatureView、ParameterView、FileView。当打开一个平台工程文件后,FeatureView显示这个平台所有的特征。如设备驱动程序、各个软件组件等。ParameterView显示所有平台通用的配置文件和当前平台的配置文件,这些配置文件扩展名为*.bib、*.reg、*.db、*.dat。FileView显示在当前CE平台上建立的应用程序源码文件、资源文件、资源脚本文件等。也就是说如果在当前CE平台上建立一个应用程序工程,那么所有的文件都在FileView中显示出来。类似EVC、VC的"Workspace"窗口中的"FileView"。注:关于FeatureView和ParameterView包含的内容在以后的文章中讲解。
  3. "Output"窗口。用于显示输出信息。类似EVC、VC的"Output"。
  4. "Target"窗口。此工具栏上按钮分别用于下载内核文件到模拟器或实际平台、连接、断开。当一个CE平台编译好了之后,就可以按下载按钮将平台(nk,bin)文件下载到模拟器上运行。
  5. "Catalog"窗口。这个窗口包含所有的CE支持的特征。
  6. 状态栏图标。位于状态栏最右端的四个图标中,最左边的图标表示当前下载状态。另外三个表示三种服务状态,这三种服务运行在目标机(target device)上。在这里就是模拟器。

  要向当前CE平台添加特征,首先在右边"Catalog"窗口中找到要添加的特征,找到后移动鼠标光标到此特征上,然后单击右键,在弹出的菜单中单击"Add to Platform",PB就将此特征添加到左边当前CE平台中。如果无反应说明此特征已经被添加进去了。要删除当前CE平台中某一个特征,移动鼠标光标到此特征上,单击右键,在弹出的菜单中选择"Delete"。并非所有的特征都可以任意删除,因为有些特征是彼此关联的。这部分将在以后的文章中讲述。
  对平台进行一些基本的设置,打开菜单"platform"-"Settings",检查"Locale"选项卡中地区和语言设置。这一点很重要,它决定着编译的平台采用的语言种类。再在"Environment"选项卡中添加"IMGRAM64"环境变量,值设置为1。单击"OK",PB开始将此环境变量加入到平台中。单击工具栏上"Build Platform"按钮开始编译。
  在讲述编译过程前必须先了解环境变量以及如何读取和设置环境变量。一个环境变量包含了一个CE操作系统某一方面的信息。例如一个驱动程序、一个路径、一个配置文件、一个特征等。当PB编译CE平台时,先做的工作就是收集所有的环境变量供编译器使用。读取和设置环境变量的最好方法是单击PB菜单"Build"-"Open Build Release Directory",PB会弹出一个控制台窗口,也就是命令行外壳。键入"set"命令,当前平台所有的环境变量就显示出来了,不过要多屏显示。为了看清楚每个变量的值,可以键入"set |more",这样就可以分屏查看了。还可以将所有环境变量信息保存到硬盘上,比如键入"set >C:\envi.txt"。要查看单个环境变量值,键入"set 环境变量名"。要修改原环境变量的值键入"set 环境变量名=值"。有些环境变量无需键入值就可以达到修改目的。比如前缀为"BSP_"和"SYSGEN_"的变量,键入"set 环境变量名="就取消了这个环境变量。在IDE中也可以修改环境变量,如上面所说的设置"IMGRAM64"的值,就是在IDE中修改的。利用环境变量也可以添加和删除特征,如BSP变量。BSP变量分两种,一种以BSP_NO为为前缀,一种以BSP为前缀。以BSP_NO为前缀表示当前平台不支持某一特征,以BSP为前缀表示支持这一特征。例如BSP_SERIAL2表示此CE平台支持串口2;BSP_NOSERIAL表示此CE平台不支持串口。如果在PB的"catalog"中找不到要添加的特征,可以通过设置BSP变量来实现。具体BSP环境变量参见CE帮助文档。

下面讲述整个编译过程中PB所做的工作:

  • 执行cebuild.bat批处理文件。
  • cebuild.bat调用sysgen.bat批处理文件。
  • sysgen.bat调用cesysgen.bat批处理文件,cesysgen.bat负责在*.wce文件中搜索用户选择的特征,然后形成一系列环境变量。之后PB会显示这些变量,下面几个步骤就是显示收集的变量。
  • 产生SYSGEN变量。每个SYSGEN变量对应一个特征。
  • 产生CE_MODULE、COREDLL_COMPONENTS、FILESYS_COMPONENTS、DEVICE_COMPONENTS、GWE*_COMPONENTS、DCOM_MODULES、FONTS_COMPONENTS等环境变量。其中每个环境变量包含某一个特征具体的内容。从环境变量名称就可以看出来是哪种特征。
  • 对_DEPTREES环境变量指定的每个目录分别执行sysgen.bat批处理。_DEPTREES这个变量的值是一些目录名(例如DCOM、IE、SERVERS、DIRECTX、WCESHELLFE等),这些目录名位于%WINCEROOT%\public。如果安装PB v4.1时默认安装路径,那么此目录路径为C:\WINCE410\Public。
  • 编译BSP。因为我们采用的BSP是Emulator,所以PB会编译%WINCEROOT%\Platform\Emulator目录下三个子目录KERNEL、DRIVERS、GWE中的源码文件。
  • 清除_FLATRELEASEDIR环境变量指定的目录下的所有文件、子目录。假如我们定制的平台路径为C:\Emulator,那么这个环境变量的值为C:\Emulator\RelDir\Emulator_X86Release。
  • 复制%_PROJECTROOT%\所有文件到_FLATRELEASEDIR。
  • 根据本地地区环境变量,寻找所有与本地语言相关的*.str文件复制到_FLATRELEASEDIR中。*.str文件中包含了字符串资源,将字符串与ID关联。在_FLATRELEASEDIR目录下你可以看到以地区码为目录名的子目录。
  • 处理NLS(国家语言支持)数据。
  • 执行fmerge.exe。合并所有*.bib文件为一个文件ce.bib,合并所有*.reg文件为一个文件reginit.ini。
  • 执行cebuild.bat批处理文件。
  • 执行fmerge.exe。合并所有*.db文件为一个文件initdb.int,合并所有*.dat文件为一个文件initobj.dat。
  • 运行regcomp.exe压缩reginit.ini。
  • 运行txt2ucde.exe。将整个CE平台涉及到的所有字符串转成unicode码。
  • 运行res2exe.exe。将所有*.dll、*.exe、*.cpl文件中的资源更新。资源更新部分主要和语言相关。
  • 运行Romimage.exe。将所有文件合并压缩成一个文件nk.bin(默认文件名)。

  整个编译过程被调用的批处理文件和EXE文件主要包括:cebuild.bat、sysgen.bat、cesysgen.bat、nmake.exe、txt2ucde.exe、makeimg.exe、fmerge.exe、regcomp.exe、res2exe.exe、romimage.exe、build.exe。在这里声明一点,我不保证所讲述的PB的编译过程一定是准确无误的。从总体上讲PB所做的工作就是这样。

作者: 分类: 分类:其他 标签: 关键词:

如何控制CE系统的重启或者关机

2008年3月2日 没有留言

可以调用函数ExitWindowsEx, 在Win
CE上,这属于Undocument API,虽然没有公开,但是可以使用。
/*
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 1
#define EWX_REBOOT 2 重启
#define EWX_FORCE 4
#define EWX_POWEROFF 8 关机
*/
extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
ExitWindowsEx(EWX_REBOOT, 0); //重启
ExitWindowsEx(EWX_POWEROFF, 0); //关机

2.动态链接库注入机制
在Windows 2000中提供了很多DLL注入机制:
使用注册表来插入DLL
使用Windows挂钩来插入DLL
使用远程线程来插入DLL
使用特洛伊DLL来插入DLL
将DLL作为调试程序来插入
但是,作为嵌入式操作系统,提供的接口少多了,在Smartphone 2002 (基于Windows CE 3.0) 中并不提供动态链接库注入机制,在Smartphone 2003才提供,使用Dll Inject机制,可以在注册表中设置关键字HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL的值,该关键字数据类型为REG_MULTI_SZ,包含一个DLL文件名或者一组DLL文件名(用逗号分离),列出的每个DLL文件名都可以包含一个路径。当系统启动时,列在该键值中的每个DLL会映射到系统加载的每个进程中(Nk.exe和Filesys.exe除外)。
当进程创建时,系统将分配进程的地址空间,接着将可执行文件映像和所有需要的DLL文件(包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的所有DLL)映像映射到进程的地址空间中。然后才创建进程的主线程,并使用该线程调用每个DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当已经映射的所有DLL都对通知信息作出响应后,系统将使进程的主线程开始执行可执行模块的C/C++ Runtime启动代码,然后执行可执行模块的进入点函数(WinMain)。
如果DLL(不包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的任何DLL)的任何一个DllMain函数返回FALSE,表明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除所有文件映像,给使用户显示一个消息框,说明进程无法启动运行。
前面说过,NK.exe和Filesys.exe不受该键值的影响,这主要是由于Windows CE的启动过程造成的[4]。
当系统复位时,CPU将跳转到NK.exe的入口。NK.exe是Windows CE的核心模块,入口的代码实际上是由OEM编写的,而不是Microsoft,因为不同的平台,硬件也不一定相同,因此Windows CE需要OEM编写一些特定的初始化代码,这些代码被并入内核的硬件抽象层(HAL, Hardware Abstraction Layer),当OEM为特定硬件平台建立系统时,HAL将和Windows CE内核代码静态连接而产生NK.exe。
Nk.exe在设计时与文件系统(包括注册表系统、数据库系统)是独立的,也就是说NK.exe不会负责文件系统的初始化,但是在NK.exe初始化过程中要用到注册表数据,因此,当NK.exe启动后,将创建有名事件(Named Events)SYSTEM/FSReady,加载并运行系统程序Filesys.exe, 然后转入睡眠等待事件变为已通知状态。
Filesys.exe负责管理文件系统、数据库函数和注册表。Filesys.exe被加载后,将检测这次启动是冷启动还是热启动。冷启动和热启动的最大区别就是内存中是否存在已初始化的文件系统。
如果是热启动,内存中保留了上次使用的数据,Filesys.exe将使用这个已初始化的文件系统。如果是冷启动,Filesys创建一个文件系统,将空内存文件系统和ROM中的文件合并在一起。
当文件系统存在后,Filesys.exe会创建默认的数据库和注册表,初始化本地语言支持模块(National Language Support, NLS)。
接着Filesys.exe将事件SYSTEM/FSReady置为已通知状态,然后转为睡眠状态等待Nk.exe完成初始化后将其唤醒。
由于事件SYSTEM/FSReady置为已通知状态,NK.exe被唤醒接着运行,此时,注册表已被Filesys.exe创建,NK.exe根据注册表的键值继续运行,如配置虚拟内存管理器,初始化默认处理程序的中断向量表,初始化端口等等,当然,最重要的是通知Filesys.exe可以继续运行。
Filesys.exe被唤醒后,接着进行后续的初始化工作,如根据列在注册表HKEY_LOCAL_MACHINE\System\Events中的名字创建有名事件SYSTEM/PowerManagerReady,SYSTEM/GweApiSetReady,SYSTEM/ShellAPIReady,SYSTEM/BatteryAPIsReady等等,这些有名事件的初始状态都是未通知状态,后面有相应的程序来对其进行设置,如图形窗口和事件管理器(GWE,Graphics Windowing and Event Manager)初始化图形API后,会把有名事件SYSTEM/GweApiSetReady值为通知状态,系统知道图形API有效,可以进行图形绘制。
所以,在Nk.exe和Filesys.exe被加载前,系统不可能去搜索注册表,更谈不上Dll Inject钩子机制。
关于Windows CE的详细的启动步骤请参考MSDN。

作者: 分类: 分类:其他 标签: 关键词: