WM6 ROM OS分区原理:128MB ROM包括IPL、SPL、OS(35MB)、EXTROM(10MB)、RADIO、STORAGE(65MB)等分区,其中OS分区又分为XIP、IMGFS两部分。系统启动时SPL加载OS分区的XIP到RAM执行,XIP部分大约3MB,包括nk.exe、device.exe等核心程序,就像PC上的ntoskrnl.exe等。IMGFS就像一个压缩的GHOST文件,包括了WM的所有系统文件。CE核心启动后就可以访问IMGFS文件系统上的OS需要的所有文件了,IMGFS是XPR或LZX压缩格式,系统访问上面的文件会自动解压到RAM。因为普通PE文件调入RAM执行要进行地址重定位,为了提高效率,IMGFS中的文件可以是重定位好的模块形式,这些程序运行就不用再重定位了,直接调入RAM中保留的PagePool执行
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是可以直接运行代码的。
总结一下就是RAM = 程序内存 + 高速缓存 + RADIO + DMA + 屏幕缓冲区 + 。。
ROM = OS分区 + extended_rom分区(OEM的程序区) + IPL(BIOS) + SPL + 存储内存
扩展存储卡如T卡等都属于NAND ROM ,如图的情况:
闪存大小256MB指的是机上的ROM。
所以刷机就是重写OS分区了,用PDOCREAD可以把整个OS分区读成一个NB镜象文件,然后把镜象解开到DUMP文件夹,就是所有ROM的文件了。文件分2种,一种是普通文件,另一种是XIP(ExecInPlace)模块,这是为了加快OS运行设计的,就是这些文件可以不调入RAM而直接在ROM执行,但因为现在都是NAND ROM,所以XIP模块其实还是要调入RAM的PAGEPOOL执行。
但是由于XIP模块有很多地址信息,所以移植OS最难的就是这了。XiP全称为(eXecute In Place),翻译成中文就是:就地执行。XIP即就地执行的意思,操作系统内核直接在Flash中运行,不需要拷贝到RAM。但是,Flash的存储器访问周期要比RAM大得多,在使用XIP技术后可能会降低程序的运行速度,不过由于CPU的指令预取机制以及Cache机制,实际使用起来并不会明显降低应用程序的运行速度。XIP的原理很简单,即指操作系统或应用程序直接从非易失性存储器中执行。就当前的技术来说,这里的非易失性存储器特指NOR型Flash,因为只有N0R型的Flash才可以随机存取。另有一种通过增加Cache使NAND Flash也可以进行XIP的方案,但需要增加硬件电路,不是一个通用的解决方案。
除了硬件提供支持以外,XIP还需要软件的支持。操作系统内核和应用程序在运行时,它在内存中的映像可以分为三个部分:代码段、数据段和堆栈段。代码段对应于执行程序中的Text Section,其中包括运行代码和只读数据,这个段在内存中一般被标记为只读。数据段对应于运行文件中的Data Section和IkSS Section,其中存放的是各种数据(经过初始化的和未经初始化的)和静态变量,而堆栈段存放的则用于保存函数调用和局部变量。从以上分析可知,程序运行时在内存的映像分为两类:一类是只读的,如代码段;另一类是可写的,如数据段。而Flash虽然是可写的,但并不能像写普通RAM一样进行。因此,当程序在Flash中运行时,我们仍然需要把部分可写的数据段放在RAM 中。
因为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文件可以删掉,不过别人反向生成就没有了单独的注册表项。
刷机后首先要硬起(HARD RESET),出厂设置就是格式化ROM中的用户分区,这样就剩ROM文件了,干干净净。ROM分区就是/windows,里面的文件除了刷机是不能修改的,所以如果OEM商在里面装了什么软件用户是无法删掉的,只能删掉外面的快截方式。当用户把文件复制进windows时系统会把它放在用户分区,然后隐藏掉windows里的原始文件,这样看起来文件就被覆盖了,实际上ROM里的文件没有变,有人想通过这样复制一个小文件覆盖windows的大文件想节省空间是不可能的,这样只是浪费了用户分区的空间。OS分区的空间没有节省的说法,因为OS分区的剩余空间不能被用户使用,除非重新对DOC分区,不过这个太复杂了,而且如果弄坏了RADIO部分数据就不能当电话用了。
所以在DUMP生成镜像的时候尽量多放点东西才叫利用,不过那又不纯了。所以硬启所做的事就是把用户分区格式化了,这样就只剩一个没有子目录的windows目录,然后系统执行initflashfiles.dat里的命令建立子目录和把一些需要的ROM文件(比如注册表)复制到用户分区,因为这些文件后期是可能要修改的。然后initflashfiles.dat运行checkautorun.exe来检查windows/autorun.exe,然后这个autorun又执行/extended_rom/autorun.exe就是运行EXTROM分区的程序。EXTROM分区默认是写保护的,可以用程序解开,默认也没有加载点显示,可以改注册表显示为STORAGE,或者不显示就直接在文件管理器输入/extened_rom路径进入。这个分区硬启不会丢失,所以可以放入硬启后想自动运行的软件