PXA270中WinCE&&Linux的双启动实现

简介: 双启动的意思是,在PXA270上同时支持Linux和WinCE操作系统,通过外部控制,选择进入哪一个系统。很多处理器都原生态的支持双启动,甚至多启动。如S3C2410的MCU本身支持NOR BOOT和NAND BOOT。

    双启动的意思是,在PXA270上同时支持LinuxWinCE操作系统,通过外部控制,选择进入哪一个系统。很多处理器都原生态的支持双启动,甚至多启动。如S3C2410MCU本身支持NOR BOOTNAND BOOT。但PXA270只支持NOR BOOT,所以在这上面实现双启动,有得一做。

      最初的想法是采用2片大容量的NOR FLASH,一片存储Linux,另外一片存储WinCE,通过拨码开关控制片选信号,从而支持双启动。理论上是可行的,而且也比较方便,软件无须做修改。问题是这样硬件成本就上来了,NOR FLASH还是比较贵的。这种做法被否定,只能另想办法。

     由于对Linux不了解,只能从WinCE入手,想办法把WinCE放到NAND FLASH中,NOR FLASH依然存储Linux,不做改动。为了支持WinCENAND FLASH中加载OS,需要在EBOOT中实现NAND FLASH的“驱动”。而选择启动哪个操作系统则交给最初的一个引导程序来做,我管它叫NORBOOTNORBOOT存储在NOR FLASH0地址处,上电即运行,它通过判断外部按键是否按下决定启动EBOOT还是BLOBEBOOTBLOB也都放在NOR FLASH中。Linux的启动由BLOB继续,WinCE的启动由EBOOT完成,互不干扰。NORFLASH的分布示意图如下:

                 

     其中,NORBOOT存放在0地址,约20KBBLOB存放在32KB地址,约75KEBOOT存放在128KB处,约116K。相对原来LinuxFLASH分布,就前面这256K不一样,后面Kernel和文件系统的分布跟原来完全一致,这就减少了Linux下的修改。事实上这种结构,Linux无须做任何修改,包括BLOB。最开始,还想着要修改BLOB加载到内存的部分,花了半天的时间研究BLOB的代码,最后发现它无须做任何修改就能在这种模式下正常工作。不过,弯路没有白走,现在对BLOB有了更深刻的认识。但EBOOT是要做一些修改的,它和BLOB加载到内存的方式不一样。EBOOT将整个EBOOT全部拷贝到内存中去,然后跳转到RAMEBOOTCODEINRAM处,继续执行。BLOB则分为两部分,stage1stage2,第一部分在NOR FLASH中运行,并加载第二部分到内存的一个固定地址,然后跳转到该内存地址上,执行第二部分的代码。

     EBOOT的启动流程如下图所示:

         

       BLOB的启动流程如下图所示:

         

     Linux的部分就不说了,EBOOT中需要添加NAND FLASH的支持,一般来说由三个部分组成:bootpartFMD和读写操作系统映像的封装。其中bootpart库由微软实现,提供了分区和BINFS读写的功能,FMDFLASH Media Driver,是操作NAND FLASH的底层“驱动”代码,BOOTPART库会调用其中的函数从而控制NAND FLASH,最外层会调用BOOTPART中的函数实现在NAND FLASH中读写操作系统映像。由于PXA270中没有NAND FLASH的控制器,所以FMD中采用IO模拟实现对NAND FLASH的操作。当然,EBOOT存储WinCE的映像不一定非得用BINFS,也可将WinCERAMIMAGE烧写到RAW NANDFLASH中。采用该方法,WinCE启动时必须将整个映像都加载到内存中。这里不采用该方法,是为了给以后的进一步改造留条路。

     NORBOOT的想法源自2410中的NAND BOOTNBOOT),在整个系统中起一个引导的作用。如果系统需要加密,也可以在这一段做处理。首先判断执行条件,如果不满足就HALT,否则,根据外部按键的状态选择启动哪一个操作系统。NORBOOT的实现比较简单,基本跟以前介绍过的NBOOT类似,这里不再赘述。需要了解这方面内容的,请参考这一篇,http://www.cnblogs.com/we-hjb/archive/2008/09/27/1299901.html

实现完NORBOOTEBOOT后,将它们跟BLOB打包成一个映像文件,通过JFlashMM烧写到NOR FLASH中测试,BLOBEBOOT都能正常启动,剩下的事情,就各自管各自的了。这条路应该是打通了,但带来了新的问题,WinCE的加载相当慢,需要想办法解决。

本文介绍了PXA270中通过NORBOOTNAND FLASH实现WinCELinux双启动的方法,测试表明,该方法可行。功能已实现,细节待完善。

目录
相关文章
|
Linux 网络安全 开发工具
校外网络连接校园网内的linux服务器方法(使用frp实现内网穿透)
平常在校园里连接校内实验室的linux服务器可以直接使用ssh直接链接私有ip地址,一旦本地移动到了校园网外部(如:使用手机流量wifi,或着暑假回家使用家庭wifi)便无法在使用ssh连接校内的服务器。本文提供一个实现校外也能访问校内服务器的方法
4199 0
校外网络连接校园网内的linux服务器方法(使用frp实现内网穿透)
|
存储 网络协议 Linux
把Linux服务器做成一个下载器,实现远程下载
把Linux服务器做成一个下载器,实现远程下载
把Linux服务器做成一个下载器,实现远程下载
|
关系型数据库 MySQL Linux
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
431 0
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
|
存储 Linux
华为工程师发布最新补丁,实现对 AArch64 硬件的 Linux 镜像内存支持
早在 2015 年,Linux 内核就已支持 x86/x86_64 的 UEFI 镜像内存功能,而对于华为来说,为 AArch64 添加该功能也是他们一直在努力的事情。4 月 14 日,华为工程师 Wupeng Ma 发布了最新补丁集,实现了对 AArch64 硬件的这种 Linux 镜像内存支持。
233 0
华为工程师发布最新补丁,实现对 AArch64 硬件的 Linux 镜像内存支持
Daz
|
IDE Unix Linux
|
Java Linux
想要在Linux中只显示隐藏文件,用对ls就可以实现
在使用Linux的过程中,如何只显示隐藏文件呢? 其实非常简单,只需要用到`ls`就可以实现。
287 0
想要在Linux中只显示隐藏文件,用对ls就可以实现
Daz
|
IDE Unix Linux
GNU/Linux下实现一个简易echo服务器
本文将详细讲解一个简易echo服务器的实现
Daz
278 0
GNU/Linux下实现一个简易echo服务器
|
Linux
基于XShell实现Win与Linux文件传输(替换XFtp等)
基于XShell实现Win与Linux文件传输(替换XFtp等)
316 0
基于XShell实现Win与Linux文件传输(替换XFtp等)
|
安全 Oracle 关系型数据库
Linux——了解目录结构( / )、实现远程操作(Xshell、Xftp)
Linux——了解目录结构( / )、实现远程操作(Xshell、Xftp)
Linux——了解目录结构( / )、实现远程操作(Xshell、Xftp)
|
Ubuntu Linux Windows
linux实用技巧:ubuntu18.04安装samba服务器实现局域网文件共享
linux实用技巧:ubuntu18.04安装samba服务器实现局域网文件共享
linux实用技巧:ubuntu18.04安装samba服务器实现局域网文件共享