【转载】WinCE EBOOT中的BootPart分析
转载自:http://blog.csdn.net/nanjianhui/archive/2008/11/27/3391583.aspx
应该说BootPart算是微软提供的一个用于分区的模块,可以在EBOOT中使用。不过说实话,我很少使用它,知道有些厂商的BSP里面支持这个功能,而且也算是EBOOT的一部分,所以还是介绍一下。先看一下架构,如图:
在EBOOT中,BLCOMMON处于最上层,这个在以前已经介绍过,BootPart模块会被OEM函数来调用,而BootPart模块要操作存储设备需要Flash Driver的支持。这里要说的是Flash Driver是指WinCE下的Flash驱动,也就是FMD_xxx接口的驱动。所以要使用BootPart模块,首先要有Flash的驱动的支持。BootPart模块在”\WINCE600\public\common\oak\drivers\ethdbg\bootpart”下面可以找到源代码,主要的实现都在bootpart.cpp中。Bootpart模块主要提供对Flash设备的分区功能和对BinFS的支持。下面介绍一下会用到的函数:
1. BOOL BP_Init (LPBYTE pMemory, DWORD dwSize, LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)
该函数可以说是BootPart模块的初始化函数,看看代码就知道他会调用FMD_Init来初始化Flash设备并初始化一块内存。该函数一般会在OEMPlatformInit函数中被调用。pMemory指向一块内存来存放MBR信息,dwSize为内存的大小,lpActiveReg,pRegIn和pRegOut会被FMD_Init用到,一般可以设置为NULL。
2. BOOL BP_LowLevelFormat(DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)
该函数用于低级格式化,它会格式化Flash设备中的Block,重新创建MBR并将MBR存到第一个Block的第一个扇区中。dwStartBlock为起始Block,dwNumBlocks为多少个Block,dwFlags为格式化标记位,表示采用何种格式化方式。该函数会根据需要来由EBOOT中的函数调用。
3. PPARTENTRY BP_GetPartitionInfo (HANDLE hPartition)
该函数用于获得某个分区的信息。hPartition为某一个分区的句柄,返回相应的分区信息。
4. HANDLE BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)
该函数用于打开或者创建一个分区,可以通过该函数在Flash设备上面创建分区。dwStartSector为起始逻辑扇区,dwNumSectors为该分区中包含多少个扇区,dwPartType表示分区的类型,fActive为是否是激活分区,dwCreationFlags表示是创建分区还是打开分区,执行成功后返回该分区的句柄。
5. BOOL BP_WriteData(HANDLE hPartition, LPBYTE pbBuffer, DWORD dwLength)
该函数负责向某一个分区写入数据,一般EBOOT可以通过这个函数将WinCE image写入分区中。hPartition为被创建的分区的句柄,pbBuffer为要写入数据的Buffer,dwLength为要写入数据的长度。
6. BOOL BP_ReadData(HANDLE hPartition, LPBYTE pbBuffer, DWORD dwLength)
该函数负责从一个分区中读出数据,EBOOT可以通过这个函数将WinCE image读到RAM中。hPartition为被创建的分区的句柄,pbBuffer为要读出数据的Buffer,dwLength为要读出数据的长度。
7. BOOL BP_SetDataPointer (HANDLE hPartition, DWORD dwAddress)
该函数用于设置某一个分区的数据指针,实际上数据指针是指在该分区中下一次被读或写的位置。一般会配合BP_ReadData(..)和BP_WriteData(..)两个函数来用。hPartition为被创建分区的句柄,dwAddress为数据指针的新位置。
一般比较常用的就是这些函数。最后简单总结一下,微软提供的这个模块主要是用于在Flash设备上进行分区,或者说帮助我们来对Flash进行Layout。在EBOOT中要使用它,首先要实现Flash的驱动才可以。其实看看代码就会发现,这些函数无论是创建MBR,还是创建分区,本质上就是在Flash里面写了一些标记性信息,封装了一些函数给用户使用。我很少使用BootPart模块,更习惯整个Flash都由自己来管理,感觉更清楚些。