加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Multibin 实现遇到的两个问题

发布时间:2020-12-15 18:41:36 所属栏目:百科 来源:网络整理
导读:原文地址: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下的

原文地址: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.dll,?Binfs.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,51); font-family:Arial; font-size:14px; line-height:25px; margin-top:5pt; text-align:justify"> 关于第二个错误:

问题出在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://www.voidcn.com/article/p-nsmqrmmo-bhr.html

我的理解是在加载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,?PART_OPEN_ALWAYS)?==?INVALID_HANDLE_VALUE)

??????SpinForever();

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读