Multibin 实现遇到的两个问题

原文地址:http://blog.csdn.net/enjoyalan/article/details/2565965

网上介绍这方面的文章很多:

这位前辈的blog整理得很全:

S3c2440A平台HIVE注册表+binfs的实现 

[转]Windows CE 5.0 mult-xip bin模式实现 

[转]MULTI BIN的wince 5.0,smdk2440下的实现

看高手们实现得那么轻轻松松,怎么到我这边就不行了,郁闷了一个多星期,总算搞定。主要遇到两个问题,也是论坛上问得比较多的:

1.“Data Abort: Thread=83c45000 Proc=8056ab50 'filesys.exe'”一连串的这个调试信息后就停掉了。

2.另一个是启动一半就停住了,出现“OEMIoControl: Unsupported Code 0x1010104 - device 0x0101 func 65”这个调试信息。

关于第一个错误:

从我实验的结果应该是kernel部分加的组件不够,帮助中有说明:

For a system that does not have a hive-based registry, the NK region files include Nk.exe, boot.hv, Kd.dll, Coredll.dll, Filesys.exe, Fsdmgr.dll, Mspart.dll, Ceddk.dllBinfs.dll, an FMD driver, Initobj.dat, Initdb.ini, and default.fdf.

For a system with a hive-based registry that resides on a FATFS partition, the NK region files must also include default.hv, device.exe, devmgr.dll, diskcache.dll, fatfsd.dll, fatutil.dll, pm.dll, relfsd.dll, and user.hv. For MUI, add wince.nls, and for the debugger, add hd.dll, osaxst0.dll, and osaxst1.dll.l, an FMD driver, Initobj.dat, Initdb.ini, and default.fdf.

关于第二个错误:

问题出在bootlooder的binfs和fat分区上,之前的前辈文章都没有涉及到具体如何实现,所以在这边迷茫很久,现在终于有解了!关于启动的过程,引用一位前辈的文章:

 我用的是uboot,它起来的时候就是将整个flash看成一个分区。而在系统起来的时候要去加载fatfs(下面是引用一位牛人的帖子):因为没有使用eboot(一般eboot中都有对flash进行分区),所以CE跑起来找不到MBR,找不到FAT分区的起始sector,所以它从头开始查找第一个非坏块,(如果没有被格式化)开始格式化,写入MBR,DBR,BPB。所以只要把存储NK.BIN的空间置成坏块就可以了。eboot只是写入了MBR,没有写DBR,和BPB等信息。编译fmd驱动的时候,会连接一个fal.lib库,而该库就是文件系统抽象层,看不到源码,我们可以看smflash.map知道它里面有那些函数,系统在起来的时候,filesys.exe会加载smflash.dll,调用DSK_Init()->FMD_Init(),会调FMD_GetInfo得到FLASH芯片信息,然后会去mount文件系统,首先从头开始找(nandflash驱动中的FMD_GetBlockStatus),第一个非坏块,因为我们知道我们的eboot,要把NK的存储空间保留成坏块,这样是防止系统运行起来的把它们给格式化了,第一个非坏块的第一个sector就是存储MBR的信息。这时如果设置了autoformat,就对其进行格式化,这样它里面有PARTENTRY的信息,得到这个再跟据注册表里的指定的mount文件系统,如果是FATFS,并且在FAT分区中没有找到有效的DBR,BPB信息sector之后,会调用fatutil.dll中的格式化功能进行格式化,这时才真正写入DBR,BPB等信息。

    文件系统的加载程序在private/winceos/coreos/storage/storemgr下。具体的mount是在store.cpp中的CStore::MountStore中实现。 

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/58094

我的理解是在加载binfs文件系统后需要加载fatfs分区,用以保存hive注册表,也就是需要这样一个分区存在才能正常启动系统,我的错误就在bootloader的时候没有创建fat分区。紧接着就是如何创建,代码很简单:

 if ( !BP_LowLevelFormat (BLOCK_START, BLOCK_NUM  , FORMAT_SKIP_BLOCK_CHECK ) )

{

      return FALSE;

}         

hPart = BP_OpenPartition( 1,SectorNum, PART_BINFS, TRUE, PART_OPEN_ALWAYS);

if (hPart == INVALID_HANDLE_VALUE)

{

       return FALSE;

}

//下面一步很重要,也就是创建FAT分区的,一直无法启动就是因为这个

if (BP_OpenPartition(NEXT_FREE_LOC, SectorNum, PART_DOS3_FAT, TRUE, PART_OPEN_ALWAYS) == INVALID_HANDLE_VALUE)

{

      SpinForever();

}

有了以上的创建分区,再加上正确的bib,reg设置,Multibin应该没有问题了吧!希望对大家有帮助!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值