原本早就要发出来了,但是看到king_sundi网友已经发过一个帖子了,所以犹豫了没有发,相对而言,我这个总结更具有实用性,基本上照着这个步骤来就能成功,我给我几个朋友试过了,他们一开始对这个基本不懂都能搞定。
XIP实现总结.
step1:修改config.bib文件.内核子集XIPKERNEL的SIZE根据你自己编译出来的XIPKERNEL.BIN实际大小调整,
XIPKERNEL BASE=8C200000,XIPKERNEL SIZE = 0013F000 内存类型是RAMIMAGE
CHAIN BASE = XIPKERNEL BASE + XIPKERNEL SIZE; CHAIN SIZE = 00001000 内存类型是RESERVED
NK BASE = CHAIN BASE + CHAIN SIZE;NK SIZE根据你平台定制的实际NK.BIN的大小调整, 内存类型是 NANDIMAGE
RAM BASE = NK BASE + NK SIZE; RAM SIZE = 90000000 - RAM BASE, 内存类型是 RAM.
pdwXIPLoc 是一个指定地址的全局变量,用于InitRomChain(),它的地址必须等于CHAIN BASE.
XIPSCHAIN=8C33F000 也必须等于CHAIN BASE.
关于BIB文件中的MEMORY部分的定义可以从帮助文档中找到答案,搜索MEMORY Section
Name Address Size Type
内存区域名字 起始地址 区域空间 内存类型
内存类型的取值分别有FIXUPVAR,NANDIMAGE,RAM,RAMIMAGE,RESERVED.
大家可以特别注意看一下NANDIMAGE的解释
Specifies that RAM should overlap these regions when building an run-time image that uses BINFS.
The overlapping regions are stored in NAND but are fixed up to virtually appear as though they do not overlap.
When the kernel accesses these regions, BINFS responds by intercepting the request. BINFS accesses NAND and returns the proper data to the kernel.
This enables a device with NAND to execute in place out of NAND, freeing up RAM for use by the system.
Romimage generates one binary (.bin) file for each NANDIMAGE entry.
NANDIMAGE sections must be page aligned.
MEMORY
XIPKERNEL 8C200000 0013F000 RAMIMAGE
CHAIN 8C33F000 00001000 RESERVED
NK 8C340000 00D00000 NANDIMAGE
RAM 8D040000 02FC0000 RAM
; RAM 8C340000 03CC0000 RAM
pdwXIPLoc 00000000 8C33F000 FIXUPVAR
; FLASH 92000000 00100000 RESERVED
; Common RAM areas
AUD_DMA 8c002000 00000800 RESERVED
SDIO_DMA 8c010000 00010000 RESERVED
ARGS 8C020800 00000800 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
IR_DMA 8c026000 00002000 RESERVED
; EDBG 8c030000 00020000 RESERVED
; CAMERA 8c050000 000A0000 RESERVED
DISPLAY 8c100000 00100000 RESERVED
;
; ROMFLAGS is a bitmask of options for the kernel
; ROMFLAGS 0x0001 Disallow Paging
; ROMFLAGS 0x0002 Not all KMode
; ROMFLAGS 0x0010 Trust Module only
;
CONFIG
AUTOSIZE=ON
; ROM_AUTOSIZE=ON
DLLADDR_AUTOSIZE=ON
COMPRESSION=ON
KERNELFIXUPS=ON
XIPSCHAIN=8C33F000
PROFILE=OFF
ROMFLAGS=00
ROMSTART=8C200000
ROMWIDTH=32
ROMSIZE=00D00000
【注】PB能生成XIP.BIN,这项一定要定义XIPSCHAIN=8C33F000,不然生成不了XIP.BIN的。
step2:
注册表的修改,platform.reg
; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Support BINFS Section
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Add BinFS to partition table
[HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable]
"21"="BINFS"
[HKEY_LOCAL_MACHINE/System/StorageManager/BINFS]
"Folder"="BINFS"
"FriendlyName"="Bin FileSystem"
"Dll"="binfs.dll"
"Paging"=dword:1
; MountFlags:
; 0x10 specifies that this file system is to be mounted as an external
; ROM filesystem shadowing the /windows directory
; 0x1 specifies that the mountpoint /BINFS is to be hidden
;
"MountFlags"=dword:10
"BootPhase"=dword:0
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/MSFlash]
"DriverPath"="Drivers//BuiltIn//MSFlash"
; LoadFlags 0x01 == load synchronously
"LoadFlags"=dword:1
"Order"=dword:0
; "MountFlags"=dword:10
"BootPhase"=dword:0
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/MSFlash]
"Prefix"="DSK"
"Order"=dword:0
"Dll"="smflash.dll"
"Profile"="MSFlash"
; "MountFlags"=dword:10
"FriendlyName"="MSFLASH Driver"
"BootPhase"=dword:0
"Flags"=dword:1000
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MSFlash]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"Folder"="NandFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000
"MountAsHidden"=dword:1
"MountAsRom"=dword:1
; "MountFlags"=dword:00000004
; "MountHidden"=dword:00000000
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MSFlash/FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00280014
"Paging"=dword:1
"CacheSize"=dword:0
"EnableCacheWarm"=dword:0
"EnableCache"=dword:1
"MountAsBootable"=dword:1
"MountAsRom"=dword:1
; "MountAsRoot"=dword:1
; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION
step3:
系统选用的文件系统必须是RAM and ROM Filesystem,不能用ROM Only.
step4:
要知道内核子集XIPKERNEL.BIN必须包含的modules和Files是那些,根据我的实践得出,下面这些文件是必需的:
"nk.exe",
"coredll.dll",
"filesys.exe",
"fatfsd.dll",
"diskcache.dll",
"fatutil.dll",
"binfs.dll",
"fsdmgr.dll",
"mspart.dll",
"smflash.dll",
"boot.hv",
其它的可选.
step5:
使用preromimage.bat和processbib.exe程序,把它们拷贝到你的PLATFORM/SMDK2440/FILES/目录下.
到此改动就算结束了,下面就是开始Build and Sysgen.
生成了XIP.BIN之后烧写到NAND FLASH上,需要你的BOOT支持分区,在烧写的时候自动创建BINFS分区和FAT分区,如果不幸的你用的不是EBOOT的话又不能创建BINFS和FAT分区的话就麻烦大了.
系统起来之后可以看到有个BINFS目录和一个NandFlash目录.
step6:
最后一步,修改一下ce.bib的
XIPKERNEL 8C200000 0013F000 RAMIMAGE
CHAIN 8C33F000 00001000 RESERVED
NK 8C340000 00D00000 NANDIMAGE
; RAM 8D040000 02FC0000 RAM
RAM 8C340000 03CC0000 RAM
使RAM的起始地址等于NK的起始地址,这里就是放大了RAM的空间,用命令行方式romimage ce.bib,生成XIPKERNEL.BIN的文件烧到NAND FLASH中去就可以了,有人有问题了发现XIPKERNEL.BIN太小烧不进去,在OEMVerifyMemory()判断里把它判断成了IMAGE_TYPE_RAMIMAGE,所以不写到FLASH了.把这段代码注释掉就好了.
/* comment for fix if the image too small and locate in range,then the image type will change to ram image and cause the image can not write to flash.
// Is it a ram image?
else if ((dwStartAddr >= ROM_RAMIMAGE_START) &&
((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE)))
{
// RETAILMSG(1, (TEXT("Downloading RAM image/r/n")));
g_ImageType = IMAGE_TYPE_RAMIMAGE;
return TRUE;
}
*/
好了,完成,你的程序内存将会是61774K左右.
有疑问吗?我没有提到InitRomChain()函数,实践证明,你不写这个函数,不在OEMInit()里调用它也没有问题.让人感觉是多此一举.
zhengshijie你好!我有一个问题:
你说把XIPKERNEL.BIN的文件烧到NAND FLASH中去就可以了,那NK.bin不用烧了吗?
还有我以前的eboot是用来烧写NK.bin的,每次启动的时候是将整个NK.bin都搬到ram中去,那现在该如何处理呢?希望您不吝指教
==================================================================
烧的时候改烧XIP.NB0
至于nboot 则把copy的长度直接改为 比你的 XIPKERNEL.BIN略大即可
例如1.5M 或 2M
==================================================================
我想问一下,第六步可不可以省掉呢?
为什么第五步SYSGEN的时候不把RAM的起始地址等于NK的起始地址,
为什么不可直接就用之前已经编译出来个XIP.NK和XIPKERNEL.BIN。还要烧两次的话不是以前升级也不方便了。
==================================================================
您是说烧xip.nb0,那烧了以后eboot会自动识别出xipkernal的大小并将它copy到ram中去,还是要改我的eboot,让它只拷贝比xipkernal大一点的内容到ram?
==================================================================
to zhengshijie
请教一下,你下载时用xip.bin吧?
当上电启动时,需要将OS拷贝到内存中,是整个拷贝还是只是XIPKERNEL.BIN,那么怎么确定XIPKERNEL.BIN实际的长度?
==================================================================
to heyong_401:
注意当你做XIP的时候,XIP.BIN才是完整的image,而这时候的NK.BIN只是其中的一部分,还有分两步实现,第5,第6步骤看仔细了。当你利用EBOOT烧写,EBOOT启动,它会自动在第六步烧写的时候把块数调整到XIPKERNEL.BIN的空间大小。这样启动的时候只会启动XIPKERNEL.BIN部分。
to wenzai:
注意第5步,第6步,第5步烧写XIP.BIN,第6步重新烧写XIPKERNEL.BIN部分,这一步来确定XIPKERNEL.BIN的大小,利用EBOOT的BLOCK对齐原则,无需像harktrip提到的指定比你的 XIPKERNEL.BIN略大即可
例如1.5M 或 2M。
to shuiii:
第六步是有点重复了,如果不要第六步,在第五步直接改ce.bib让RAM和NK的起始地址重叠,这样系统是起不来的,第五步让系统跑起来是基础,在此基础上通过第六步实现节省内存,加速启动。有一种变通的方法,你还是烧写第五步生成XIP.BIN,需要你在oal/init.c中实现一个扩展内存的函数,把NK部分的内存抠出来,只是这样你启动的时候将会拷贝整个XIP.BIN到内存,当然你可以指定BOOT只拷贝XIPKERNEL.BIN稍大的部分到内存应该也是可以的。
==================================================================
再问,zhengshijie大侠 :
我在EBOOT里面给NAND分区,128M,一共1024个BLOCK,每个BLOCK是128K,第一个区分BOOT区,占3个BLOCK,第二个区是BINFS区,占240个BLOCK,第三个是FATFS区,占剩下的空间。
首先。这样分合理吗?
CE是什么时候去读NAND的MBR加载分区的???
有没有什么工具可以读到NAND的MBR?不然怎么确定分区正确了呢?
==================================================================
to shuiii:
你用的是K9F1G08的NAND FLASH,我也用过,前面给BOOT的都是RESERVE块,第一个BLOCK是给NBOOT,第二个BLOCK是给TOC,第三个BLOCK给EBOOT,前面3个BLOCK在烧写完之后都要置成坏块,低格FLASH,下载XIP.BIN烧写,烧写的时候创建了BINFS分区,再创建FAT分区,CE启动后,filesys.exe根据注册表来mount文件系统时会找到MBR块,读出里面的分区信息,来加载。我不知道有没有现成的工具,你可以自己在EBOOT把MBR块的512个字节打印出来分析。
==================================================================
呵,没错,正是K9F1G08。
不过新问题又来了。
为什么前面3个BLOCK在烧写完之后都要置成坏块呢???
而为了让烧片器能够正常烧写,又要去掉坏块标识。
这样子的话不是不能批量生产了。
// setup our metadata so filesys won't stomp us
si.dwReserved1 = 0;
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock = 0xFF;
si.wReserved2 = 0;
==================================================================
to shuiii:
看来你对EBOOT的代码没有研究过,问这么多为什么还不如自己老老实实看代码,把你认为有疑问的地方改掉自己实验好了,实践出真知,有些问题因为你看不到CE启动的源码,不知道它是怎么找MBR记录的。
还有你总是以批量生产来提出疑问,每个产家有自己的解决方法,在这里我只能提供实验学习方法,不能做出最终产品的样子。
我不知道你说的烧片器是什么东西,我使用的是简易JTAG,利用SJF2440程序烧写NBOOT,它不管置不置坏块,总能烧写,而且只需要烧写一次,其它的利用NBOOT启动下载烧写EBOOT,利用EBOOT烧写XIP.BIN等,NBOOT具备升级EBOOT的功能,而EBOOT则具备升级CE系统和本身以及NBOOT等,你可以做EBOOT从SD卡升级所有的东西,这样只要把需要升级的相关文件放到SD卡上,每块板子一插SD卡就可以了。
正在研究中......,这样做的初衷是希望内存大(特别是跑大程序特别需要内存时),启动快。我找到了一些思路相关的讨论(来自驱动开发网)共享给大家一起看看:
这个确实可以做到,我尝试了一种做法,在生成NK.BIN的时候,只打包必须的内核部分,大概可以最小可以裁减到2M以内,然后需要把NANDFLASH作为根目录挂载,其它的程序,DLL等放到/windows目录里,而这个/windows目录是在FLASH上的,可以永久保存的,所以BOOT不到2M的NK内核,内核在加载完FLASH驱动之后,就可以直接从FLASH上的/windows目录启动剩下的应用程序和动态库了。这种做法是把剩余的应用程序和动态库拷到FLASH上的/windows目录是个问题,我测试是这样作的,先烧一个完整的NK,启动之后手动拷贝所有的应用和DLL,然后重烧一个精简的NK,这样就达到目的了,只是可生产性不好,应该会有更好的方法。
这样扣掉EBOOT和LCD FRAME的2M空间和内核的2M空间,可用于程序运行的内存是60M,实际上我在一台远峰的GPS上看到,它的程序内存是61M,又更进步了。
--------------------------------------------------------------
想使用多个BIN文件,来减少对RAM空间的占有:
当CONFIG文件
pdwXIPLoc 00000000 803FF000 FIXUPVAR
XIPKERNEL 80200000 001FF000 RAMIMAGE
CHAIN 803FF000 00001000 RESERVED
NK 80400000 01E00000 NANDIMAGE
RAM 80400000 07C00000 RAM
FLASH 92000000 00100000 RESERVED
注意:此时NK和RAM区域是有重叠的,其中XIPKERNEL是想用于COPY到RAM区域的模块,NK是是保存在FLASH区域,当用时才COPY到RAM区域的。此时能正常的编译出多个BIN,但是加载时,InitRomChain函数里面出现Invalid XIP found的错误,不知道是什么原因导致的!
然而当我CONFIG为:
pdwXIPLoc 00000000 803FF000 FIXUPVAR
XIPKERNEL 80200000 001FF000 RAMIMAGE
CHAIN 803FF000 00001000 RESERVED
NK 80400000 01E00000 NANDIMAGE
RAM 82200000 07C00000 RAM
FLASH 92000000 00100000 RESERVED
这个时候又能正常的启动!
期待高人指点
-----------------------------------------------------------
楼上的...
所以..你想把80400000-82200000这段30M的空间也挤出来吧?
我也在研究中...
不过有点想不明白,把NK做成XIPKERNEL.nb0(内核部分)跟nk.nb0(其它镜像)
我eboot首先把XIPKERNEL.nb0拷到内存去运行,运行完了呢?怎么去加载第二部分的nk.nb0文件呢?还是要把第二部分NK.NB0拷到内存去吗?这样不是又要占用拷贝时间?
你NK.NB0部分跟RAM部分区载还有重叠吧?
-----------------------------------------------------------
BinFS.dll总不能加载,为何呢?
应该保证BINFS在系统从default.hv和user.hv读取注册表前就可用,所以你要保证你的boot.hv,BINFS,FMD驱动到RAMIMAGE的region里面而不是NANDIMAGE!所以对BINFS和SMFLASH的驱动的注册表的值也应该在:
;HIVE BOOT SECTION
;END HIVE BOOT SECTION
这个设置你可以参考网站上很多资料。
-----------------------------------------------------------
楼上的兄弟,我现在研究的就是看到桌面前,到底做了哪些驱动INIT…
目前只确定s3c2440disp.dll 是一定要含在里面的
触控的也要含在内会比较恰当
enthernet(cs8900,dm9000) 当然就到桌面之后才init
另外FMD_INIT_DONE之后不知做啥了…也做太久了..至少停顿1秒
至于xipkernel变大..只要在3MB以内,都是我可接受的范围内
xipkernel的大小,我是放弃了,因为拼命搞到1MB吧,可是开机时间多了2-3秒,这不划算~~
-----------------------------------------------------------
After finished the boot.hv boot phase and binfs is available, the WinCE OS will read the system hv Registry from XIPKERNEL or NK region, but before continue, you must load the FAT partition that will hold the system.hv first. So we must mention which disk partion will hold the system hive file and add all the relatived Registry entries into the boot.hv. The WinCE OS will parse the system hv and continue its boot up progress after the relatived FAT parttiion is available.
The boot sequence is like this:
BootLoader --> OEMinit --> Load boot.hv --> Init binfs --> Load default.hv from binfs --> Load device.exe from binfs --> device.exe load other drivers in default.hv --> Load user.hv --> Load explorer.exe
-----------------------------------------------------------
希望这个对你有帮助。
文章一:
http://kingsundi.bokee.com/viewdiary.16138354.html
文章二:
http://kingsundi.bokee.com/viewdiary.17125594.html
文章三:
http://kingsundi.bokee.com/viewdiary.16138382.html
------------------------------------------------------------
关于XIPKERNEL必须包含的模块我前面有个回复已经提到了,你首先确保那些模块在XIPKERNEL里,还有就是生成XIP.BIN时,如果在ce.bib文件中模块同时存在XIPKERNEL和NK中会被skipped掉,注意看你生成的XIPKERNEL是否正常.对于MODULES下的你要确定包含在XIPKERNEL中的模块就不要在打包进NK里了.还有就是文件系统如果你原来是ROM ONLY的话,要改成RAM and ROM文件系统,注意你的BINFS分区能MOUNT上,要看你的注册表是怎么写的,要实现一个InitRomChain()函数把几个XIPKERNEL,NK,CHAIN连接起来的函数,它在OEMInit()中调用一下.
------------------------------------------------------------
最新进展,总的可用于程序运行的内存达到63424K,61.9375M,内核子集大小是1.21M,最新实践发现我之前发出的XIPKERNEL必须包含的模块和文件中,其中有俩个文件不是必须包含在内核子集中,它们是default.hv,user.hv.所以系统裁减的好,内核子集有可能进入1M大关.
------------------------------------------------------------
不是英文内核,是中文简体和英文,这个控制面板是我自己修改过的,所以是英文的.没有什么组件,有个完整版的IE,内核总大小是20M左右,我的中文字体用了压缩字体文件,所以汉字库实际上只有1.9M,我知道大家可能用的是非压缩的,那个有10M左右了.网卡驱动我去掉了,PC卡驱动我去掉了,其它的都有.
------------------------------------------------------------
中文简体的压缩字体是1.9M,但是繁体的压缩的不多,最小的是MingLiU & PMingLiU (Subset 2_70) 3.1M,中文简体的选择SimSun & NSimSun (Subset 2_50),然后这个组件要加上Agfa AC3 Font Compression,中文简体的还要加上这个组件GB18030 Data Converter,繁体的我没有测试过,简体中文的从启动上来看,没有什么影响,没有测试过大篇幅中文文档情况怎么样.我想影响不大,因为屏幕的大小是有限的,实际显示最多也就一屏的汉字,也没有多少.
继续丰富下这个内容,可惜最近还没有时间搞....
前几天问的关于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那个目录基本上要等上五分钟才浏览得出来! 另外我的控制面板起不起来。。。看不到内存占用量。。。也不知道是怎么回事。
最后,,,写得比较差。。我觉得写这篇文章还是比较献丑的。。。只是希望抛砖引玉,把这方面的牛人引出来帮我解释一下为什么运行会这么慢得原因,顺便让更多的人来学习一下。