系统中使用64MB的NAND,512Byte 小页模式。前20个block保留给EBOOT。MBR在第21个block。后边的28M格式化成BINFS用来保存NK镜像。把之后的剩余空间格式化成PART_EXT(也试过DOS32)用作存储空间。参考了eeworld上的相关讨论之后,已经可以在文件浏览器中看到FAT分区。
但是在系统第一次启动格式化FAT分区后,重启后系统就无法再启动了。调试发现除了保留的前20个block外所有的block都被格式化了,这样OS也被干掉了。只有把前28M(包括OS)都设为保留区,系统才可以正常使用。感觉这样的话EBOOT中建立的分区就没有用了。
问题:
怎样让OS启动时候去读取EBOOT建立的MBR中的分区信息,然后使用正确的FAT分区呢?这样的话格式化就应该不会影响到OS了。
谢谢!
我的注册表如下:
; HIVE BOOT SECTION ;
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
"Flags"=dword:0 ;5.0下决定在哪个阶段启动device.exe的表项
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default"
; 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"="Dm644xNand.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
这是flash驱动问题,你只要把NK占用的部分标记为保留的block即可。
这个可以在eboot中实现。
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] ...\r\n"), 0, IMAGE_START_BLOCK-1));
for (i = 0; i < IMAGE_START_SECTOR; i++) {
FMD_WriteSector(i, NULL, &si, 1);
}
OALMSG(TRUE, (TEXT("...reserve complete.\r\n")));
IMAGE_START_SECTOR这个东西你改成(NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)的大小即可。
也可以在flash驱动中检测状态(坏块)的函数把NK占用的block标记为坏块或者保留块即可。
谢谢googleman,我现在就是在FLASH驱动里把NK,bootloader, MBR所占用的BLOCK都标为保留块。
我想确定是不是EBOOT里所做的分区就没有用了?因为感觉OS没有读MBR的分区信息。
另外在这种情况下(标为保留块),如果我需要建立两个FAT分区,应该怎么做呢?
gooogleman 你还蛮快的啊
LZ的注册表好多东西啊,有关键值设置,好好查一下msdn,每个人出现的问题都不会完全相同的
引用: 引用 3 楼 andbf 的回复:
谢谢googleman,我现在就是在FLASH驱动里把NK,bootloader, MBR所占用的BLOCK都标为保留块。
我想确定是不是EBOOT里所做的分区就没有用了?因为感觉OS没有读MBR的分区信息。
另外在这种情况下(标为保留块),如果我需要建立两个FAT分区,应该怎么做呢?
不过有点奇怪,你的注册表并没有设置自动格式化 分区
不像我说的问题。
第一次起来,第二次起不来。?
我觉得像是你没有烧写nboot。
你下载的是到内存吧,第一次起来了,然后第二次(断电之后)你还是起不来。?
是这样吗?如果是,那么看看是不是烧写完整了。
对不起,贴错了注册表,贴了一个正在实验的。下边这个才是我上边说的情况所用的注册表。
第二次起不来,是在OS的block没有标记为保留块的情况下。如果标记为保留块就可以起来了。请问需要把MBR也标记为保留块吗?还是没有关系?
; HIVE BOOT SECTION ;
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default"
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDisk]
"DriverPath"="Drivers\\BuiltIn\\FlashDisk"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:00000000
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDisk]
"Prefix"="DSK"
"Dll"="Dm644xNand"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDisk"
"FriendlyName"="Freescale NAND Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000
; "Index"=dword:1
"FSD"="FATFS.DLL"
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk]
"DefaultFileSystem"="FATFS"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:2
"Folder"="NAND Flash"
"Name"="NAND FLASH"
"AutoFormat"=dword:1
"BootPhase"=dword:0
"Flags"=dword:1000
"FileSystem"="fatfsd.dll"
"PartitionDriver"="mspart.dll"
引用: 引用 6 楼 andbf 的回复:
对不起,贴错了注册表,贴了一个正在实验的。下边这个才是我上边说的情况所用的注册表。
第二次起不来,是在OS的block没有标记为保留块的情况下。如果标记为保留块就可以起来了。请问需要把MBR也标记为保留块吗?还是没有关系?
要,其实MBR一般在开始的地方,所以eboot都具备这个功能。
起来了就结贴,给分!!哈哈。
呵呵。好, 给分给分。
最后请教一个问题:OS起来后会去读MBR吗?如果会,为什么还会把OS给earse掉了?
我指如果OS不标为保留块的情况下。是因为MBR里没有分区的起始,结束地址吗?
引用: 引用 9 楼 andbf 的回复:
我指如果OS不标为保留块的情况下。是因为MBR里没有分区的起始,结束地址吗?
要,其实MBR一般在开始的地方,所以eboot都具备这个功能。
起来了就结贴,给分!!哈哈。
噢噢,我说错了,这个MBR是在FAT区的。所以它是没有被标记的。
系统启动是要读取他的。这个你要看看代码。
刚才我一时兴趣,说错答案了,收回。
所以似乎我的MBR位置不对。我的是MBR-》BINFS-》FAT。刚才看了一下NAND的spare区,逻辑扇区0位于MBR所在的sector。是不是我应该把MBR挪到BINFS后边,这样子BINFS就不分配逻辑号,也就不会被操作到?
把 NK 存放区域设置成保护块, 或者在 FMD_GetBlockInfo 中直接把 NK 区域返回为 BAD_BLOCK
谢谢大家!我差不多明白了,NK要保护起来,但是MBR不应该保护起来。我之前把MBR也给保护起来了。