双启动的意思是,在PXA270上同时支持Linux和WinCE操作系统,通过外部控制,选择进入哪一个系统。很多处理器都原生态的支持双启动,甚至多启动。如S3C2410的MCU本身支持NOR BOOT和NAND BOOT。但PXA270只支持NOR BOOT,所以在这上面实现双启动,有得一做。
最初的想法是采用2片大容量的NOR FLASH,一片存储Linux,另外一片存储WinCE,通过拨码开关控制片选信号,从而支持双启动。理论上是可行的,而且也比较方便,软件无须做修改。问题是这样硬件成本就上来了,NOR FLASH还是比较贵的。这种做法被否定,只能另想办法。
由于对Linux不了解,只能从WinCE入手,想办法把WinCE放到NAND FLASH中,NOR FLASH依然存储Linux,不做改动。为了支持WinCE从NAND FLASH中加载OS,需要在EBOOT中实现NAND FLASH的“驱动”。而选择启动哪个操作系统则交给最初的一个引导程序来做,我管它叫NORBOOT。NORBOOT存储在NOR FLASH的0地址处,上电即运行,它通过判断外部按键是否按下决定启动EBOOT还是BLOB,EBOOT和BLOB也都放在NOR FLASH中。Linux的启动由BLOB继续,WinCE的启动由EBOOT完成,互不干扰。NORFLASH的分布示意图如下:
其中,NORBOOT存放在0地址,约20KB。BLOB存放在32KB地址,约75K。EBOOT存放在128KB处,约116K。相对原来Linux的FLASH分布,就前面这256K不一样,后面Kernel和文件系统的分布跟原来完全一致,这就减少了Linux下的修改。事实上这种结构,Linux无须做任何修改,包括BLOB。最开始,还想着要修改BLOB加载到内存的部分,花了半天的时间研究BLOB的代码,最后发现它无须做任何修改就能在这种模式下正常工作。不过,弯路没有白走,现在对BLOB有了更深刻的认识。但EBOOT是要做一些修改的,它和BLOB加载到内存的方式不一样。EBOOT将整个EBOOT全部拷贝到内存中去,然后跳转到RAM中EBOOT的CODEINRAM处,继续执行。BLOB则分为两部分,stage1和stage2,第一部分在NOR FLASH中运行,并加载第二部分到内存的一个固定地址,然后跳转到该内存地址上,执行第二部分的代码。
EBOOT的启动流程如下图所示:
BLOB的启动流程如下图所示:
Linux的部分就不说了,EBOOT中需要添加NAND FLASH的支持,一般来说由三个部分组成:bootpart、FMD和读写操作系统映像的封装。其中bootpart库由微软实现,提供了分区和BINFS读写的功能,FMD即FLASH Media Driver,是操作NAND FLASH的底层“驱动”代码,BOOTPART库会调用其中的函数从而控制NAND FLASH,最外层会调用BOOTPART中的函数实现在NAND FLASH中读写操作系统映像。由于PXA270中没有NAND FLASH的控制器,所以FMD中采用IO模拟实现对NAND FLASH的操作。当然,EBOOT存储WinCE的映像不一定非得用BINFS,也可将WinCE的RAMIMAGE烧写到RAW NANDFLASH中。采用该方法,WinCE启动时必须将整个映像都加载到内存中。这里不采用该方法,是为了给以后的进一步改造留条路。
NORBOOT的想法源自2410中的NAND BOOT(NBOOT),在整个系统中起一个引导的作用。如果系统需要加密,也可以在这一段做处理。首先判断执行条件,如果不满足就HALT,否则,根据外部按键的状态选择启动哪一个操作系统。NORBOOT的实现比较简单,基本跟以前介绍过的NBOOT类似,这里不再赘述。需要了解这方面内容的,请参考这一篇,http://www.cnblogs.com/we-hjb/archive/2008/09/27/1299901.html。
实现完NORBOOT、EBOOT后,将它们跟BLOB打包成一个映像文件,通过JFlashMM烧写到NOR FLASH中测试,BLOB和EBOOT都能正常启动,剩下的事情,就各自管各自的了。这条路应该是打通了,但带来了新的问题,WinCE的加载相当慢,需要想办法解决。
本文介绍了PXA270中通过NORBOOT和NAND FLASH实现WinCE和Linux双启动的方法,测试表明,该方法可行。功能已实现,细节待完善。