重构os.nb.payload教程(扩建/缩小XIP区域、缩小/删除UDLR、前移IMGFS等)

来源:互联网 发布:windows闹钟软件 编辑:程序博客网 时间:2024/04/28 01:57

重构os.nb.payload教程(扩建/缩小XIP区域、缩小/删除UDLR、前移IMGFS等)

 

第一章:这篇教程的用途

这篇教程的用途,如标题所言,介绍扩建/缩小XIP区域、缩小/删除UDLR、前移IMGFS等知识,然后因自己的需要 修改os.nb.payload区域,以实现一些目的。如我的touch pro的ROM是512M的,不必怕没空间用,因此可以考虑将XIP扩建,放多点东西(如使用繁体版ROM的wince.nls,1M多大,包含很完整的 区域)。再比如838、P800、D9000等机型,ROM容量比较小,这样就可以考虑删除UDLR区,缩小XIP区域,前移IMGFS地址,以达到增大 机身空间的目的(雪山兄弟成功在P800上腾出3M的空间)。再比如一些ROM的XIP区域太小,移植XIP后放不下,这时也可以考虑扩建XIP区域。

第二章:认识os.nb.payload的结构

一、os.nb.payload的结构
要想修改os.nb.payload里各部分的内容,必须先了解一下os.nb.payload结构。一般ROM是分为四部分的,即ULDR、XIP、IMGFS和FAT(这部分有些机型没有)
1、ULDR即Update Loader,这部分具体有什么作用我也不是很清楚,希望有高人解疑,如果你的ROM没有FAT部分的话,那ULDR部分可以完全删除。
2、XIP,摘自52dopod.net的教程:XIP(eXecute In Place)中文意:立即执行。XIP所起到的作用是让操作系统内核直接在Flash中运行,不需要拷贝到RAM,即指操作系统或应用程序直接从非易失性 存储器中执行,这样减少了内核从闪速存储器拷贝到RAM的时间,其采用的非压缩映像也减少了内核自解压的时间,换句话说,XIP直接决定了PPC系统运行 和加载程序的时间,也就是直接决定了PPC系统的运行速度。
3、IMGFS,摘自52dopod.net的教程:IMGFS就像一个压缩的GHOST文件,包括了WM的所有系统文件。CE核心启动后就可以访问 IMGFS文件系统上的OS需要的所有文件了,IMGFS是XPR或LZX压缩格式,系统访问上面的文件会自动解压到RAM。因为普通PE文件调入RAM 执行要进行地址重定位,为了提高效率,IMGFS中的文件可以是重定位好的模块形式,这些程序运行就不用再重定位了,直接调入RAM中保留的 PagePool(缓冲池)执行。
4、FAT,这部分我也不清楚是什么,838、P800等机型的os.nb并没有这部分,也希望有高人解疑……

二、四部分在MBR(Master Boot Record)里的定义
os.nb.payload的0x0至0x1FF部分是MBR部分,定义了刚才4部分的起始位置、大小等内容,如果我们想修改那4部分的内容,必须在MBR区里相应修改才可以。我们用WINHEX这个16进制编辑器打开os.nb.payload吧。


如上图所示,1C2、1D2、1E2、1F2处的数值其实是关于这4部分的定义,至于这些数值分别代表什么,其实XIP里的boot.rgu已经定义了,boot.rgu里有这么一段注册表:
[HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable]
"20"="BOOT"
"23"="RAWFS"
"25"="IMGFS"
"04"="FATFS"
因此,1CX行是定义boot(即ULDR)的,1DX行是定义RAWFS(即XIP)的,1EX行是定义IMGFS的,1FX行是定义FAT的。

三、四部分在MBR的起始地址及大小


如上图所示,1X6至1X9是该部分在ROM的扇区起始地址,1XA至1XD是该部分在ROM的大小
即:
ULDR起始扇区是1C6 – 1C9,扇区大小是1CA – 1CD
XIP起始扇区是1D6 – 1D9,扇区大小是1DA – 1DD
IMGFS起始扇区是1E6 – 1E9,扇区大小是1EA – 1ED
FAT起始扇区是1F6 – 1F9,扇区大小是1FA – 1FD
需要注意的是,这4部分的地址是连续的,即这部分的起始地址=上一部分的起始地址+大小,如XIP的地起始地址=ULDR起始地址+ULDR大小,MGFS起始地址=XIP起始地址+XIP大小。而第一部分的起始地址必须是02000000才可以


四、起始地址及大小的换算方法
1、换算方法:
刚才所说的起始地址及大小并不是实际在ROM的偏移地址,而是以扇区为单位,我们要转换成实际的地址及大小的话,就要将那里的数值乘以扇区大小(记住无特殊说明都是16进制来的)。
另外,在16进制编辑器里,数据的顺序是倒过来书写的,以2个字节为一组,比如1D6至1D9在WINHEX里显示是40 06 00 00,那实际上我们换算是倒过来的,即00 00 06 40,即640。而实际地址就是640乘以扇区

2、扇区大小的查看方式
扇区大小的查看很简单,就是看MSFLSH50的起始偏移地址是多少,如下图所示,我的touch pro的ROM的MSFLSH50起始地址是0x800,因此扇区就是800。


而下面一张图则是我以前用过的838机型的os.nb里的MSFLSH50,可以看见起始地址是200,所以扇区大小就是200


3、以touch pro举例一下


(推荐使用WINDOWS自带的计算器来计算,选择十六进制,四字节)
如上图所示:
ULDR:起始地址是1C6至1C9(记住数值要倒过来),即00000002*800=1000,大小是1CA至1CD(记住数值要倒过来),即0000063E*800=31F000
XIP:起始地址是00000640*800=320000,大小是00000900*800=480000
IMGFS:起始地址是00000F40*800=7A0000,大小是00000040*800=20000(嗯,这个os.nb.payload是我精简过的,所以IMGFS很小,精简的方法等一下再说)
FAT:起始地址是00000F80*800=7C0000,这个大小一般不必修改(因为是最后的部分),所以就不换算了

4、再以838举例说明一下


刚才已经说了,838的MSFLSH起始地址是0X200,因此838的扇区就是200,因此这次是乘以200才对:
ULDR:起始地址是00000020*200=400,大小是0000187E*200=30FC00
XIP:起始地址是00001880*200=310000,大小是00001800*200=300000
IMGFS:起始地址是00003080*200=610000,大小是00018400*200=3080000
FAT区的1FX这行可以看见全是0000,这说明838的ROM是没有FAT区的。

五、MSFLSH区段里有关IMGFS的起始位置的限制
IMGFS的起始地址并不是任意的,要受到一定的限制,这些限制我们在可以MSFLSH区域里看到
1、以下是touch pro的:

其中81C(蓝框的3D)是Start Block of imgfs(IMGFS的起始块地址),是MSFLSH对IMGFS的起始块位置的定位,如果我们更改了IMGFS的起始位置,必须在这里相应的修改这个 值才可以,而这个值是由IMGFS的起始地址除以IMGFS的LBA Restriction(LBA限制?)得出的
而LBA Restriction(LBA限制?)则是在偏移地址824至827处(绿框00000200),如图所示是00020000,所以81C的就是7A0000(IMGFS起始地址)/20000=3D
而粉红框处的820至823则是Number of sectors per block of imgfs(IMGFS每块的扇区数?这个我不知道该如何翻译也不理解……),其值等于LBA Restriction除于扇区大小,即20000/800=40

因为81C处的值是等于IMGFS起始位置除于20000(LBA Restriction),因此touch pro的ROM,IMGFS的起始地址必须能整除20000才可以,请切记!

2、接着我们看看838的os.nb的MSFLSH处的:


我们可以看到和touch pro的不同,偏移地址224至227处(绿框00000100)LBA Restriction是00010000,因此21C处就是IMGFS起始地址/LBA Restriction=610000/10000=61,而220处就是LBA Restriction/扇区大小=10000/200=80
因此,838的ROM,因21C处和LBA Restriction的关系,IMGFS的起始地址必须能整除10000才可以

六、以上就是我们修改os.nb.payload需要注意的地方,知道了那些地方的关系,就可以扩建/缩小XIP等了

第三章:精简os.nb.payload里的IMGFS

在动手修改XIP区域等之前,让我们先把模板里的os.nb.payload缩小一下体积。相信有人留意过有些大大的模板里的 os.nb.payload(或os.nb)只有几M大,而自己的却有几十M甚至上百M大,虽然体积相差很远,但build ROM时却无区别,这是怎么回事呢?
如果有留意过我以前写的教程就知道,事实上os.nb.payload在制作ROM的过程中,里面的IMGFS这部分是不起作用的,只是提供框架作用而 已,最终里面IMGFS会被模板里的OEM+SYS所形成的IMGFS代替,因此,os.nb.payload里的IMGFS其实我们可以用空的 IMGFS来代替掉,这样就会大大减小os.nb.payload,而且不会对制作ROM有任何影响(唯一的影响就是你的硬盘空间大一点,呵呵)

以下是制作过程:
1、在os.nb.payload的目录里新建一个dump的目录
2、运行以下命令:
../TOOLS/ImgfsFromNb OS.nb.payload imgfs.bin
(使用imgfsfromnb软件,从os.nb.payload里分离出imgfs.bin)
../TOOLS/ImgfsFromDump imgfs.bin imgfs-new.bin
(使用imgfsfromdump软件,按照imgfs.bin格式使dump目录形成新的imgfs-new.bin)
../TOOLS/ImgfsToNb imgfs-new.bin os.nb.payload os-new.nb.payload
(使用imgfstonb命令,将imgfs-new.bin压回os.nb.payload,另存为os-new.nb.payload文件)
3、这样就OK了,os-new.nb.payload就是精简过的文件了,我们把原来的os.nb.payload删掉,将os-new.nb.payload改名回os.nb.payload就OK了,非常简单吧~~

第四章:实践一:扩充XIP区域教程

如果你的XIP太大写不回os.nb.payload时,那我们就需要扩充xip区域了,其步骤主要有这几点:1、修改1DA处的XIP扇区大小;2、在 XIP处插入相应的空字节;3、修改1E6至1E9处的IMGFS起始扇区地址和1F6至1FA处的FAT区起始扇区地址;4、修改81C处的IMGFS 起始块数值(新的起始偏移地址/20000)
我们一步一步来吧

一、修改1DA处的XIP扇区大小


原本的XIP扇区大小是00000900*800=480000,这个是16进制,转换成10进制就是4718592,4.6M左右,其实一般是够用的 了,呵呵,但如果我们想用繁体ROM的wince.nls,而又不想删掉XIP里的hd.dll等文件,那就会超出4.8M了,这样就放不下了,那就要扩 充XIP区域了,我们扩充多1M空间吧,由原来的16进制480000扩充成580000,转换成扇区是580000/800=B00,因此我们将1DA 处修改成000B0000吧


二、插入相应的空字节
1、我们修改了XIP的扇区大小,那就要插入相应的空字节才可以(同理,如果是缩小XIP区域,那就删除相应的字节)
我们由原本的480000字节(16进制)扩充成580000字节(16进制),那就是增加了580000-480000=100000字节(16进 制),转换成10进制就是1048576,我们在WINHEX里点击“文件/新建”,在弹出的对话框的类型选择bytes,左侧填入1048576,然后 按确定


我们可以去到最后一行,看看左侧的地址是不是000FFFF0?如果是的话证明我们新建的字节对了,呵呵
2、在新建的文件里,按CRTL+选择全部,然后再点击上方菜单栏的“编辑/复制选块/16进制数据”,再点击左上角的os.nb.payload切换回来
3、点击WINHEX下方状态栏中间的“偏移”,会弹出“转到偏移地址”的窗口,输入7A0000,按确定,这样就会跳到XIP的结束地址的后一个字节(也就是IMGFS的起始地址)


4、然后按CRTL+V粘贴刚才复制下来的字节,WINHEX会提示将增加文件大小,呵呵,这个就是我们希望的嘛,按确定吧~
5、然后我们再点击下方状态栏的“偏移”,输入8A0000,看看我们复制的是否正确,如果正确的话8A0000处应该是IMGFS的标志头才对


呵呵,看来对了~~~

三、修改1E6的IMGFS起始扇区地址
这个很简单了,IMGFS的起始扇区地址=XIP起始扇区地址+XIP扇区大小=640+B00=1140,即改成40110000
而IMGFS的大小我们并没有改变,所以就不必修改
四、接着修改1F6的FAT起始扇区地址,即1140+40=1180,即改成80110000
五、这样这里就修改完毕了,如下图:


六、接着我们还剩一步,即修改MSFLSH处的IMGFS起始块位置(81C处)
因为IMGFS的起始偏移地址由7A0000改成8A0000了,因此81C处的IMGFS起始块位置必须也要修改才对,这个值=IMGFS起始偏移地址/LBA Restriction=8A0000/20000=45,我们把81C处由3D改成45吧


七、这样就修改完毕了~~~写入XIP再刷个ROM试试吧~~~~

第五章:实践二:缩小ULDR区域教程

接着我们试一下缩小ULDR区域,腾出更多的空间(其实对拥有512M的touch pro没有意义,只是为了别的64M机型写教程用而已,呵呵)

ULDR具体有什么用我也不清楚,XDA那篇教程,作者说可以把ULDR由63E缩小至3E(即缩小600)也能正常使用,至于作者为什么知道可以缩到这 么小我也不清楚……总之我们知道有FAT区的机型可以缩到那么小吧(没有FAT区的可以直接删掉ULDR,下一章的内容就是以没有FAT区的机型为例删除 ULDR)

一、将ULDR的扇区大小修改成3E


如上图,ULDR的起始地址是20,大小是63E,我们将大小改成3E吧,缩小600扇区空间

二、相应删除600字节(16进制)
除了修改1C9处的数据外,还要相应删除掉相应的字节才可以。
1、新的XIP起始地址=(2+3E)*800=20000
2、旧的ULDR结束地址=(2+63E)*800-1=31FFFF
3、点击WINHEX下方状态栏的右侧“选块”,“选块”开始输入20000,“选块结束”输入31FFFF,按确定后,再按delete键删除所选区域


4、点击“偏移”输入20000,看看那里是不是XIP的标志头?如果是那就操作正确了~~~


二、因为ULDR的大小改变了,因此XIP的起始地址也必须接着改变才可以
刚才已经算过了XIP新的起始地址,即2+3E(ULDR起始地址+大小)=40,我们将40060000改成40000000吧(只需将1D7改成00即可)
三、同样将1E6改成40+900=940(XIP起始地址+大小),即40090000(只需将1E7改成09即可)
四、同理将1F6改成940+40=980(IMGFS起始地址+大小),即80090000(只需将1F7改成09即可)
五、最后将81C处改成940*800/20000=25(IMGFS起始偏移地址/LBA Restriction)
六、OK了~~图就不上了~~~

第六章:实践三:完全删除ULDR区域教程(适合无FAT区机型)

无FAT区的机型可以将ULDR区域完全删除,这样将会节省出很多空间(3M左右),雪山兄弟的P800机型已经试验成功了~

一、如下图,这是838机型的,1F0处全是0,说明没有FAT区


二、拖选1D0至1EF处,再点击上方菜单栏的“编辑/复制选块/16进制数据”


三、用鼠标点击1C0处,再按CRTL+B(注意是B不是C),会弹出窗口“剪贴板数据将写入在偏移量1C0”,按确定。
四、再将1E0这行的数据全部用0代替

然后点击WINHEX下方状态栏的右侧“选块”,“选块”开始输入400,“选块结束”输入30FFFF,按确定后,再按delete键删除所选区域
五、将1C6处XIP的起始地址改成02000000
六、这样IMGFS的起始地址就是2+1800=300400,这个地址不能整除10000,因此我们可以考虑减小XIP的大小,或者增加XIP的大小, 这里我们就减小400算了吧(其实为了以后的移植考虑,最好是增加,我这里就偷懒了),将1CA处改成FE170000,然后相应删除400个偏移值 (300000至3003FF)。
七、将1D6修改为2+17FE=1800,即00180000
八、21C处改成1800*200/10000=30
九、结束~~~图如下~~~

原创粉丝点击