关于nand分区的一点笔记

关于nand的分区日志。

1:开发简介
首先需要理解的是nand的分区操作是一个怎么样的过程。基本上具体的操作都用到了微软所写的规范库,在public下的文件目录下有源码可循。主要是以BP开头的函数。主要在bootpart.cpp这个文件中可以寻找到。对于一下的看发抖是我自己对于程序的理解,难免会有很多错误。希望能在以后能逐步的改正和理解。

2:开发的准备知识。
其实对于这项开发的知识涉及的范围很广。如果是什么都没有的话。单独来开发是一项非常困难的事情,其实最主要的工作还是移植。因为涉及的只是非常多。首先要熟悉的是nand驱动。其次是文件系统的相关知识。再其次是注册表的相关知识,最后就是关于MBR,和分区表的问题。每一块基本上都是一个很大的体系。如果没有相当的知识做铺垫这项工作真的是很难继续下去。至少我在对文件系统很注册表一无所知的情况下走了许多的弯路。
(1)关于文件系统和注册表的相关知识。
       文件系统与所有与文件相关的API都是由filesys.exe这个进程来管理的。这个模块实现了对象存储和存储管理器。filesys.exe由下列几个组建组成。rom文件系统,存储管理器,对象存储。
       对象存储就是内存堆。主要是正对RAM系统注册表,RAM文件系统的管理。
       存储管理器的功能。
       存储驱动程序。一般指的是存储设备的驱动程序。这是因为他们要提供对设备的随机存储访问。对于注册表中来说就是要加载设备驱动程序
       分区驱动程序。他们为单个设备的多个分区提供管理。对应注册表的是加载“mapart.dll”
       文件系统驱动程序。这个程序将设备上的数据组织成相应的文件。对应的注册表中的是加载“fatfsd.dll”
       文件系统筛选器。对于加密压缩的处理。对我现在来说没有什么用。
   (2)讨论系统加载的过程。
   系统启动的时候,NK.exe直接从ROM中来加载filesys.exe.然后filesys.exe从ROM默认的注册表来初始化注册表。然后filesys.exe读取注册表以便各一个用程序的启动。首先列在注册表中的第一个应用程序就是device.exe.设备管理器从 HKEY_LOCAL_MACHINE/Driver/BuiltIn 项加载驱动程序.正常情况下。任何磁盘设备都会被列入该项下。所以将加载块驱动程序,存储管理器会通知设备管理器来向系统注册。以便接受块设备驱动程序的加载和卸载的通知。然后存储管理器打开块设备驱动程序。并向他查询配置文件名称。每个块设备类型都有一个与之相关的配置文件。profile是一个注册表项。用于指定设备的分区驱动程序和默认的文件系统。存储管理器来读取相关的分区驱动程序信息。病适当的来加载他。这里主要说的是“mspart.dll”,这个DLL通过磁盘的主启动程序来读取磁盘的分区表信息来进行分区。一旦分区驱动程序加载。存储管理器将请求“mspart.dll”;来枚举磁盘上的分区。并一一表示各个分区的文件系统。分区驱动程序读取MBR中中记录的分区信息,并向存储管理器提供相关的信息。然后存储管理器通过这些信息来加载每个分区的文件系统。FSDMGR时存储管理器的一部分。负责向文件系统驱动程序提供服务。
   (3)贴出我的注册表项。。来分析我犯得诸多错误
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION

; Valid Bits for Flags registry value
; If no flags are set, the hive will be stored in the object store.
;
; 0x00000001 Start storage manager in boot phase 1 for hive-based registry
; 0x00000002 Start device manager in boot phase 1 for hive-based registry
; 0x00000004 Start storage manager in boot phase 1 for registry in
;             external ROM (such as BINFS)
; 0x00000008 Start device manager in boot phase 1 for registry in
;             external ROM (such as BINFS)
[HKEY_LOCAL_MACHINE/init/BootVars]
   "Flags"=dword:1
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE



; @CESYSGEN ENDIF CE_MODULES_NDIS
;
; NAND driver
;
; HIVE BOOT SECTION
IF BSP_NAND_FMD
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NAND_Flash]
"Dll"="nandfmd.dll"
"Order"=dword:0
"Prefix"="DSK"
"Ioctl"=dword:4
"Profile"="FlashDisk"
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"FriendlyName"="NAND FLASH Driver"
"BootPhase"=dword:0
; Override names in default profile
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk]
"Name"="NAND FLASH"
"Folder"="NAND Flash"
"AutoMount"=dword:1
"MountAsBootable"=dword:1
"AutoPart"=dword:1
"AutoFormat"=dword:1
"MountFlags"=dword:2
"DefaultFileSystem"="FATFS"
"FileSystem"="fatfsd.dll"
"PartitionDriver"="mspart.dll"
"BootPhase"=dword:0

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk/PART00]
"Name"="NAND FLASH"
"Folder"="HIVE"


[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk/PART01]
"Name"="NAND FLASH"
"Folder"="FlashDrv"


[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDisk/FATFS]
"AutoFormat"=dword:1
"Flags"=dword:00000024

[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDisk]
"DriverPath"="Drivers//BuiltIn//NAND_Flash"
"LoadFlags"=dword:1
"Order"=dword:0
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000
ENDIF
; END HIVE BOOT SECTION


       a.首先来说下这个有点意思的HIVE BOOT SECTION,因为我们的注册表项是写在nand上的。而在系统启动的时候是通过这些注册表来一一的加载驱动程序的,但是你可以想一下。系统在启动之初如果没有nand的驱动程序。我是不可能拿的到注册表。何来的加载启动呢。所以就有了这个HIVE BOOT SECTION。凡是在HIVE BOOT SECTIO之间的就是在启动之初最先加载的,具体的就是上面所分析的那样。由最原始的ROM注册表项来通过mspart.dll,来加载nand驱动。首先看到了吗?在[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDisk]这个子键下有"DriverPath"="Drivers//BuiltIn//NAND_Flash",就是对应着nand的去哦哦那个程序。这个是我犯错误的一个地方。由于是第一次移植程序。很多的地方都需要做修改。自己却忘记还有这个地方。
       b.其他的子键也没有什么好说的就要 看帮助文档会写的很清楚。


(4)再介绍一下nandflash的驱动问题。其实没有什么好说的。这是一个大的模块。我应该说还在皮毛上,但是有个要注意的问题就是。关于nand驱动和分区指尖的关系。当然写nand和读nand是一定会在分区里面有的操作。就是一个关于偏移的问题。就我在网上阅读的一些大虾们的驱动程序看来。一般都是分两个区的比较多。一个是分为binsf的NK分区,剩下的就是一个FAT32的分区。当然这里就有一个偏移的说法。就是你的eboot多出来的那一截偏移啊。当然对于我的程序来说我分了eboot.xldr.IPL.NK。我只是没有把我的NK放到一个分区中来以文件的形式组织起来罢了。就再把剩余的分区划分为两个都是FAT32的分区。我要想一下。我将来只是对我这划分出来的两个区来进行操作。我可以这样来做假设。我要擦除我的分区里面的数据。我肯定以为我的分区的起始位置是0.而其真正的位置就是我的0+offset的地址。这样就说我上面的应用每一次做擦除的时候都是以一个偏移在做操作。所以最好就是要把nand驱动的所有的操作都加上一个偏移。。那样上面的应用看起来更自然。但是我呢提出来了。因为我的nk.eboot的烧写都是一个绝对值是没有偏移量的,在nand下面修改了这样就写错了。。做一在eboot中作NK。eboot的烧写的时候要要在eboot中把那部分偏移量给剪掉。对应到nand下面去刚好抵消。当然我的分区操作也是一个绝对的地址。不过似乎微软的那些代码都是一个以逻辑号0开始的地址。所以可能也不用在分区驱动程序中来减掉偏移。

(5)对于MBR她他的结构需要认真的去参考网上的说明。在看不到分区的时候一定呀把MBR地址的地方把MBR这个扇区都读出来。然后再来好好的分析一下分区表的信息,有个主意的地方,就是分区表是四个部分。就是只能分为最多四个区,对于文件系统有一个疑惑的地方。就是我现在要分我两个都是FAT32的的分区。但是当我把BP_OPENPARTITION这个哈数中的参数文件类型都写为PART_DOS32的时候就只能显示地一个分区。而第二个看不到。但是我将第一个写为PART_DOS3_FAT,第二个写为PART_DOS32时候就能显示出来两个分区。

(6)就是对于微软自己写这个分区驱动的思想。收先会在内存中预留一个MBR+一个BLOCK+一个sectorinfo的大小来具体的向NAND中写MBR.能直接的写NAND吗?首先会填充好头尾在MBR中。再把MBR复制到block中。再在BLOCK中写好分区信息。最后把BLOCK写到你所要的那个分区的第0个BLOCK。这样就算写完了。是分两个区的时候会去在读分区表。会在分区表的如果是同一文件系统会发现分区表的二项会有一个合适的值这个就是你的第二个相同分区的信息。如果不是同一个文件系统那么还要给第二个分区来准备MBR。
(7)对于具体程序的理解希望最近我能写上。

 

http://hi.baidu.com/guly699/blog/item/3b1f0508924206db63d98641.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值