Google
      
发新话题
打印

[ROM] 给O2 XDA ZINC写的一个XIP移植教程,拿出来共享算啦!

本主题由 System 于 2008-4-15 05:00 解除限时置顶

给O2 XDA ZINC写的一个XIP移植教程,拿出来共享算啦!

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

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




第二步:
解开ZINCXIPWRITEMAPBuildPkg


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

其中,OEM开头的FileModules目录是要保留的。


第三步:
同样解开一个更高版本的ROMXIP,我用的Kaiser 沃达丰英国版Build19199XIP


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

第四步:文件替换
ZINC XIPFilesModules目录的MSXIPKernelMSXIPKernelLTK都替换为Kaiser的版本。在替换以前,记得备份ZINC XIP的整个OUT目录。

第五步:尝试Reloc Slot0Slot1
5.1
检查地址冲突


Undo的意思是将刚才打好包的MSXIPKernelOEMXIPKernel之类的文件夹里的东西重新直接移回到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.dllE32_VBASE3e540000开始,长度是6000
03e56000 - 03e5a000 L00004000 !!!!!!!!!!!!!!!!!!
(这里两个DLL之间,重叠了4000长度的区域!)
03e56000 - 03e5a000 L00004000 Virtual base address of regenum.dll
regenum.DLLE32_VBASE3e56000开始,长度是4000

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


5.2
计算地址

因此,SLOT1里共缺了两处4000的长度。显然我们需要将TrueFFS.DLLCEDDK.DLLE32VBASE向前挪8000字节,REGENUM.DLLCECOMPR.DLLE32VBASE向前挪4000字节,这样大家就都和谐了。
现在拿起计算器,进行16进制运算,得到需要搬移的4DLLE32VBASE
TrueFFS.dll
3DFE000

ceddk.dll
3E4C000

regenum.dll
3E52000

cecompr.dll
3E56000


5.3
Reloc
模块

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

改为



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


==>


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


5.4 检查
咱们再用XIPPORTReloc PWriteMAP。现在MAP.TXTSLOT0SLOT1看上去相当的和谐。

第六步:修改物理地址和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


我们直接为物理地址加上1M字节,我猜肯定够了:
physlast:改为8050072C,因此,RAMSTARTRAMFREE的地址也相应往后排1M,应该改成:8050100080539000。再用XIPPORT RelocPWriteMAP

新的MAP.TXT的结尾部分,出现了这句话:
804273d8 - 804284fa L00001122 filedata a9b11ebe-60a1-a4c8-9ba1-f13452768aaf.dsm
804284fa - 8050072c L000d8232 NUL
8050072c - 8050072c L00000000 End: highest physical address

意思是,从804284fa8050072c,多出来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.EXEGIISR.DLLOEM的,HD.DLLOSAXST0.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 RELOCPWRITEMAP

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

RAMSTART80429000)开始,顺序计算各个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.EXEIMAGEINFO.TXT,找到这两句:
o32[2].o32_realaddr: P+00290000
o32[3].o32_realaddr: P+00296000
这里P的意思是ROMHDR.TXT里的physfirst,也就是80180000,因此,新的NK.EXEO32[2]O32[3]的地址分别应该是:
8042900080180000 = 2A9000
8042F00080180000 = 2AF000
根据计算结果,修改IMAGEINFO.TXT

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


同样的方法修改剩下的三个文件。
注意:M'Reloc_nk.exeBUG
1、无法输入字母,所以只有用右键菜单粘贴;
2、粘贴后Doit按钮不能用,我一般是把输入框末尾的0删除,又输入一次,Doit就好了;
3、在Reloc DLL的时候,输入的值会被自动加上o32_size,输入前需要自己先减去,(NK.EXEHD.DLL除外,XIPPORT已经帮你加了)。例如:
==>


8步:生成XIP_OUT.BIN
现在用XIPPORTRELOCPWRITEMAPBUILD XIP_OUT.BIN,这个MAP基本上可以乱真啦~

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



附件: 您所在的用户组无法下载或查看附件
本帖最近评分记录
  • oih220 金豆 +10 原创精彩 2008-4-12 17:53
  • oih220 体力 +20 原创精彩 2008-4-12 17:53
  • ajc2003 金豆 +1 原创精彩 2008-4-12 15:39
  • ajc2003 体力 +10 原创精彩 2008-4-12 15:39
  • Consam 体力 +40 原创精彩 2008-4-12 08:38
  • Consam 金豆 +30 原创精彩 2008-4-12 08:38
  • Consam 贡献 +3 原创精彩 2008-4-12 08:38

TOP

网页效果看起来怪怪的,我还是上传个WORD版本号啦。

这里是WORD版:
附件: 您所在的用户组无法下载或查看附件
本帖最近评分记录
  • Consam 金豆 +30 谢谢分享 2008-4-12 08:52
  • Consam 贡献 +2 谢谢分享 2008-4-12 08:52
  • Consam 体力 +40 谢谢分享 2008-4-12 08:52

TOP

引用:
原帖由 ganfan 于 2008-4-12 00:51 发表
网页效果看起来怪怪的,我还是上传个WORD版本号啦。

这里是WORD版:20958
绝对详细!目前最完整明确的教程

TOP

以后没有饭吃了 哈哈 支持一下
www.DarkForcesTeam.com
HTC Diamond
SPL:1.40.Monkey
OS:Build 21105@MonkeyBape
HTC Polaris
SPL:2.20.Monkey
OS: Build 21105@MonkeyBape
HTC Athena
SPL:1.30.Monkey
OS: Build 21105@MonkeyBape
HTC TYTNⅡ
SPL: 1.1.Monkey
OS:Build 21105@MonkeyBape
Iphone 8G
OTB:2.1
Modem:04.05.04_G

TOP

绝对支持楼主这样的教程,真的太棒了!

TOP

真的太棒了!

TOP

目前最完整明确的教程

TOP

哈哈~虽然我已经基本掌握了这项技术,但还是要支持 LZ,让更多的人参与到百花齐放、百家争鸣中来


HTC Roadster / HP Compaq iPAQ hx4700,HTC Kaiser / T-Mobile MDA Vario III...

TOP

支持!!!!!!!!!!

TOP

感谢分享!

TOP

发新话题