阅读:2821回复:7
前几天问的关于multi bin and xip的问题没人理。自己搞出来了哈哈。总结一些经验。欢迎讨论:)
置顶里有两个贴子在说multi bin XIP的问题,目 的在于缩短CE的启动时间和节省内存。
两个帖子里都有人提到,把启动时所需要的基本东西打包到nk.bin这块以xip模式作为启动时用的。 其他的放入文件系统。像linux那样。等“内核”启动后挂载为根文件系统。然后继续其他的东西。 我想这个过程我还是理解得对了。我的东西基本上是按照那两篇文章所说的进行的,对于老鸟来说肯定没什么意义,,,主要是给像我这样还走在这条路上又遇到问题没法求救的兄弟们一点点小帮助 先说明我的环境:mips2 au1200 4MBnorflash 64MBnandflash 128MB ram bootload为yamon存在于norflash上。 1,打包。在我动手我过程中,我打包了如下文件: nk.exe coredll.dll filesys.exe fatfsd.dll diskcache.dll fatutil.dll fsdmgr.dll mspart.dll ceddk.dll nandfmd.dll device.exe boot.hv (对比了一下经置顶贴子里多了一个device.exe,原因后面我会有分析的)。 关于怎么打包我看到有人问了这个问题。。。其实很简单。就是把bib文件里的其他部分注释掉。只留上面那几个就行了。 2,HIVE 注册表。 要搞清楚这个东西前先应该去看看HIVE+binfs那篇文章。文章的前面说明了CE系统的启动顺序。搞清楚了后对HIVE注册的配置有很大帮助。bootloader加载的第一个我们看得到的程序是nk.exe.nk.exe会加载filesys.exe. filesys.exe的运行需要指定很多参数,而这些参数就是存储在注册表里的。filesys.exe会根据注册表里的参数去决定它的下一步动作。 其实要实现这个不难。要去认真看一下pb的手册。它很清楚了说明了两件事:a,必须加入HIVE based regiters这个组件到OS . b,必须了解以下东西,并且实现它: HIVE BOOT SECTION ;END HIVE BOOT SECTION 这两个符号之间的内容在最后会被生成为 boot.hv而存在于nk.bin里面,也就是说它是XIP的一部分(见上面打包的内容)。“内核”在启动时不会去存储介质里面找它。而直接从镜像里找它了。它给内核启动定义了一系列的参数。以下以我的注册表作说明 1).[HKEY_LOCAL_MACHINE\init\BootVars] "SYSTEMHIVE"="Documents and Settings\\system.hv" "PROFILEDIR"="Documents and Settings" "Flags"=dword:1 "RegistryFlags"=dword:1 SYSTEMHIVE--------指定存储在存储介质上的非boot.hv部分的注册表的路径 Flags: filesys.exe运行后,会来读取这个参数,这个参数指定了filesys下一步干什么。 1, 加载存储管理器 2,加载设备管理器 我这里是用的1,如果是3的话表示两者都可以(但我不知道它们之间的优先级是怎么确定的,比如说两者的加载前提都存在的情况下,会先加载什么呢?请高人回答) 2)上面第1步是关键指定加载方式后,filesys就会去加载了。我这里指定的是存储管理,所以我接下来必须给出存储管理的参数 [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv] "DriverPath"="Drivers\\BuiltIn\\NAND_Flash" "LoadFlags"=dword:1 ;"MountFlags"=dword:4 "BootPhase"=dword:0 "Flags"=dword:1000 上面就是给出的参数了。其他参数不说了。 "DriverPath"="Drivers\\BuiltIn\\NAND_Flash"这一条就是告诉存储管理,指定的存储介质的驱动(我的是一块nandflash,如果你是其他的介质这里就应该指定其他的路径)的路径。这个路径会在下面的注册表中声明。 3)上面第二步存储管理已经知道了接下来要加载一个驱动的路径了。所以应该给出这个存储设备的驱动参数 [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND_Flash] "Prefix"="DSK" "Dll"="NANDFMD.dll" "Order"=dword:0 "Index"=dword:2 "Ioctl"=dword:4 "Profile"="FlashDisk" "BmlVolumeId"=dword:0 "BmlPartitionId"=dword:8 "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}" "FriendlyName"="NAND FLASH Driver" 其中BmlVolumeld和BmlPartitionId这两个参数不晓得作什么用的。我也是从别人那儿抄过来的。其他参数不作说明了。搞过驱动的应该很明白。 4)现在,驱动应该要加载了。上面的驱动参数里指定了profile为flashdisk,所以我们也要把这个参数给出它的详细内容来。 [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk] "DefaultFileSystem"="FATFS" "PartitionDriver"="mspart.dll" "AutoMount"=dword:1 "AutoPart"=dword:1 "AutoFormat"=dword:1 "MountAsBootable"=dword:1 " Name"="NAND FLASH" "Folder"="NandFlash" "Ioctl"=dword:4 ; "MountFlags"=dword:6 "MountAsRoot"=dword:1 "BootPhase"=dword:0 "Flags"=dword:1000 [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk\FATFS] ;"MountFlags"=dword:6 "EnableCache"=dword:0 "MountBootable"=dword:1 "MountAsRoot"=dword:1 "MountAsBootable"=dword:1 好现在参数都指定完了。以上就为我的注册部分的内容。关于个参数具体 是什么意思其实不用满世界google或baidu了,PB的手册里都有详细说明。我把它们贴出来只要是想说一下这个过程中到底CE它都做了什么又是怎么做的。希望我讲得还比较清楚。。。 3.文件系统。置顶里的主要做法是:把OS镜像放进nandflash的分区上:利用multi bin方法可以把没有包进内核的部分打包成一个bin文件(怎么个搞法那两个帖子里已经写得很清楚了)。然后通过eboot或其他工具烧到nandflash 的这个分区上。但是我这样做没成功。主要是我的eboot是自己做的。。。搞了N久也没把烧到flash这个功能做好。我尝试了另外一种做法。虽然是成功了。但结果还是不太尽人意。我把它铁出来。希望能得到高手的指点,这也是我发这个贴子的主要目的(好像比较废话多多 - -!!!) 我把我的nand flash划了一个整的fat分区。然后编译了一个完整的nk.bin把它下载到内存然后运行。而把nand flash作为一个目录挂载到该系统。然后通过网络访问到PC机上。把没有包进内核的文件一一拷贝上去,当然要依照CE的文件系统结构,那些目录什么的也要手动建立(这个办法相当笨。。。不过我不用考虑生产效率。。。第一块片子出来了以后直接拿片子来复制就好了。我还尝试过从已经启动的那个系统的RAM文件系统上把东西拷贝到nandflash上去,不过好像不行。。。) 上面那步完成后。再生成一个我所说的那个只包含了几个基本文件的小内核。下载到内存,(测试时只下到了内存,考虑到将来做产品,会把它存到norflash,至于为什么不用eboot.前面说了我比较笨。到今为止还没在eboot下把数据从内存拷贝到flash这一功能实现。。。。) 前面第2大步已经把参数指定为把nandflash作为根文件系统挂载。也就是说当filesys把flash驱动加载完并作为根文件系统挂载后filesys会根据默认规则去加载device.exe,然后由device.exe来加载剩下的驱动(具体加载什么驱动都是由注册表里保存的参数来指定的)。 但是我实际动手时,在加载为根文件系统后老是停在加载user.hv这块。。然后filesys.exe出错。系统挂死了。从debug信息来看应该是根文件系统没有正确挂载。研究了一把手册发现原来需要去掉 ram/rom file system组件,加入rom-only file system组件才行。于是加入re sysgen,这里我专门对比了一把之前的filesys.exe和现在生成的filesys.exe在大小上有改变。看来这个基本的文件系统是在这个filesys.exe里面了。启动后。发现果然多打印了很多东西。并且报告说nand flash已经作为一个根文件系统挂载上来了。到了这一步。我以为已经成功了。但是在device加载驱动的阶段还是不断的报错。。。最后在加载lcd驱动时系统又挂死了。这个问题让我一直郁闷了一个周末。。。后来我无意中把device.exe加入了内核进行编译,发现系统起来了。。。。这个问题真的很奇怪。。。我的nandflash上的那个作为根挂载的文件系统上是有这个device.exe的。按理说,当flash作为根文件系统挂上后。filesys.exe会找到它并且把运行权交给它的。不管怎样系统已经运行起来了。 关于结果:真的很不理想。启动速度是比较快。我后来又尝试把系统到桌面这一过程中需要用到的其他dll文件放入bin里面。启动基本上可以在5S多点。但是运行速度就非常的不理想。启动到桌面后。我打开 “我的设备”去浏览文件。。。非常慢。打开windows那个目录基本上要等上五分钟才浏览得出来! 另外我的控制面板起不起来。。。看不到内存占用量。。。也不知道是怎么回事。 最后,,,写得比较差。。我觉得写这篇文章还是比较献丑的。。。只是希望抛砖引玉,把这方面的牛人引出来帮我解释一下为什么运行会这么慢得原因,顺便让更多的人来学习一下。 |
|
|
沙发#
发布于:2007-10-29 16:27
传说中的牛人就是这么炼出来的
|
|
|
板凳#
发布于:2007-10-29 16:33
启动到桌面后。我打开 “我的设备”去浏览文件。。。非常慢。打开windows那个目录基本上要等上五分钟才浏览得出来!
----------------------------------------------------------------------- 我倒是没遇到这问题 |
|
地板#
发布于:2007-10-29 16:57
![]() |
|
地下室#
发布于:2007-10-29 16:58
楼上你与我的做法有什么区别呢?我刚刚debug了一把。发现。打开目录的时候在不停的打印这样的消息:
0x860739e8: FATFS!FAT_FindFirstFileW(0x00000000,\Windows\*.ac3) returned 0xffffffff "" (18) 0x860739e8: FATFS!FAT_FindFirstFileW(0x00000000,\Windows\*.ac3) returned 0xffffffff "" (18) 0x860739e8: FATFS!FAT_GetFileAttributesW(\Windows\kbdmouse.dll) returned 0xffffffff (2) 0x860739e8: FATFS!FAT_GetFileAttributesW(\Windows\kbdmouse.dll) returned 0xffffffff (2) 整整打印了好几版。当程序一运行起来后。。这个程序之后的运行又变得相当快速了。。是不是和flash的读写有关?但是当我把nandflash作为一个目录挂到CE上时。往它上面考东西与浏览它里面的东西又非常的快速。。。 召唤达人出来指点一下。 |
|
|
5楼#
发布于:2007-10-30 09:06
1).[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="Documents and Settings\\system.hv" "PROFILEDIR"="Documents and Settings" "Flags"=dword:1 "RegistryFlags"=dword:1 SYSTEMHIVE--------指定存储在存储介质上的非boot.hv部分的注册表的路径 Flags: filesys.exe运行后,会来读取这个参数,这个参数指定了filesys下一步干什么。 1, 加载存储管理器 2,加载设备管理器 我这里是用的1,如果是3的话表示两者都可以(但我不知道它们之间的优先级是怎么确定的,比如说两者的加载前提都存在的情况下,会先加载什么呢?请高人回答) 问题第一点,尝试采用3,两者都运行。 看你打印的信息来分析,OS并没有发现相应的组件,但是注册表里却存在,可以尝试将这部分优化下。 |
|
6楼#
发布于:2007-10-30 14:21
你这样做法就不叫MULTI BIN了,你也不用配置XIP了,支持MULTI BIN是要用到BINFS分区,然后把它shadow到/windows目录下,而这个需要用到ram and rom filesystem,但你是把nandflash作为根目录加载,这要求必须是rom only filesystem,根本是两个不一样的概念了,我很早就利用这种方法来节约内存了,在置顶的帖子可以看到我的留言,只是觉得这么作太繁琐了。而这个最小系统启动精简子集是跟XIP里的不一样的,我当时做的时候是包含这些文件:
kern.exe coredll.dll filesys.exe device.exe devmgr.dll regenum.dll busenum.dll fatfsd.dll diskcache.dll fatutil.dll binfs.dll fsdmgr.dll mspart.dll ceddk.dll smflash.dll wince.nls initobj.dat boot.hv default.hv user.hv 我觉得你要做成真正的MULTI BIN的话,需要在nandflash做两个分区,一个BINFS,一个FAT,不是把nandflash作为根目录加载,XIP.BIN和XIPKERNEL.BIN通过EBOOT烧写到nandflash的BINFS分区,你的NOR FLASH只放EBOOT程序,当然也可以考虑把XIPKERNEL.BIN烧写到NOR FLASH,但是完整的XIP.BIN烧写到nandflash的BINFS分区,这样系统能加载这个BINFS分区就能正常启动了,这样也就真正实现了MULTI BIN XIP了。 |
|
7楼#
发布于:2007-10-30 14:33
哈哈 。。。终于把N人召来了!原来我对multi bin理解错了。汗颜ing~~~~~~
谢谢高手提点。 我想把我目前的搞法搞完先~不知道有没有哪位兄弟能提示我一下,为什么我运行程序会这和慢呢? |
|
|