Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407122
  • 博文数量: 128
  • 博客积分: 2247
  • 博客等级: 大尉
  • 技术积分: 767
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 09:30
文章分类

全部博文(128)

文章存档

2011年(4)

2010年(124)

我的朋友

分类: 嵌入式

2010-07-27 10:40:14

 Eboot 编译编译器决定中断向量及其实现单一性的原因

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

首先看看eboot的source文件,该文件约束了eboot下文件的编译方式和参与编译的文件等等信息 

SYNCHRONIZE_DRAIN=1 

TARGETNAME=EBOOT 
TARGETTYPE=PROGRAM 
WINCECPU=1RELEASETYPE=PLATFORM 
WINCETARGETFILES=$(_RELEASEDIR)\$(TARGETNAME).nb0 
EXEENTRY=StartUp 
EXEBASE=0x80000000 

INCLUDES=..\inc;$(_PUBLICROOT)\common\oak\drivers\block\msflashfmd\inc 
#INCLUDES=$(_TARGETPLATROOT)\eboot\inc;$(INCLUDES) 
INCLUDES=$(_TARGETPLATROOT)\Drivers\NandFlsh\FMD;$(INCLUDES) 
ADEFINES=-pd "ALLOCATE_TABLE SETS \"FALSE\"" $(ADEFINES) 


LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO 
CDEFINES= $(CDEFINES) -DPPSH_PROTOCOL_NOTIMEOUT -DCOREDLL -DPLAT_ONBOARDEDBG=1 -DBOOT_LOADER=1 -DNOSYSCALL=1 

TARGETLIBS=\ 
....... 

Source文件仅仅提供了PROGRAM/LIBRARY/DYNLINK三个选项参数(见oak\MISC\makefile.def line 324),分别对应.exe,.lib,.dll文件。.exe和.dll文件都是符合windows程序要求的带头文件,而.lib仅仅是可重定位的函数集。这三者都不是我们通常用作loader的headless程序。所谓headless,不包含文件执行头,按照最后所在的地址信息进行链接,不可重定位为特点,这与通常的单片机程序是相似的。而上面所能指定的三种编译目标模式是用于winCE执行所用,其中包含了一个所谓类似PE头的信息部。这样产生的程序显然就不能满足运行的要求。下面是编译后产生的程序用实例来看看: 

00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 ; MZ?.......... 
00000010h: B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ; ?......@....... 
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 D8 00 00 00 ; ............?.. 
00000040h: 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ; ..?.???L?Th 
00000050h: 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F ; is program canno 
00000060h: 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 ; t be run in DOS 
00000070h: 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 ; mode....$....... 
00000080h: 6A 57 E0 F7 2E 36 8E A4 2E 36 8E A4 2E 36 8E A4 ; jW圜.6帳.6帳.6帳 
00000090h: A1 13 BF A4 2C 36 8E A4 A1 13 BE A4 22 36 8E A4 ; ?郡,6帳?兢"6帳 
000000a0h: 01 10 BE A4 29 36 8E A4 01 10 BF A4 2F 36 8E A4 ; ..兢)6帳..郡/6帳 
000000b0h: 2E 36 8E A4 3F 36 8E A4 D6 3D D8 A4 2F 36 8E A4 ; .6帳?6帳?丐/6帳 
000000c0h: 52 69 63 68 2E 36 8E A4 00 00 00 00 00 00 00 00 ; Rich.6帳........ 
000000d0h: 00 00 00 00 00 00 00 00 50 45 00 00 C2 01 04 00 ; ........PE..?.. 
000000e0h: B2 42 8F 41 00 00 00 00 00 00 00 00 E0 00 2E 01 ; 睟廇........?.. 
000000f0h: 0B 01 06 18 00 38 01 00 00 28 00 00 00 00 00 00 ; .....8...(...... 
00000100h: 00 10 00 00 00 10 00 00 00 50 01 00 00 00 00 80 ; .........P.....€ 
00000110h: 00 10 00 00 00 02 00 00 04 00 00 00 00 00 00 00 ; ................ 
00000120h: 04 00 14 00 00 00 00 00 00 90 01 00 00 04 00 00 ; .........?..... 
00000130h: 28 2F 02 00 09 00 00 00 00 00 01 00 00 10 00 00 ; (/.............. 
00000140h: 00 00 10 00 00 10 00 00 00 00 00 00 10 00 00 00 ; ................ 
00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000160h: 00 00 00 00 00 00 00 00 00 70 01 00 C8 05 00 00 ; .........p..?.. 
00000170h: 00 00 00 00 00 00 00 00 00 80 01 00 04 07 00 00 ; .........€...... 
00000180h: D0 14 00 00 1C 00 00 00 00 00 00 00 00 00 00 00 ; ?.............. 
00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001d0h: 2E 74 65 78 74 00 00 00 9C 36 01 00 00 10 00 00 ; .text...?...... 
000001e0h: 00 38 01 00 00 04 00 00 00 00 00 00 00 00 00 00 ; .8.............. 
000001f0h: 00 00 00 00 20 00 00 60 2E 64 61 74 61 00 00 00 ; .... ..`.data... 
00000200h: C8 18 00 00 00 50 01 00 00 02 00 00 00 3C 01 00 ; ?...P.......<.. 
00000210h: 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 ; ............@..? 
00000220h: 2E 70 64 61 74 61 00 00 C8 05 00 00 00 70 01 00 ; .pdata..?...p.. 
00000230h: 00 06 00 00 00 3E 01 00 00 00 00 00 00 00 00 00 ; .....>.......... 
00000240h: 00 00 00 00 40 00 00 40 2E 72 65 6C 6F 63 00 00 ; ....@..@.reloc.. 
00000250h: F0 07 00 00 00 80 01 00 00 08 00 00 00 44 01 00 ; ?...€.......D.. 
00000260h: 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 42 ; ............@..B 
00000270h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000280h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000290h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000300h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000310h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000320h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000330h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000340h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000350h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000360h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000370h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000380h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000390h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000400h: 2A 00 00 EA FD FF FF EA FC FF FF EA FB FF FF EA ; *..挲挈犒? 
00000410h: FA FF FF EA F9 FF FF EA F8 FF FF EA 74 00 9F E5 ; ?犍犋阾.熷 
00000420h: 55 1C A0 E3 00 10 80 E5 6C 00 9F E5 20 10 A0 E3 ; U.犮..€錶.熷 .犮 
00000430h: 00 10 80 E5 64 50 9F E5 00 60 95 E5 01 65 86 E3 ; ..€錮P熷.`曞.e嗐 
00000440h: 5C 30 9F E5 00 40 93 E5 06 48 84 E3 07 46 C4 E3 ; \0熷.@撳.H勩.F你 
00000450h: 06 46 84 E3 4C 20 9F E5 4C 10 9F E5 10 00 A0 E3 ; .F勩L 熷L.熷..犮 
从上面dump出来的内容可以看到,程序的前0x400区域都是由windowsCE的编译器产生的头文件,而这部分内容本身不是我们的代码指定的内容也不具备可执行的能力,所以实际的执行内容是在0x400位置开始的,但是是不是考虑直接拷贝0x400后的区域去掉头的位置就可以直接作为我们需要的执行入口点呢?答案是否定的,这中间还有一个偏移量的问题,由于偏移不同的原因,绝对跳转的代码在程序中不会得到正确执行。所以这个程序需要使用romimage命令处理后才能成为可用的image. 

romimage使用的是boot.bib的内容来对上面的程序进行处理的。我们来看看这部分的内容。 

MEMORY 
   DRV_GLB  8c020000  00001000  RESERVED 
    BIN_FS   8c021000  00005000  RESERVED 
    RAM      8c026000  00006000  RAM 
    STACK    8c02c000  00004000  RESERVED 
    EBOOT    8c038000  00020000  RAMIMAGE 
;    EBOOT    8c038000  00040000  RAMIMAGE 

     FLSCACHE 8D000000  01000000  RESERVED 

CONFIG 
         COMPRESSION=OFF 
         PROFILE=OFF 
         KERNELFIXUPS=ON 
         SRE=ON 
         ROMSTART=8c038000 
         ROMWIDTH=32 

        ROMSIZE=16000 

MODULES 
nk.exe $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\EBOOT.exe EBOOT 

 

简单说一次上面的内容的意义: 

1.MEMORY部: 
这部分指定了一些空间分配的情况,eboot的位置就是上面指定的,romimage通过该信息重新定位上面eboot.exe的偏移,以及内存使用的静态分布信息. 
2.Config部 
该部分描述生成image的规则,包括压缩与否,sre文件是否产生,起始地址,image的存放介质位宽,单片介质大小等等。 
3.Modules部 
该部分描述的是参与该image生成的元文件列表。 

通过上面的信息,按道理romimage就会将0x400后的部分重新计算偏移后放到0x8c038000的位置。也就是我们文件的0x0位置。事实上呢? 

我们来看看是什么样的情况。 

00000000h: FE 03 00 EA 00 00 00 00 00 00 00 00 00 00 00 00 ; ?.?........... 
00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000040h: 45 43 45 43 88 C7 04 8C 00 00 00 00 00 00 00 00 ; ECEC埱.?....... 
00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
.................. zero ................................................. 
00000fc0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000fd0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000fe0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000ff0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00001000h: 2A 00 00 EA FD FF FF EA FC FF FF EA FB FF FF EA ; *..挲挈犒? 
00001010h: FA FF FF EA F9 FF FF EA F8 FF FF EA 74 00 9F E5 ; ?犍犋阾.熷 
00001020h: 55 1C A0 E3 00 10 80 E5 6C 00 9F E5 20 10 A0 E3 ; U.犮..€錶.熷 .犮 
00001030h: 00 10 80 E5 64 50 9F E5 00 60 95 E5 01 65 86 E3 ; ..€錮P熷.`曞.e嗐 
00001040h: 5C 30 9F E5 00 40 93 E5 06 48 84 E3 07 46 C4 E3 ; \0熷.@撳.H勩.F你 
00001050h: 06 46 84 E3 4C 20 9F E5 4C 10 9F E5 10 00 A0 E3 ; .F勩L 熷L.熷..犮 
00001060h: 06 00 00 EA 00 00 00 00 00 00 00 00 00 00 00 00 ; ...?........... 
00001070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00001080h: 00 60 85 E5 01 00 50 E2 FD FF FF 1A 00 40 83 E5 ; .`呭..P恺..@冨 

结果是程序最前端的4Kb空出来了!!!windowsCE的编译器是否保留这部分作为chain的空间还无法得知,但是这样一来所有的中断向量在这里都无法使能了。除reset的中断向量是可以间接生效的外,其他的所有的中断向量都被写成了0x0如果产生一个任意的异常/中断的话,就只会连续的产程一系列数据异常,无法复位也无法执行。这就是为什么在windowsCE的启动代码中都不直接使用0x0区域的rom作为中断向量的安装手段。 
  
后1: 
这个现象造成的原因是eboot和应用程序使用相同的编译器,该编译器会将开始的4KB作为PE头的放置,所以该部分要空出来。

阅读(1221) | 评论(0) | 转发(0) |
0

上一篇:WindowsCE目录解析

下一篇:Touchpad驱动分析

给主人留下些什么吧!~~