转自XBETA里的XIP移植教程

PPC   2008-07-22 01:58   阅读46   评论0  
字号:    

 

第一步:

准备工具,提取XIP.BIN(假定你已经知道如何提取和写入XIP.BIN了)

image001.png (3.73 KB)

2008-4-12 00:47

XIPPort的版本比较混乱,建议用大小是72,704字节的版本。

第二步:

解开ZINC的XIP,WRITEMAP、BuildPkg:

image003.png (5.51 KB)

2008-4-12 00:47

检查你的out目录,应该长这样:

image005.png (7.14 KB)

2008-4-12 00:47

其中,OEM开头的File和Modules目录是要保留的。

第三步:

同样解开一个更高版本的ROM的XIP,我用的Kaiser 沃达丰英国版Build19199的XIP。

image007.png (7.26 KB)

2008-4-12 00:47

其中,WinCENLS_WWE和LangDB我们都可以不管(对ZINC目前来说,没用到,但WM6.1大部分都是需要WINCE.NLS的)

第四步:文件替换

将ZINC XIP的Files和Modules目录的MSXIPKernel和MSXIPKernelLTK都替换为Kaiser的版本。在替换以前,记得备份ZINC XIP的整个OUT目录。

第五步:尝试Reloc Slot0和Slot1

5.1

检查地址冲突

image009.png (5.63 KB)

2008-4-12 00:47

Undo的意思是将刚才打好包的MSXIPKernel、OEMXIPKernel之类的文件夹里的东西重新直接移回到Out里。Realloc P是重新计算各模块的位置,WriteMaps是将计算结果写入到MAP.TXT里。

现在打开MAP.TXT,会发现很多!!!!!!!,这是冲突的地址。咱们运气好,SLOT0里没有冲突J,在SLOT1里才有。

先看头两行位于Slot1里的冲突地址:

03e06000 - 03e54000 L0004e000 Virtual base address of TrueFFS.dll

03e54000 - 03e5a000 L00006000 Virtual base address of ceddk.dll

03e56000 - 03e5a000 L00004000 !!!!!!!!!!!!!!!!!!

03e56000 - 03e5a000 L00004000 Virtual base address of regenum.dll

03e5a000 - 03e5e000 L00004000 Virtual base address of cecompr.dll

03e5a000 - 03e5e000 L00004000 !!!!!!!!!!!!!!!!!!

03e5a000 - 03e69000 L0000f000 Virtual base address of pm.dll

意思是:

03e54000 - 03e5a000 L00006000 Virtual base address of ceddk.dll

(ceddk.dll的E32_VBASE从3e540000开始,长度是6000)

03e56000 - 03e5a000 L00004000 !!!!!!!!!!!!!!!!!!

(这里两个DLL之间,重叠了4000长度的区域!)

03e56000 - 03e5a000 L00004000 Virtual base address of regenum.dll

(regenum.DLL的E32_VBASE从3e56000开始,长度是4000)

后面那一串!!!!!!!!也是这个意思,差了4000的区域,就不重复了。

5.2

计算地址

因此,SLOT1里共缺了两处4000的长度。显然我们需要将TrueFFS.DLL和CEDDK.DLL的E32VBASE向前挪8000字节,REGENUM.DLL和CECOMPR.DLL的E32VBASE向前挪4000字节,这样大家就都和谐了。

现在拿起计算器,进行16进制运算,得到需要搬移的4个DLL的E32VBASE:

TrueFFS.dll:

3DFE000

ceddk.dll:

3E4C000

regenum.dll:

3E52000

cecompr.dll:

3E56000

5.3

Reloc模块

OK,记下上面这4个值,分别打开这4个模块的目录,修改imageinfo.txt,例如TrueFFS.dll:

image011.png (9.91 KB)

2008-4-12 00:47

改为

image013.png (9.83 KB)

2008-4-12 00:47

IMAGE.TXT改完以后,还需要用M’Reloc修改模块S00X:

image015.png (5.02 KB)

2008-4-12 00:47

==>

image017.png (4.95 KB)

2008-4-12 00:47

同样,修改全部4个DLL模块。

5.4 检查

咱们再用XIPPORT,Reloc P,WriteMAP。现在MAP.TXT中SLOT0和SLOT1看上去相当的和谐。

第六步:修改物理地址和RAM起始位置

6.1

检查物理地址

由于新加进来的文件比原来的大,所以一些文件不可避免的越界了,占用了以前系统认为是RAM的虚拟地址。

在MAP.TXT的最后,出现了这样的!!!!!!!!!!!!!!!!!!!:

803fa000 - 80405848 L0000b848 o32 region_0 rva=00001000 vsize=0000b848 real=03e5b000 psize=0000b848 f=68000020 for pm.dll

8040072c - 80405848 L0000511c !!!!!!!!!!!!!!!!!!

8040072c - 8040072c L00000000 End: highest physical address

8040072c - 80401000 L000008d4 NUL

80401000 - 80401000 L00000000 Start: start of RAM

80401000 - 80406000 L00005000 NUL

80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll

80407000 - 8040a268 L00003268 NUL

8040a268 - 80415268 L0000b000 filedata boot.hv

80410000 - 80415268 L00005268 !!!!!!!!!!!!!!!!!!

80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe

80415268 - 80416000 L00000d98 !!!!!!!!!!!!!!!!!!

80415268 - 8041ca30 L000077c8 filedata boot.rgu

80416000 - 8041ca30 L00006a30 !!!!!!!!!!!!!!!!!!

80416000 - 80439000 L00023000 initialized data of region_3 nk.exe

8041ca30 - 80439000 L0001c5d0 !!!!!!!!!!!!!!!!!!

8041ca30 - 80423a30 L00007000 filedata mxip_lang.vol

80423a30 - 804273d5 L000039a5 filedata sysroots.p7b

804273d8 - 804284fa L00001122 filedata a9b11ebe-60a1-a4c8-9ba1-f13452768aaf.dsm

804284fa - 80439000 L00010b06 NUL

80439000 - 80439000 L00000000 ------ start of RAM free space

80439000 - 83c00000 L037c7000 NUL

83c00000 - 83c00000 L00000000 End: end of RAM

可以看到,物理地址不够长了,PM.DLL写越界了,同时,一些文件被放到了RAM里面,我们需要增加物理地址的长度。

6.2 计算物理地址结束点

有两种办法:

1、将所有欠缺的长度、误放置的文件的长度加起来,然后在8040072C的基础上加上这个长度。

2、直接给一个足够大的值,让XIPPORT帮你算真实的值,我喜欢用这一种J

打开ROMHDR.TXT:

image019.png (7.13 KB)

2008-4-12 00:47

我们直接为物理地址加上1M字节,我猜肯定够了:

将physlast:改为8050072C,因此,RAMSTART、RAMFREE的地址也相应往后排1M,应该改成:80501000,80539000。再用XIPPORT RelocP,WriteMAP

新的MAP.TXT的结尾部分,出现了这句话:

804273d8 - 804284fa L00001122 filedata a9b11ebe-60a1-a4c8-9ba1-f13452768aaf.dsm

804284fa - 8050072c L000d8232 NUL

8050072c - 8050072c L00000000 End: highest physical address

意思是,从804284fa到8050072c,多出来d8232这么多的物理地址!所以,真实需要的物理地址结尾就是:804284fa。

6.3 计算RAM起始点

物理地址的结尾是804284fa,本着最大化RAM的原则,RAM的起始点应该是一个16进制的1000的最小倍数,也就是80429000。

接下来计算FREE RAM的起始点,打开原始版本(刚才备份的)MAP.TXT,最后是:

80401000 - 80401000 L00000000 Start: start of RAM

80401000 - 80402000 L00001000 initialized data of region_1 hd.dll

80402000 - 80406000 L00004000 initialized data of region_1 osaxst0.dll

80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll

80407000 - 80410000 L00009000 NUL

80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe

80416000 - 80439000 L00023000 initialized data of region_3 nk.exe

80439000 - 80439000 L00000000 ------ start of RAM free space

它告诉我们,有4个模块的5个部分通过COPYENTRY放在了高端只读RAM里面。我们回头检查一下,发现NK.EXE和GIISR.DLL是OEM的,HD.DLL和OSAXST0.DLL是微软的。

现在把这四个文件的COPYENTRY收集一下:

这是ZINC原版的:

80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll

80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe

80416000 - 80439000 L00023000 initialized data of region_3 nk.exe

这是KAISER的:

80306000 - 80307000 L00001000 initialized data of region_1 hd.dll

80307000 - 8030b000 L00004000 initialized data of region_1 osaxst0.dll

现在关注一下这些COPYENTRY的长度:

L00001000 initialized data of region_1 giisr.dll

L00006000 uninitialized data of region_2 nk.exe

L00023000 initialized data of region_3 nk.exe

L00001000 initialized data of region_1 hd.dll

L00004000 initialized data of region_1 osaxst0.dll

加起来:

1000 + 6000 + 23000 + 1000 + 4000 = 2F000

那么FREE RAM的起始地址应该是:80429000 + 2F000 = 80458000

咱们就又把ROMHDR.TXT根据上面算的这些值改回去:

physlast:

804284fa

ulRAMStart:

R=80429000

ulRAMFree:

80458000

用XIPPORT RELOCP,WRITEMAP

第7步:修改COPYENTRY

1.计算

拿刚才COPYENTRY的地址出来,根据个人喜好调整一下顺序(我喜欢把NK放在最前面)

L00006000 uninitialized data of region_2 nk.exe

L00023000 initialized data of region_3 nk.exe

L00001000 initialized data of region_1 giisr.dll

L00001000 initialized data of region_1 hd.dll

L00004000 initialized data of region_1 osaxst0.dll

从RAMSTART(80429000)开始,顺序计算各个COPYENTRY的开始地址:

region_2 nk.exe:

80429000(起始地址)

region_3 nk.exe:

8042F000(80429000+L00006000)

region_1 giisr.dll:

80452000(8042F000+L00023000)

region_1 hd.dll:

80453000

region_1 osaxst0.dll:

80454000

2.修改

首先修改NK.EXE,打开NK.EXE的IMAGEINFO.TXT,找到这两句:

o32[2].o32_realaddr: P+00290000

o32[3].o32_realaddr: P+00296000

这里P的意思是ROMHDR.TXT里的physfirst,也就是80180000,因此,新的NK.EXE的O32[2]和O32[3]的地址分别应该是:

80429000-80180000 = 2A9000;

8042F000-80180000 = 2AF000;

根据计算结果,修改IMAGEINFO.TXT

然后用M'Reloc_nk.exe打开NK.EXE,修改O32_REALADDR:

image021.png (5.33 KB)

2008-4-12 00:47

同样的方法修改剩下的三个文件。

注意:M'Reloc_nk.exe有BUG

1、无法输入字母,所以只有用右键菜单粘贴;

2、粘贴后Doit按钮不能用,我一般是把输入框末尾的0删除,又输入一次,Doit就好了;

3、在Reloc DLL的时候,输入的值会被自动加上o32_size,输入前需要自己先减去,(NK.EXE和HD.DLL除外,XIPPORT已经帮你加了)。例如:

image023.png (5.23 KB)

2008-4-12 00:47

==>

image025.png (5.31 KB)

2008-4-12 00:47

第8步:生成XIP_OUT.BIN

现在用XIPPORT,RELOCP、WRITEMAP、BUILD XIP_OUT.BIN,这个MAP基本上可以乱真啦~

第9步:NK.EXE的特殊要求

有的NK.EXE的O32地址好像是有要求的,根据俺这个文章的第一个读者阿秋的经验,将移动的目的地取一个很和谐的大整数,也许可以解决这个问题。

附件

image014.jpg (31.27 KB)

2008-4-12 00:47

image013.png (9.83 KB)

2008-4-12 00:47

 

评论(?)
阅读(?)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009