Eboot代码流程 [转]

Eboot代码流程 
                                            ----by nasiry
                                                        转载请说明出处

eboot弄了很多次了,一直都没有整理一下整个代码流程。这次还是事来做一下吧:

首先通常都是汇编代码:启动时由系统复位导致PC为0为触发条件:以2440代码为例直接进入fw.s文件。主要执行的操作为设置处理器频率(PLL),设置内存参数,须注意的是在该部分代码虽然在形式上实现了诸多中断向量,但是这些代码根本上不会得到执行。(参考“Eboot 编译编译器决定中断向量及其实现单一性的原因”)而在后面会有一些其他手段用于实现中断向量的功能。由于和hal复用该部分文件,所以调用的函数名称会与内核启动函数的相同(如:KernelStart),但是实现内容却是完全不同的。在该部分的最后还将保存一个OEMAddressTable的地址指针到下一格函数,进行应有的内存影射。下面还是以2440bsp为例说明。根据windowsCE系统的要求,需要把将会操作到的内存空间影射到0x8000 0000后的512M空间中,其中低256M为带缓冲的,高256M则是不带缓冲的。不带缓冲的区域通常是驱动访问设备必须的,这样可以保障对硬件的操作不受到缓冲的干扰。除了按照OEMAddressTable进行内存空间影射外,还可以要根据程序需求进行其他一系列影射,通常的做法都是将目前所有的设备/内存在原地址空间上再影射一次,以方便使用。另外就是在将0x0位置影射到内存,这样,就可以通过这个部分来进行中短向量的安装了,以实现中断服务程序。(以上内存影射并不是必须的,仅仅是为了方便程序的编写而已,使用和系统相同的影射表可以使得不必重新另外建一套头文件,同时如果需要的话可以一直在内存中保存eboot,这样内存空间的规划也会相对容易做一些)。

以上的这些工作做完,就进入windowsCE提供的eboot入口函数了。 也就是BootloaderMain。这个函数位于WINCE420/PUBLIC/COMMON/OAK/DRIVERS/ETHDBG/BLCOMMON/blcommon.c文件中。该目录的文件就是微软提供的eboot框架,尽管这不是实现的部分,也一并分析了吧。这部分的内容一开始就很有意思,第一个执行的语句如下
if (!KernelRelocate (pTOC)) {  HALT (BLERR_KERNELRELOCATE);   }
而这个传入的参数却这样定义:ROMHDR * volatile const pTOC = (ROMHDR *)-1;  按照程序的内容来说,这个函数到这里一定是死循环了,可是事实上这个死循环不会得到执行,也就是pTOC = (ROMHDR *)-1并没有真正的起到作用。 在pTOC第一次使用前检查了一下pTOC的值,结果如下:pTOC=0x8C04D694。也就是说pTOC在没有被改变之前就已经不再是-1了,而且pTOC是被定义成const的,也没有办法去改变,看样子就只能是编译器的过程中这个指针就已经被动了手脚。而查看eboot.map中该地址所对应的内容居然是bootpart.obj的内容。感觉是无从下手了,这样子让人太费解了。仔细比较eboot.exe和eboot.nb0后发现,eboot.exe通过romimage处理后长度增加了,而且结构上改变了许多,在原.eboot.exe后增加了一系列原来没有内容,pTOC的内容就是属于这部分内容中的一部分。由于牵涉到windowsCE的Image Chain结构,所以无法继续往下分析,这部分的内容就先跳过。以后再回头来看。

随后在 BootloaderMain中对调试界面进行初始化,由OEMDebugInit完成这个函数的实现是由具体的硬件决定的通常来说为串口的初始化,再次以后就通过该调试界面进行调试信息的发布。

然后在OEMPlatformInit()中对eboot所要用到的硬件资源进行初始化设备,通常这些会包含:存储设备(FLASH、硬盘等)、传输界面(以太网卡、USB-RNDIS、无线网卡、CF—LAN等等)、系统时钟,为下面将会进行的os镜像传输、os镜像存储、读取等等一系列动作做好准备。
做好准备以后就可以调用OEMPreDownload ()来进行传输OS的准备了,在这个函数中通常会实现一系列功能,诸如:设备的设置、存储设备的格式化、网卡IP的指定、等等。windowsCE所支持的标准操作则只是两个,一个是跳转、一个是下载、分别对应下载OS镜像和跳入OS的入口点,前面提到的那些功能都是自己的扩展实现。

下面我们分别来看这两个标准操作的分支:首先是下载的分支,在下载的分支中首先通过OEMReadData来获取在最先收到的标示位也就是被称为魔法数的数据,用以比较确认该传输的内容是否为windowsCE的镜像数据,随后继续进一步获取将接收的数据的效验和,待接收的镜像的数量,镜像起始地址、长度等信息,有了这些个信息,很自然地就是接收镜像了,

随后检查数据的效验和。下一个镜像的信息的接收,如此往复循环直至所有的镜像信息接收完毕。

jason128 发表于 >2004-12-14 0:28:39 [全文] [评论] [引用] [推荐] [档案] [推给好友]

2004-12-14
[转]WindowsCE目录解析

WindowsCE目录解析

---windowsCE.net 4.20篇

---------------by nasiry 
                                     转载请说明出处,并通知我

windowsCE的目录结构巨大而庞杂,尽管windowsCE的帮助对这个庞大的目录结构进行了说明仍然有很多目录下对应的代码在windowsCE help没有介绍其具体用途,下面就将windowsCE的目录结构进行简单的介绍。
1.SDK
在windowsCE.net4.2的根目录下存在PLATFORM,PRIVATE,SDK,OTHERS,PUBLIC五个目录。SDK是其中最为简单的一个目录结构SDK/BIN/I386下所存放的就是开发所需要的工具集,编译器等等,在这里我就不再啰嗦了。
The SDK directory contains tools that are used by Platform Builder. However,
it does not contain the tools that are used to build the image. The tools
contained by the SDK directory are:
.. Processor compilers
This directory contains the cross compilers and assemblers for supported
platforms.
.. Development tools
This directory contains the tools such as, Error Lookup, GuidGen, and Link
and Nmake.
.. Miscellaneous utilites
This directory contains the utilities, such as Zoomin, and Windiff.

2.other
这个目录下的内容比较杂,有诸如ATL,MFC的头文件,运行库等开发应用程序所需的库文件和其一部分代码。其中有个文件目录对开发系统来说是比较重要的,就是CETK的客户端OTHERS/WCETK,通过该目录下的文件可以订制自己的Windows CE .NET Test Kit客户端。
The Others directory contains all the Windows CE runtime libraries and
headers, components for .NET Compact Frameworks, and Samples for ATL
and MFC. The Others directory contains the following subdirectories:
.. ATL
This directory contains ATL headers, libraries and source code for
debugging. The library debug symbols are also included.
.. DOTNET
This directory contains the .NET processor specific binaries and portable
.NET Compact Framework files.
.. MFC
This directory contains MFC Headers, Libraries and Source Code for
debugging. The library debug symbols are also included.
.. SAMPLES
This directory contains the MFC and ATL sample applications.
.. WCETK
This directory contains the Windows CE Test Kit (CETK) processor
specific binaries. CETK provides tests for each class of devices. Within the
CETK, you can choose the appropriate test to perform on your device driver
and the tool remotely runs the tests on your target device.

3.PLATFORM
PLATFORM下存放的就是传说中的BSP了,这些BSP提供对各种开发板的硬件抽象层,bootloader,soc驱动等资源,由此可见这个目录下的资源是硬件相关的,一般说来该目录下每个文件夹都对应一个SDB的,下面以SMDK2410为例说明platform目录结构的内容.
|platform|--smdk2410----|--CESYSGEN
   |--DRIVERS------|--DISPLAY
   |  |--DRVLIB 
   |  |--KEYBD
   |  |--PCMCIA
   |  |--PWRBTN
   |  |--SERIAL
   |  |--TOUCHP
   |  |--USB
   |  |--WAVCLICK
   |  |--WAVEDEV
   |--EBOOT--------|--ARM
   |  |--BIN  
   |--FILES--------|--INTLTRNS
   |--GWE----------|--BUILDEXE
   |  |--NLEDDRV
   |--INC  |
   |--KERNEL-------|--BUILDEXE-----|--KERN
   |  |  |--KERNKITL
   |  |  |--KERNKITLPROF
   |  |--HAL
   |  |--PROFILER
   |--NAND*
   |--UTILITIES*
其中NAND和UTILITIES是2410的bsp特有的,NAND包含的是以NANDFLASH为启动介质的启动代码,UTILITIES里面的内容是包含调试信息的可执行文件-三星的测试程序(用ADS的调试器AXD就可以使用该文件)。
CESYSGEN一般都只有一个叫makefile的文件,通常该文件指向(_WINCEROOT)/public/common/cesysgen/CeSysgenPlatform.mak 也就是公共的platform生成文件,该文件为产生windowsCE项目提供支持。
DRIVER目录下的内容也是很直接的,也就是各种soc的设备和板载设备的驱动。例如:display就是lcd控制器的驱动,keybd就是键盘驱动等等
eboot目录下面的文件是ethernet bootloader的源文件,通常这个目录下的文件都来自于PUBLIC/COMMON/OAK/DRIVERS/ETHDBG所提供的模版改写得到,因此发现该目录下文件使用到未知的函数时都可以到上述文件中寻找答案。(bootloader的源文件是完整的,有兴趣的男男女女都大可研究一下)
FILES下面就是一个杂物仓库,里面可能有BSP提供的应用程序和生成系统所需要的信息文件。要是想要知道该bsp的入口点,调整镜像,了解静态高内存分配等信息大可以到这儿一看,INTLTRNS子目录下定义了一些字串,这些字串在生成系统的时候用来替换CEPB生成注册表所使用的标示。
GWE里面就是GWES的部分了,这里面NLEDDRV下面的文件是LED提示灯的驱动,至于buildExe就是生成gwes.exe所需的文件了,事实上这个目录下是空的,因为使用CSP里面的GWS.lib等所提供的接口已经完备了。
INC就是头文件的聚集地,这个就不说了。
KERNEL:
   这个目录结构是整个bsp的关键所在,内核就在这儿诞生。
   buildexe目录下的三个文件夹-KERN-KERNKITL--KERNKITLPROF分别生成kernel的三个版本kernel only/kernel with kitl transport/kernel with kitl and profiler,第一个版本就是最基本的kernel也就是以后用作发布用的,第二个提供了kitl传输界面,可对系统进行调试,而kernkitlprof提供了传输界面的同时还提供了专门的性能计时器用作测定系统性能。
   PROFILER目录下面的就是性能计时器的代码。
   HAL下面是内核硬件抽象层的代码所在。
   基本上platform文件夹就是这个样子了,比起后面还没有说的private和public目录来说这两个文件夹的结构还是相对简单明了的。
   我们看看后面都还有什么东西

4.PUBLIC 
这个文件夹是我这辈子见到过的最最可怕的目录结构之一。总而言之这里面什么东西都有,一个字"杂",难说得上什么分类。先来看看第一级子目录的结构吧。
|public-|--WCESHELLFE *
 |--SHELLSDK   * 
 |--SHELL      * 
 |--WCEAPPSFE  
 |--VIEWERS
 |--SQLCE
 |--SPEECH
 |--SERVERS
 |--SCRPIT
 |--IE
 |--RDP
 |--NETCF
 |--IABASE
 |--HLBASE
 |--DirectX
 |--DCOM
 |--DATASYNC
 |--COMMON
COMMON下面的东西很多,现在我们先绕开不说。我还是从上往下说吧(流汗中...)
4.1关于shell 
WCESHELLFE,SHELLSDK,SHELL这三个目录下的东西都是shell相关的(别问我什么是shell,它就是你天天看到,最最熟悉你还不知道它的存在的那个玩意儿).SHELL下面提供了standshell和AYGSHELL,standShell就是标准的windowsCEshell看起来和tablePC的样子差不多,其中AYGshell原来是给Pocket PC设计的,这两个shell都可以在CEPB的IDE里面选。
至于WCESHELLFE,主要是各种windowsShell的组件:
CTLPNL就是控制面板的组件,有了这个你可以自己做自己的控制项,且不愉快?
FTPUPDATE提供了通过ftp升级firemire的程序,作用也是给大家照猫画虎
LANG 和INPUTMETHODS 是输入法支持,这个我不了解就不乱说了
Taskman 这个就比较有意思,恐怕很多人都会需要这个东西,用这个shell可以直接生成一个空的桌面,没有图标,没有icon,除了蓝色的桌面什么都没有,不过这个不能通过IDE选项生成,照帮助也是弄不出来的,需要修改sysgen.bat才行。
至于这个目录下面的那些个什么FILE ,inc,lib与上面提到的同名的文件夹作用差不多,我就不再说了.
shellSDK就比较简单了,里面也就是开发SHELL应用程序所要用的head和lib,没啥好讲了。
Modules and components relative to the far-east enabled
shell, such as, task manager and control panel components

4.2 WCEAPPSFE
传说这里面有word和outlook,我没弄过,也不清楚。
既然别人这么说我就当它有吧。

4.3 VIEWERS
这个听名字就知道是干什么的,也就是windowsCE带的那一对查看器,比如什么pdf啊,excel啊,word啊什么的,不过都不是source都只是lib了,所以也没什么大的意思的。

4.4 SQLCE
这个就是SQLCE的老家,不过和上面一样,还是没得改,更没得写,一样的无聊。

4.5 SPEECH
这个目录下面是MS SAPI5.0,里面包括了TTS和语音识别,免费的啊!不过只支持汉语和英语还有日语的TTS其他的语言一概不支持。同样也是不开放代码,顺便说一句,file里面有个voice目录,那个是发声文件,要想听别的声音就要自己换,要是谁知道哪儿有这些vce文件请告诉我一下。

4.6 SERVERS
这个目录下主要是windowsCE的网络服务。上次记得有人问我类似路有器的远程管理界面(web shell)是怎么弄的,在这儿找答案吧。

4.7 SCRPIT  IE
这个不用说了就是天天用的Internet Explorer还有java-vb script支持所在。其中IE是可以订制的。

4.8 RDP
该目录下面提供远程桌面的支持(我理解为用于windowsCE的木马),包括远程软件的客户端和服务端。里面有个第三方软件,具体的使用方法我也不是很清楚。

4.9 NETCF
Dot Net Compact Framework.事实上目录下面是空的,到底这些.net的文件都在那儿呢?看看makefile就可以知道,这里面用到的资源都是来自于前面讲过的%WINCEROOT%/OTHERS/DOTNET下面。
4.10 IABASE
4.11 HLBASE
这两个合到一起讲,这两个目录存在的目的不是给PB的IDE用的,而是在命令行模式下创建工程的模版,里面有很多.bat文件,对应了一些默认的配置,这个和PB IDE里面的向导是一致的。两个目录的区别在于,一个带显示一个不带,这就决定了配置有很多相关的东西不一样:如gwes等,所以分开两个目录,使用不同的sysgen.bat文件。在CE5.0中已经将这两个目录合二为一了。
Internet Appliance Base Configuration
Headless Base Configuration

4.12 DirectX
DirectX就是DirectX了,看看目录结构
├─CESYSGEN
Sysgen目录下
├─OAK
│  ├─FILES
│  │  ├─INTLFILE
│  │  └─INTLTRNS
│  ├─INC
│  ├─LIB
│  └─VOIP
│      ├─VOIPMEDIA_REF
│      ├─VOIPPROV
│      │  ├─FILE
│      │  ├─LDAP
│      │  ├─MANUAL
│      │  ├─MANUAL_CORE
│      │  ├─TEST
│      │  └─XMLHELPER
│      └─VOIPUI
│          ├─APP
│          │  └─RES
│          ├─HELPER
│          ├─IME
│          ├─INC
│          └─STATE
└─SDK
    ├─INC
    ├─LIB
    └─SAMPLES
        ├─D3D
        │  ├─BOIDS
        │  ├─SIMPLE
        │  └─TUTORIALS
        │      ├─TUT01_CREATEDEVICE
        │      ├─TUT02_VERTICES
        │      ├─TUT03_MATRICES
        │      ├─TUT04_LIGHTS
        │      └─TUT05_TEXTURES
        ├─DDRAW
        │  ├─INCLUDE
        │  └─SRC
        │      ├─DDEX1
        │      ├─DDEX2
        │      ├─DDEX3
        │      ├─DDEX4
        │      ├─DDUTIL
        │      ├─DONUTS
        │      └─MOSQUITO
        ├─DDVD
        │  ├─ANXJTEST
        │  ├─DVDPLAY
        │  └─DVDSAMPLE
        ├─DSHOW
        │  ├─BASECLASSES
        │  │  ├─HEADED
        │  │  └─HEADLESS
        │  ├─FILTERS
        │  │  ├─BALL
        │  │  ├─DUMP
        │  │  ├─EZRGB24
        │  │  └─INFTEE
        │  └─PLAYERS
        │      ├─CEPLAYIT
        │      ├─DDXCLMV
        │      ├─HLPLAYIT
        │      └─PLAYWND
        ├─DSOUND
        │  ├─CAPTUREECHO
        │  └─DSPLAY
        ├─DXMISC
        │  ├─DDCAPS
        │  └─DXVIEW
        ├─MIXER
        │  └─TMIX
        ├─STB
        │  └─STBIHOST
        ├─VOIP
        │  └─VOIPDEMO
        │      ├─RESOURCES
        │      └─SOURCE
        └─WMP
            └─CEPLAYER
                └─RES

4.13 DCOM
该目录提供DCOM/COM的支持,可惜的是没有源码,仅仅是2二进制的链接库。值得注意的是SDK目录下面的sample目录下提供比如:regsvr32等等常用的工具。

4.14 DATASYNC
Device-side communication components.

5 public/common/OAK/driver
不要以为这个目录下的东西就像它的名字一样全部都是驱动,事实上这个目录下面有很多驱动和windows组件,我们在windowsCE IDE中选取的很多特性的源代码都在这里,而且这儿提供了很多开发模版供我们写代码使用,个人认为用好这个目录是我们是定制自己的windowCE的关键,特色windowsCE就从这里开始。
到这里顺便说一个事情,OAK这个目录名一直困扰我多年,直到前段时间有位叫做"土豹子"的兄弟告知才明白,oak原来是OEM adaptation kit的意思。
下面我们就来看看这下面都有什么东西吧。
├─1394
│  ├─DRIVERS
│  │  ├─CLIENT
│  │  │  ├─1394DCAM
│  │  │  ├─AVC_STREAM
│  │  │  └─AVC_VCR
│  │  └─VIRTUAL
│  │      ├─1394DCAM
│  │      ├─AVC_UNIT
│  │      └─AVC_VVCR
│  ├─INC
│  └─TEST
│      ├─DRIVER
│      │  ├─1394DIAG
│      │  ├─1394VDEV
│      │  └─COMMON
│      ├─INC
│      └─UI
│          └─TOPOMAP
1394驱动。
├─ACM
│  ├─ACMDWRAP
│  ├─GSM610
│  ├─MSFILTER
│  └─PCMCONV
├─BATTDRVR
│  └─TEST
│      ├─GETBAT
│      └─SETSTUBBAT
ACM是Audio Compression Manager 的简写也就是音频压缩管理器,该目录下面所提供了G.711 (A-law 和 mu-law 编码), GSM 610, G.722.1, 和 SIREN,说白了就是音频编码器,做传输用途做voip这类的东西时还是比较有用的。GSM610在同名目录下,另外的几个ACM在MSFILTER目录下。PCMCONV故名思义就是PCM converter了.
├─BATTDRVR
电池驱动。
├─BLOCK
│  ├─ATADISK
│  ├─ATAPI
│  ├─MSFLASHFMD
│  │  ├─ECC
│  │  ├─INC
│  │  ├─SDNPCI
│  │  │  ├─SDNPCID
│  │  │  └─SDNPCIK
│  │  └─STRATA
│  │      ├─STRATAD
│  │      └─STRATAK
│  ├─RAMDISK
│  │  ├─DRIVER
│  │  └─LOADERDriver Code Structure
│  └─SDMMC
BLOCK目录下面就是windowsCE提供的所有的block驱动。包括PCCARD接口的硬盘/光驱,Flash,以及ramdisk和SD card /MMC card的驱动程序。
ATAPI是PCI总线的ATA控制器驱动,尽管只有一个目录内容却是不少的这里面包含了ALI的1543,promise的20262,intel 82371ATA控制器/南桥芯片的驱动程序。ATADISK是PCMCIA ATA卡的驱动。另外还有PCI总线界面的SD/NANDFLASH/MMC卡,以及平面接口的NORFLASH的驱动程序。RAMDISK是使用内存模拟存储系统的例子。
├─BLUETOOTH
│  ├─DRIVERS
│  │  ├─WCESTREAMBT
│  │  └─WENDYSER
│  ├─PROFILES
│  │  └─HID
│  │      ├─BASE
│  │      ├─PARSER
│  │      └─PB
│  ├─SAMPLE
│  │  ├─ASUI
│  │  ├─BTCP
│  │  ├─BTDC4.15 COMMON
│  │  ├─BTDIALER
│  │  ├─BTDIALP
│  │  ├─BTECHO
│  │  ├─BTENUM
│  │  ├─BTFILTER
│  │  ├─BTHEADSET
│  │  │  ├─BTAUDIOGW
│  │  │  ├─BTHSAGW_CE
│  │  │  ├─BTHSAGW_MDD
│  │  │  ├─HEADSETCTL
│  │  │  ├─INC
│  │  │  ├─PLAY
│  │  │  └─TALK
│  │  ├─BTHLINK
│  │  ├─BTHNSCREATE
│  │  ├─BTLOADER
│  │  ├─BTMODEM
│  │  ├─BTPAIR
│  │  ├─BTSVC
│  │  ├─COMTEST
│  │  ├─DUNPORT
│  │  ├─FCTEST
│  │  ├─GW
│  │  ├─HCITEST
│  │  ├─L2CAPAPI
│  │  ├─L2CAPDEV
│  │  ├─OPTTEST
│  │  ├─PHONEUI
│  │  ├─PRINTUI
│  │  ├─SCA
│  │  ├─SDPCOMMON
│  │  ├─SDPPRINT
│  │  ├─SDPSEARCH
│  │  ├─SOCKTEST
│  │  └─SSA
│  └─TRANSPORTS
│      ├─AMBICOM
│      ├─BCSP
│      ├─SC
│      ├─UART
│      ├─UNIV
│      ├─USB
│      └─WSS
│          └─INC
这个目录下的是关于蓝牙的支持,我没看过,也就不乱说了。
├─CALIBRUI
这个目录是一个触摸屏校准的例子。
├─CEDDK
│  ├─DDK_BUS
│  ├─DDK_DMA
│  ├─DDK_IO
│  ├─DDK_MAP
│  ├─DDK_TIME
│  ├─DLL
│  └─TEST
│      ├─ISAENUM
│      └─PCIENUM
由于嵌入式系统的硬件架构千差万别所以在定制DDK的时候需要为自己的硬件系统专门实现一套一般操作的硬件抽象层,以供其它开发者使用这些一般的操作能够控制挂接的设备,这些操作通常包括总线,DMA,IO,计时器等资源,以该目录的为一套x86的DDK的接口抽象。
├─CERDISP
│  ├─CERDISP
│  ├─CERHOST
│  └─INC
远程显示的例子。这个远程显示就是windowsCE特性里面的那个。
├─DISPLAY
│  ├─AABLT
│  ├─ATI
│  ├─DDGPE
│  ├─DISPPERF
│  ├─EMUL
│  ├─EMULROTATEPERM3
│  ├─EMULSTUB
│  ├─GPE
│  ├─GPEROTATE
│  ├─MQ200
│  ├─NOPDISP
│  ├─PERM3
│  ├─PERM3_CFG
│  ├─RFLAT
│  ├─SWG
│  ├─TVIA5000
│  └─VGAFLAT
显示部分的东西就比较多了,aablt是抗锯齿的例子,DDGPE是带DDraw的GPE驱动的例子,DISPPERF是测试驱动效率的一段代码,夹在自己的程序里面可以做测用。,SWG是Microsoft Software Graphics Library的源代码,没有看完不知道齐不齐。以mul开头的都是模拟图形处理源代码,还有gpe的源代码,带旋转能力的gpe的源代码。上面能说的这几个在display 目录下的程序都不是驱动程序,应该算是windowsCE GWES显示部分的一些源代码尽管没有提供完整的代码但从这些个零散的代码也能看出windowsCE的图形库的基本结构了,还是很有研究价值的,更况且这个和winnt的架构是如此的相似:P
NODISP是个比较特殊的显示驱动的例子,它满足GDI的借口需求但同时并没有实际的显示,有PERM3啥用我也没想明白。
rflat下面是基于GPERotate的显示驱动,想要旋状你的屏幕又不想改硬件的可以来看看。至于vgaflat就是模拟器上使用的那个驱动程序。这段提到的这几个驱动程序都是最最简单的显示驱动程序模版,如果需要自己写显示驱动可以拷贝这些代码保留架构重新实现就可以了,看得出微软在做这些个目录结构的时候还是为大家考虑得比较周到的。这几个驱动都是用在VESA BIOS 2.0 兼容的显卡上的就是说模拟器就可以使用这些驱动,要是想操练显示驱动又没有硬件支持的话,可以用这几个驱动作试验。

剩下的那几个是几种特定的显卡的驱动,PERM3是个比较特别的驱动,这是这些驱动里面唯一支持D3D的显示驱动程序。尽管微软推荐用这几个驱动作为写代码的参考,我还是建议大家用上面提到的XXflat的显示驱动来重新实现会比较清晰。
├─ETHDBG
│  ├─3C90X
│  ├─AM79C970
│  ├─BLCOMMON
│  ├─BOOTPART
│  ├─CS8900
│  ├─DEC21140
│  ├─DP83815
│  ├─EBOOT
│  ├─EDBGSAMP
│  ├─KITLETH
│  ├─NE2000
│  ├─RNE_MDD
│  ├─RTL8139
│  ├─SMC9000
│  ├─SMSC100
│  ├─VBDGSTUB
│  ├─VBRIDGE
│  └─VMINI
ETHDBG下面有很多东西,同样是比较杂.
blcommon,bootpart,eboot都是写bootloader所需要的组成部分。我们可以看到platform下面的eboot的代码调用了很多其它的函数,那些函数就是这里的代码生成的,看不懂bootloader?接着这儿的代码一起看相信很快就可以看出结果。blcommon是bootloader的主流程代码,bootpart是bootloader操作hdd或Flash的相关代码,主要是在文件系统层面进行操作比如分区啊什么的,eboot下面包含的内容是tftp和dhcp等网络协议的实现,但不包含hal代码。KITLETH是kitl下以太网transport的硬件无关实现,包含DHCP和UDP协议的实现。

EDBGSAMP下面应该是TCP/Ip transport的实现,目的是通过以太网卡实现调试信息通道,过对这个我没有去验证过不是很确定。

3C90X AM79C970 CS8900 DEC21140 DP83815 NE2000 RTL8139 SMC9000 SMSC100都是针对芯片的驱动代码,bootloader可以利用它们作为ethernet和KITL的HAL但是必须将这些"驱动"与windowsCE的驱动程序区别开来,这些驱动仅仅是能用于作为操作系统下的HAL使用,而不是系统网络部分的网卡驱动。

RNE_MDD KITLETH  VBDGSTUB VBRIDGE VMINI 都是关于kitl的代码,KITLETH是kitl的以太网传输实现,vbridge和vmini是虚拟网桥和网卡,这两个部分的目的在于建立kitl ethernet transport 的同时windowsCE能共享以太网用作传输。vDBGSTUB是vbirdge的最简实现(啥都不干)。
RNE_MDD是R-ndis的MDD支持。可以与Common/Oak/Drivers/Rndisfn/net2890配合使用.
├─FSD
│  ├─ENCFILT
│  ├─FATUTIL
│  │  ├─MAIN
│  │  ├─NOUI
│  │  └─UI
│  ├─FSDSPY
│  └─REGPART
FSD不用说,就是文件系统驱动了,这个是上层的驱动程序与具体的硬件代码无关。FATUTIL提供了一系列的支持,比如格式化,磁盘扫描这类的程序。ENCFILT里面提供了加密的途径,要加密这里来。而FSDSPY估计是侦测文件系统的,具体使用方法和用途不详。REGPART是一个partition驱动的例子,作用同样也是模版。构建好自己的partition驱动以后可以像调用mspart.dll来操作。
├─GDCFG
这个是Generic Device Configuration是和PCI总线相关的代码,看代码大概是总线设备通常行为管理和控制的用途,由于知识的匮乏,不知道具体干什么用的。
├─GIISR
Generic installable ISR的例子。 
├─HELPER
传闻是注册已配置的PCI设备的代码,同样我不清楚。
├─IMEJPN
├─IMEJPP
│  ├─COMMONCODE
│  ├─DICMAKE
│  │  └─BIN
│  └─IMEUI
这两个目录都是输入法-IME相关的,还是不懂。
├─IRMAC
│  ├─INC
│  ├─IRSIR
│  └─UTILS
红外线端口的驱动程序。
├─KEYBD
│  ├─DEVICELAYOUTS
│  │  ├─PS2_AT
│  │  │  ├─00000409
│  │  │  ├─00000411
│  │  │  ├─00000412
│  │  │  └─00010411
│  │  └─REMAP
│  │      └─NUMPADRMP
│  ├─DLL
│  │  ├─KBD8042JPN1
│  │  ├─KBD8042JPN2
│  │  ├─KBD8042KOR
│  │  ├─KBD8042US
│  │  ├─KBDNOPJPN1
│  │  ├─KBDNOPJPN2
│  │  ├─KBDNOPKOR
│  │  └─KBDNOPUS
│  ├─HIDIOCTL
│  ├─INPUTLANGS
│  │  ├─0409
│  │  ├─0411
│  │  └─0412
│  ├─IST
│  ├─LAYMGR
│  ├─NOP
│  │  ├─PDD
│  │  └─PDDLIST
│  ├─PS2_8042
│  └─TEST
键盘驱动及其测试程序。
├─LMEMDEBUG
这个目录下的代码可以使用用户代码进行内存检测,通常用于测试内存泄露和调试,有兴趣还可以参考private/winceos/coreos/core/lmem目录下的内容。
├─MESSAGEDIALOGBOXCUSTOMIZE
这个下面就是大名鼎鼎的MessageBox,想要自己的messageBox?容易啊,改掉这个家伙就可以了。
├─MMTIMER
多媒体时钟。
├─NDISUIO
NDIS usermode I/O driver.用途不明。
├─NETCARD
│  ├─DC21X4
│  ├─DP83815
│  ├─NE2000
│  ├─NE2000ISR
│  ├─NETMUI
│  ├─RNDISMINI
│  │  ├─HOST
│  ├─SMSC100FD
│  └─XIRCOM.CE2
这个目录下面的是网卡驱动.NE2000ISR相当于一个插件使得ne2000本地驱动可以工作在IISR模式下。netmui据说是网络多用户支持里面的内容简单得看不出怎么个支持法。RNDISMINI是RNDIS的小端口驱动,这相当于一个实现了微软的remote NDIS Specification 的MDD,这个程序与RNDISFN 目录下的PCI-USB界面结合就可以实现rNDIS,RNDISFN目录下面的东西相当于是PDD,Host目录下面的东西是使用RNDISFN作为PDD时,在PC上所需的安装信息文件,另外所需的RNDIS-USB Kit在微软的网站上可以下到。
├─NETSAMP
│  ├─ASYNCMAC
│  ├─AUTORAS
│  │  ├─DLL
│  │  └─TEST
│  ├─CONNMC
│  ├─ETHMAN
│  ├─INC
│  ├─IPCONFIG
│  ├─IPNAT
│  │  └─EDITSAMP
│  ├─IPV6TUN
│  ├─NDISCONFIG
│  ├─NDISPWR
│  ├─NETSTAT
│  ├─PASSTHRU
│  ├─PEGTERM
│  │  ├─APP
│  │  └─TERMCTRL
│  ├─PING
│  ├─RASDIAL
│  ├─RASENTRY
│  ├─RASSERVER
│  ├─RNAAPP
│  ├─ROUTE
│  ├─TAPIHELP
│  ├─TRACERT
│  ├─WZCTOOL
│  └─ZCLOG
这个目录下面的东西包括了整个广域网协议从上到下的各个层面的一些例子和工具,ping netstat route tracert ipconfig这几个是大家再熟悉不过的网络工具了。其他的我也不是很清楚用途。
├─NETUI
这个目录下面的是UI相关于网络的部分,比如控制面板里面的网络选项,在状态栏出现的连接图标等等。
├─OOMUI
OOMUI就是out of memory User Interface...内存溢出时显示什么东西?就在这儿了。顺便说一句所有以UI结束的目录都是可定制UI的部分。
├─PARALLEL
这里有并行口模块驱动的代码,以及使用该模块驱动生成并口驱动的例子。
├─PCIBUS
这个目录下是PCI总线相关的代码,不了解我就不说了。
├─PCMCIA
│  ├─I82365
│  ├─MDD
│  ├─TEST
│  │  ├─DEVTUPLE
│  │  └─TUPLETST
│  ├─TI1250
│  └─TI1250ISR
同样,MDD下面就是PCMCIA的模块驱动,另外I82365和ti1250是使用模块驱动构建驱动程序的例子,TI1250ISR是TI1250驱动的IISR.
├─PM
│  ├─BATTERY
│  ├─MDD
│  ├─PDD
│  │  ├─DEFAULT
│  │  └─PDA
│  ├─PMSTUBS
│  └─TEST
│      ├─DEVSAMPLE
│      ├─GET
│      ├─GETD
│      ├─MON
│      ├─REQ
│      ├─SET
│      └─SETD
PM就是power management,里面包含电池驱动.PM device的模块驱动,test下面还有使用模块驱动的例子。PDD目录下是平台相关的驱动代码。
├─PRINTER
│  ├─PCL
│  ├─PRNERR
│  └─PRNPORT
看名字像是打印机相关的驱动,具体内容不详.
├─REGENUM
设备管理器的注册表枚举器,该目录下的内容可以生成一个regenum.dll,该链接库由设备管理器加载并决定了如何使用注册表的信息来加载驱动,因此在很多场合(由硬件决定的不同的加载方式)都需要自己订制该链接库,这样才能正确地加载驱动。
├─RNDISFN
│  └─NET2890
使用2890建立r-NDIS的例子。
├─SAMPTSPI
TAPI的实现样例。
├─SERIAL
│  ├─2890_SER
│  ├─COM16550
│  ├─COM_CARD
│  ├─COM_MDD
│  ├─COM_MDD2
│  ├─ISR16550
│  ├─SER16550
│  ├─SER_CARD
│  └─SER_CARD2
这个目录下都是串行驱动的例子,2890_SER是使用USB端口模仿普通串口的行为,这样子就可以通过RAS用USB端口与桌面PC机相连接,这是最流行的用法,很多ARM系列的处理器BSP都对USB function实现成Serial-unimoden的形式,桌面的驱动可以在activeSync目录下找到,仅仅需要修改驱动的安装信息文件就可以直接使用,所以这个驱动是针对ActiveSync的实现,如果需要将USB实现为RNDIS的话所参考的驱动就不再是这个目录下的代码而是RNDIS下的相应代码了,再进一步如果需要将该设备用于你自定义的功能的话<比如与你自己的USB桌面程序同步/下载>就需要直接将该设备实现为流式驱动,由此可以看到WindowsCE的驱动的实现并不时一尘不变的,实现的方法由目的决定,是多样的。com16550是标准的CE串行驱动范例,COM_CARD是PCMICA界面COM口的例子。COM_MDD/2是串口模块驱动,通常我们并不直接位操作系统实现流式驱动供其调用,而是编写与MDD接口相兼容的代码然后再让MDD区实现流式驱动。这样来我们仅仅需要将特定的硬件操作封装成其所需要的程序就可以了而不需要做与系统相关的诸多工作,该目录下的代码就是串行口模块驱动的源代码。ISR16550是IISR的例子。ser16550是把16550当作标准设备来使用的驱动的例子,这个驱动是不使用模块驱动的。SER_CARD下的驱动是使用ser16550生成的库编写的PCMICA界面的串行口的驱动。这个目录下面并没有列举多个芯片的驱动,而是以16550为例子对其进行了多种方式的实现,对学习windowsCE驱动程序结构还是很有研究价值的。
├─SKINNABLEUI
│  ├─COMMCTRL
│  ├─COMMCTRLXP
│  ├─GWE
│  │  ├─BTNCTL
│  │  ├─CMBCTL
│  │  ├─CURSOR
│  │  ├─GCACHE
│  │  ├─INC
│  │  ├─LBCTLVIEW
│  │  ├─NCLIENT
│  │  ├─SBCMN
│  │  └─STCCTL
│  └─GWEXP
│      ├─BTNCTLVIEWXP
│      ├─CMBCTLVIEWXP
│      ├─GCACHEVIEWXP
│      ├─INC
│      ├─LBCTLVIEWXP
│      ├─NCLIENTVIEWXP
│      ├─SBCMNVIEWXP
│      └─STCCTLVIEWXP
这个目录下面是定值UI界面的例子,不带XP后缀的是WinCE下win9X风格的公共控件和光标等的代码,而带XP后缀则是winXP UI元素的代码。诸如:光标,button,static,checkbox等
├─SMARTCARD
│  ├─BULLTLP3
│  ├─PSCR
│  ├─SMCLIB
│  └─STCUSB
SmartCArd相关的驱动。
├─SNMP
│  └─SNMPTESTMIB
简单网络管理协议的测试软件代码,据说仅仅是对MIB的测试。
├─STARTUI
可以通过改写编译这下面的代码改变启动时运行的程序的外观和功能。
├─TCH_CAL
这个目录下的代码是用于为2D触摸屏驱动提供坐标旋转校准的能力。
├─TEST
│  └─PCMCIA

├─TOUCH
│  ├─BASIC
│  ├─TCHMAIN
│  └─TRNSCRBR
这里面包括了触摸屏的MDD和DDI等代码。
├─USB
│  ├─CLASS
│  │  ├─COMMON
│  │  ├─HID
│  │  │  ├─CLIENTS
│  │  │  │  ├─CONSHID
│  │  │  │  ├─KBDHID
│  │  │  │  └─MOUHID
│  │  │  └─HIDCLASS
│  │  ├─PRINTER
│  │  └─STORAGE
│  │      ├─CLASS
│  │      ├─DISK
│  │      │  └─SCSI2
│  │      ├─emulatorDbg
│  │      └─INC
│  ├─CLIENTS
│  ├─COMMON
│  ├─HCD
│  │  ├─COMMON
│  │  ├─OHC
│  │  ├─OHCD2
│  │  ├─UHC
│  │  └─UHCD
│  ├─INC
│  └─USBD
该目录下面是USB相关的驱动,class下面的都是类驱动,包括人机界面(也就是键盘鼠标),打印机,磁盘/存储设备的类驱动。HCD下面的代码是OHCD和UHCD的驱动代码。USBD下面是USB 驱动代码。
├─VGACON
这个目录下很有用,如果你不需要GUI而是需要控制台的时候,就可以使用这个目录下的驱动.
├─WAVEDEV
│  ├─MDD
│  ├─PDD
│  │  ├─ES1371
│  │  └─TVIA5000
│  └─UNIFIED
│      └─ENSONIQ
声卡驱动,包含MDD和 ES1371 TVIA5000的MDD,至于Unified下面是Unified Audio Model驱动的例子.
└─WAVEUI
和前面的Calibrui, Fatui, Netui, Oomui, Startui等一样,waveui也是用户自定义界面的一部分,不过这次是相关声音输出的。

to be continue....

Prviate 目录非完全收录
WINCE420/PRIVATE/WINCEOS/COREOS/NK/TOOLS/ROMIMAGE
├─CATBIN
├─CHECKSYMBOLS
├─COMPBIN
├─COMPRESS
├─COMPRESSLZ77
├─COMPRESSLZX
├─CVRTBIN
├─DATA
├─DIFFBIN
├─MYSTRING
├─ROMIMAGE
├─SIGNBIN
│  ├─CE
│  └─NT
├─SORTBIN
├─STAMPBIN
└─VIEWBIN
这个目录下面收录的都是对windowsCE镜像进行操作的工作,但这些工具不是在windowsCE上运行的,而是桌面PC的程序。

Eboot代码流程 [转]相关推荐

  1. 3-uboot-spl代码流程

    [uboot] (第三章)uboot流程--uboot-spl代码流程 2016年10月28日 16:24:14 阅读数:2077 以下例子都以project X项目tiny210(s5pv210平台 ...

  2. 【Intellij IDEA系列】IDEA使用git提交代码流程

    git提交代码流程 注意事项: (1)修改文件之前,一定要先git pull,保证修改的是最新的版本; (2)git push之前一定要先git pull,因为可能别人修改相同的文件并已commit, ...

  3. android系统自动休眠代码流程,Android P 电源管理(4)待机流程

    电视遥控器,短端走待机(str待机)流程, 长按是关机,走关机流程,记录下待机流程. 参考博客 待机流程 Android P引入自动待机功能,只有存在WakeLock,wakeup_count就不会为 ...

  4. 17. Gradle编译其他应用代码流程(五) - 设置Task过程

    接上一篇 15. Gradle编译其他应用代码流程(四) - Configure过程 继续分析 一. task选择 到了这个阶段,gradle开始计算task入口是哪个? 选择的逻辑是这样: 如果用户 ...

  5. netts之 CTWSocket代码流程分析(整体是客户端请求式的)

    netts之 CTWSocket代码流程分析(整体是客户端请求式的) 1.外部程序载入调用 netts.dll 2.外部程序调用 netts实现的Stock_Init_Nodialog,(Stock_ ...

  6. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  7. android加载efi分区,高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  8. android uefi 编译报错,【Android SDM660开机流程】- UEFI XBL 代码流程分析

    [Android SDM660开机流程]- UEFI XBL 代码流程分析 一.UEFI XBL 1.1 boot_images代码目录 1.2 UEFI代码运行流程 1.3 SEC (安全验证) 1 ...

  9. Android 10.0热点为Enhanced Open模式时不允许WiFI和热点同时开启代码流程梳理

    前言: WLAN Enhanced Open 官方介绍 WLAN Enhanced Open :WiFi增强开放,这个功能就是当手机开启热点时,Securty的一个选项,与WPA2/WPA3同级,En ...

最新文章

  1. Zookeeper和Redis实现分布式锁,附我的可靠性分析
  2. 创建的二叉树后续非递归遍历结果为_一入递归深似海,从此offer是路人
  3. Scanner的next,nextint和nextLine的使用总结
  4. 【转】PYTHON open/文件操作
  5. STM32F4 HAL库开发 --时钟使能和配置
  6. 一个 bug / Masonry的引入
  7. vtigercrm中添加用户字段_linux笔记(一):linux添加用户并赋予root权限
  8. 小米618战报出炉!三平台狂揽156项第一
  9. Python嵌套定义函数增强reduce()函数功能
  10. CentOS 6.5上安装Confluence 5.4.4
  11. Cmder下载安装以及应用到Pycharm控制台
  12. 理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)
  13. 优质百度网盘资源分享(计算机篇)
  14. html将字符串按逗号分隔,js如何截取以逗号隔开的字符串
  15. C++中常见异常错误
  16. word导航栏 字体大小修改
  17. 神经痛分类图片大全,神经病理性疼痛分类
  18. node.js 安装详细步骤如下(win 版)
  19. 可穿戴式柔性电子应变传感器基底材料
  20. python回文数判定_python如何写一个函数判断回文数?

热门文章

  1. 以太坊相关中文资料整理
  2. 计算机课程设置图片,《计算机图形图像处理》课程简介
  3. 顺序表和单链表的插入删除操作时间复杂度的区别
  4. 忘掉Mirai吧,新型“变砖”病毒让你的物联网设备彻底完犊子!
  5. 基于jquery的锚点滚动插件(百度百科效果) anchorScroll.js
  6. SQLServer主从同步配置(Log Shipping方式)
  7. IT职场老油条亲传:教你如何在公司汇报工作时表现更亮眼
  8. 牛客小白月赛 20 E区区区间(线段树)
  9. #574. 火车票(railway)
  10. 从后台得到webshell十大技巧大汇总(转)