代码改变世界

ROM定制原理(转)

2008-06-13 17:05  cppguy  阅读(1871)  评论(0编辑  收藏  举报

原文http://hi.baidu.com/ljp74717/blog/item/50d7cdbf499d8d0f19d81fd4.html

 

       用WM两年了还没刷过几次机,因为我一向认为系统的应用在于软件而不是操作系统,而且刷机也有风险万一失败成了砖头就不划算了。上个星期到论坛ROM版转转,830的WM6那个多啊,实在忍不住诱惑了,刷了个WM6,不过却不是很满意,里面集成了那么多垃圾软件想删又删不掉。于是就开始研究ROM定制了,经过几天的实验,刷了十次以下机,电话短信漏了N多,总算做了个自己满意的基本纯净的WM6Pro。讲讲我得出的原理好了。
     WM的RAM一般是64MB,系统中显示的少,是除去了PAGEPOOL(高速缓存默认6MB)、RADIO、DMA、屏幕缓冲区等系统核心的部分。WM不支持虚拟内存PAGEFILE。ROM 128MB位于DiskOnChip芯片,顾名思义就是把存储芯片模拟成了磁盘,用的FAT文件系统,所以就有分区,一般用的是OS分区(就是刷机要刷的分区)和extended_rom分区(放恢复出厂设置后自动安装的OEM安装包)。还有IPL(BIOS)、SPL(加载OS,显示第2屏开机画面,如果刷机刷坏了就停这了,这时还可以利用三色屏或SD卡重新刷官方ROM,所以只要IPL、SPL不坏就不怕,而一般刷机是不刷这2部分的)、RADIO模块。剩下的就是用户可以使用的存储区(大概40多MB,FLASH ROM和U盘一样是可读写的,只是没电不丢数据)。ROM分NAND和NOR两种,现在一般用的NAND,就是制作存储卡和U盘的那种,不能直接运行代码,要调入RAM才能运行。NOR是可以直接运行代码的。
     所以刷机就是重写OS分区了,用PDOCREAD可以把整个OS分区读成一个NB镜象文件,然后把镜象解开到DUMP文件夹,就是所有ROM的文件了。文件分2种,一种是普通文件,另一种是XIP(ExecInPlace)模块,这是为了加快OS运行设计的,就是这些文件可以不调入RAM而直接在ROM执行,但因为现在都是NAND ROM,所以XIP模块其实还是要调入RAM的PAGEPOOL执行。但是由于XIP模块有很多地址信息,所以移植OS最难的就是这了。因为WM6内部版本是WM5.2所以文件结构和WM5是一样的。对DUMP进行自己需要的修改后再打包会NB镜像文件然后用PDOCWRITE通过ACTIVESYNC连接整个写入ROM的OS分区就刷机完成了。DUMP里有default.hv(包括HKCR和HKLM)和user.hv(包括HKCU)是初始注册表文件,可以转换成REG来编辑再转回去。
当然直接对DUMP目录进行操作太麻烦了,比如要去掉一个软件,你要删掉这个软件用到的所有文件和注册表项,要一个个找。所以就有了BUILDOS工具,他把每个软件分成一个文件夹,里面有软件的所有文件和注册表项,文件夹里的RGU文件就是这个软件所要的注册表项,DSM文件是关联信息,就是以后把 DUMP反编成BUILDOS时根据DSM的内容来确定这个软件需要哪些文件。BUILDOS生成的DUMP目录里的RGU文件可以删掉,不过别人反向生成就没有了单独的注册表项。DSM还有另一个作用是系统硬启时会从DSM里读取PROVXML文件列表,然后执行对应的PROVXML文件,所以随便直接删除DUMP里的文件是不可靠的,如果万一删到那个DSM里有PROVXML文件的话,这个DSM就被破坏了,那些PROVXML也不会被执行。所以最好是用BuildOS来制作ROM,因为那样DSM会被重新生成。
刷机后首先要硬起(HARD RESET),出厂设置就是格式化ROM中的用户分区,这样就剩ROM文件了,干干净净。ROM分区就是\windows,里面的文件除了刷机是不能修改的,所以如果OEM商在里面装了什么软件用户是无法删掉的,只能删掉外面的快截方式。当用户把文件复制进windows时系统会把它放在用户分区,然后隐藏掉windows里的原始文件,这样看起来文件就被覆盖了,实际上ROM里的文件没有变,有人想通过这样复制一个小文件覆盖windows的大文件想节省空间是不可能的,这样只是浪费了用户分区的空间。在刷NB格式的情况是不会重新分区的,OS分区的空间没有节省的说法,因为OS分区的剩余空间不能被用户使用,所以在DUMP生成镜像的时候尽量多放点东西才叫利用,不过那又不纯了。如果用RUU刷NBF的ROM的话,用户分区会随OS分区变化,就是OS 越小用户STORAGE分区就越大。所以硬启所做的事就是把用户分区格式化了,这样就只剩一个没有子目录的windows目录,然后系统执行 initflashfiles.dat里的命令建立子目录和把一些需要的ROM文件(比如注册表)复制到用户分区,因为这些文件后期是可能要修改的。然后 initflashfiles.dat运行checkautorun.exe来检查windows\autorun.exe,然后这个autorun又执行\extended_rom\autorun.exe就是运行EXTROM分区的程序。EXTROM分区默认是写保护的,可以用程序解开,默认也没有加载点显示,可以改注册表显示为STORAGE,或者不显示就直接在文件管理器输入\extened_rom路径进入。这个分区硬启不会丢失,所以可以放入硬启后想自动运行的软件。
WM6比WM5还是有不少改进的,主要是增强了电话基本功能(比如SP的智能拨号功能)和单手操作,其实就是像SP一样都能用软键菜单操作;加入了蓝牙 PAN和NAT,现在电脑通过手机上网就有4种方式了,2种是以前就支持的把手机当成USB MODEM或蓝牙MODEM拨号上,这种方式是电脑控制拨号,拨上了后手机就不能再拨号了。新方法是把手机当作电脑的USB或蓝牙网卡,手机充当路由器,这样是手机拨号,手机和电脑可以同时上;OFFICE MOBILE支持OFFICE 2007了;集成了.NET CF 2.0;集成了SIP IP电话,不用SJPHONE了。其他OEM部分比如相机、WIFI驱动其实还是从WM5移植来的一样的。我做的这个版本稳定性、速度、耗电基本和WM5 一样,没兴趣再倒回WM5了。
制作步骤:
os.nb文件就是ROM中的OS分区镜象(就像GHOST文件),os.nb含有XIP和IMGFS两部分,其中XIP部分是不会到DUMP的,含有系统核心文件nk.exe、coredll.dll等,要用XIPPORT才能修改。IMGFS就是磁盘文件系统,里面包含了所有DUMP里的文件,是用 XPR或LZX压缩的。
所以imgfsfromnb os.nb imgfs.bin就是从os.nb里提取出IMGFS部分,而imgfstodump imgfs.bin就是把IMGFS部分解压缩到DUMP目录。然后PACKAGE TOOL根据DUMP里的package.sof和DSM文件将DUMP目录重新还原SYS和OEM分组结构便于修改ROM。
修改完ROM后先BuildOS把SYS和OEM重新生成DUMP目录,这时还会合成所有目录下的RGU文件和ROM\XIP\boot.rgu(因为 boot.rgu的内容是在os.nb的XIP部分,而不在其他SYS或OEM目录里),然后把RGU分组转换成default.hv和user.hv。接着执行imgfsfromdump imgfs.bin imgfs1.bin就是根据imgfs.bin的压缩方式来把DUMP压缩到imgfs1.bin。然后imgfstonb imgfs1.bin os.nb osnew.nb就是把imgfs1.bin替换掉os.nb里的IMGFS部分而生成osnew.nb。这时既可以用PDOCWRITE通过 ACTIVESYNC直接把osnews.nb写入到ROM的OS分区,也可以把osnew.nb打包成nbf文件用RUU刷入。区别是RUU写入会根据 nbf文件大小调整STORAGE分区大小,而PDOCWRITE不会。
因为NAND ROM是不能直接XIP执行的,而且IMGFS又是压缩的更不可能直接执行,所以系统会把OS分区的文件解压调入RAM中预留的PagePool执行,这就是PP的作用,PP越大则调入的系统文件越多,但是用户进程可用RAM就小,所以要找到一个平衡点,MS默认的是6MB。可见PP和电脑上的 PageFile作用是完全不同的,PageFile是虚拟内存,而PagePool是运行系统文件的内存缓冲区。如果PP为0则系统文件会直接调入普通 RAM执行。