本文来自二把刀樂園,文章地址: http://hi.baidu.com/2badao/blog/item/cc7392587b7ad8d79c8204de.html

重构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
九、结束~~~图如下~~~

重构os.nb.payload教程相关推荐

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

    重构os.nb.payload教程(扩建/缩小XIP区域.缩小/删除UDLR.前移IMGFS等) 第一章:这篇教程的用途 这篇教程的用途,如标题所言,介绍扩建/缩小XIP区域.缩小/删除UDLR.前移 ...

  2. macos下载的安装包在哪里_macbook任意降级,为您带来mac os完美降级教程

    最近有许多用户反映升级了最新的系统出现了各种奇葩问题,更关键的是,很多常用(专业)软件不能使用了.因此有许多用户想要降级,现在macdown小编为您带来mac os完美降级教程,有需要的赶紧收藏啦! ...

  3. 服务器 mac系统安装教程,mac os sierra安装教程

    mac os sierra安装教程 [2021-02-15 20:13:38]  简介: 下面由composer教程栏目给大家介绍Mac下安装Composer及Composer安装TP5的方法,希望对 ...

  4. 自制 os 极简教程 3 :终于把90%的人劝退了!

    在上一篇<自制 os 极简教程 2:史上最难的 hello world>中,我们已经完成了最基本的环境搭建并实现了从零自制操作系统的 hello world 程序,下面我急速过一遍主要步骤 ...

  5. Stale branches 设置_Mac OS 网络设置教程 wifi设置与宽带设置详解

    虽然所有设备连接无线网络的步骤都相差无几,但是Mac与windows系统还是不相同的,那么,苹果Mac怎么连接无线网络呢?针对此问题,本文就为大家介绍Mac网络的设置教程,有兴趣的朋友们可以了解下. ...

  6. 写一个操作系统有多难?自制 os 极简教程

    不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了满足程序员们自带的成就感,还是为 ...

  7. linux 约等于符号,Mac OS X基础教程:特殊符号的快捷输入方式

    对于刚刚接触Mac的用户来说,一些快捷输入的方式可能会是他们想要了解的,特别是在文档中输入一些特别的符号,今天我们就为大家介绍一些符号的快捷输入方式.本文为基础教程,资深用户可略过. 苹果符号 按下S ...

  8. Swift之 vm10虚拟机安装Mac OS X10.10教程

    VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift .   近期WWDC放出终极大招--新的编程语言Swift(雨燕),导致一大波程序猿 ...

  9. linux firefox体验,Firefox插件 让你在桌面浏览器体验Firefox OS(附安装教程)

    Mozilla推出的Firefox浏览器插件r2d2b2g现在已经变成一个Firefox OS模拟器,方便开发者和普通用户在桌面浏览器上体验Firefox OS.在其官方博客中,Mozilla表示希望 ...

最新文章

  1. php各种编码集详解和在什么情况下进行使用 [php 字符集 显示]
  2. easypoi导出数值型_SpringBoot使用EasyPoi进行数据导入导出Excel(一)
  3. 江夏学院计算机,福建江夏学院计算机作业.doc
  4. 东山里的传说——《荒原的呼唤》选载之四
  5. vue实用组件——表格
  6. linux修改yum本地源的方法
  7. php压缩html文件,压缩html_PHP压缩html的函数代码
  8. Android UI 控件
  9. SX1278 Lora网关
  10. win10下pytorch-gpu安装以及CUDA详细安装过程
  11. 服务器安装windows2016选择磁盘时报错不能将系统安装到此盘符
  12. 推荐一个朋友 - 学历不好,非科班,不负光阴终进大厂
  13. Node.js CQRS 幻灯片系统开发实战-曾亮-专题视频课程
  14. 《JAVA编程思想》学习笔记:第16章(数组)
  15. python中找最小值,使用循环python查找最小值
  16. PHP有哪些优势和劣势
  17. 调节广告速度,跳过广告的另一境界——Video Speed Controller
  18. Beego入门简单构建, 连接MySQL实现增查操作
  19. CSP(共空间模式)的python实现
  20. 虚拟机安装win2000(附key)

热门文章

  1. 追风筝的人 第七章
  2. 富文本编辑器(前端界面输入文字格式可视化修改)
  3. 复盘2021年国内手游出海:大厂“吃饱”,中小厂商顺势“带跑”
  4. 走出腾讯:一个80后技术人的信仰
  5. Python学习笔记:7.5.7 Django快速建站 - Web开发实战 微信公众号开发2
  6. 今年跳槽稳了,年薪25W!
  7. 实战:怎样把间隔的几个commit整理成1个?-2021.11.18
  8. 主版本 52 比 51 新, 此编译器支持最新的主版本nsupported major.minor version 52.0
  9. 电路基础(第一章电路模型和电路定律)
  10. docker容器的分层思想