WINCE系统启动时是否clean boot
*******************************LoongEmbedded************************
作者:LoongEmbedded
時間:2010.12.09
類別:WINCE嵌入式系統
********************************LoongEmbedded***********************
?
這里的clean boot可以理解為清除system.hv和user.hv
?
本系統基于nandflash出去NK.bin之外的空間mount成盤符ResidentFlash,其中system.hv和user.hv就保存在這個文件夾中,也即是保存在nandflash中,看下圖
?
圖1
?
如果clean boot option的值是FALSE,那么保存在ResidentFlash文件夾的內容在重啟之后不會丟失;而如果clean boot option的值是TRUE,那么保存在ResidentFlash文件夾的內容在重啟之后就會丟失,這是因為系統在啟動的時候,Filesys.dll通過刪除hive-base注冊表的數據所保存在的文件并且重新創建它們來執行clean boot (因為基于Hive的注冊表把注冊表數據存放在文件系統的文件上,也就是保存在永久性存儲介質中,在這里是nandflash),那具體是怎么實現這個動作的呢?
?
Filesys.dll在初始化基于hive的注冊表的時候,Filesys.dll調用OEMIoControl來查詢是否需要清除保存在block設備上的hv文件,其CODE代碼為IOCTL_HAL_GET_HIVE_CLEAN_FLAG,它的輸入參數lpInBuf固定為HIVECLEANFLAG_SYSTEM或HIVECLEANFLAG_USERS,Filesys.dll會分別用這兩種參數調用兩次IOCTL_HAL_GET_HIVE_CLEAN_FLAG,第一次用HIVECLEANFLAG_SYSTEM來問OEM是否需要清除system.hv,第二次用HIVECLEANFLAG_USERS做參數來查詢是否要清除user.hv,如果返回的lpOutBuf中的值為TRUE則做清除操作(這樣,保存在nandflash的hv文件就會被清除掉),如果為False則保留block設備上的注冊表文件。這兩次調用實際上就是調用了函數OALIoCtlHalGetHiveCleanFlag,這個函數被調用的依據見bsp/src/inc/ioctl_tab.h中的內容,見下圖
?
圖2
下面我們就來看看OALIoCtlHalGetHiveCleanFla的函數體
?
圖3
下面來看OALArgsQuery函數的主要函數體
?
圖4
圖4中IMAGE_SHARE_ARGS_UA_START=0xA0020000,其對應的物理內存地址是0x30020000,這是eboot和OS共享內存的起始地址,這塊內存是SDRAM的一塊區域,在eboot/boot.bib下的定義如下:
MEMORY
;?? Name???? Start???? Size????? Type
;?? -------? --------? --------? ----
??? ARGS???? 80020800? 00000800? RESERVED
RAM????? 80021000? 0000B000? RAM???
……………………………
這段內存主要是用于eboot和OS傳遞參數的,共享一些參數信息,這段內存保存了結構體BSP_ARGS的數據,這個結構體就是eboot和OS之間共享的參數信息,本系統BSP_ARGS結構體的定義如下
typedef struct {
??? OAL_ARGS_HEADER header;
??? UINT8 deviceId[16];???????????????? // Device identification
??? OAL_KITL_ARGS kitl;
??? UINT8 uuid[16];
??? BOOL bUpdateMode;?????????????????? // TRUE = Enter update mode on reboot.
??? BOOL bHiveCleanFlag;??????????????? // TRUE = Clean hive at boot
?? ?BOOL bCleanBootFlag;??????????????? // TRUE = Clear RAM, hive, user store at boot
??? BOOL bFormatPartFlag;?????????????? // TRUE = Format partion when mounted at boot
?????? DWORD nfsblk;
??????
?????? // added by JJG 061106
?????? // Because We cannot read EXTINT0,1,2 register in 2443 EVT2.0 CPU, we can just write only.
?????? // So we must save EXTINT0,1,2 status globally for supporting external interrupt using by device driver.
?????? DWORD EXTINT0;
?????? DWORD EXTINT1;
?????? DWORD EXTINT2;
?????? ///
?????? HANDLE g_SDCardDetectEvent; //kim
?????? DWORD g_SDCardState ;
??????
} BSP_ARGS, *PBSP_ARGS;
其中成員變量bHiveCleanFlag就是是否clean boot的標志位,圖4的函數OALArgsQuery就是通過查詢這個變量來告訴filesys.dll是否清除system.hv和user.hv,那么bHiveCleanFlag的值是在哪里初始化的呢?而圖1中提到的從FALSE改為TRUE是在哪里實現的呢?
?
在eboot/main.c中,OEMPlatformInit函數會調用TOC_Read函數來獲取boot的配置信息,如下
?
圖5
那TOC_Read函數是如何讀取TOC(包含了boot的配置信息)的信息的呢?接下來看TOC_Read函數體
?
?
圖6
TOC_Read函數調用FMD_ReadSector函數讀取的TOC結構體的變量成員的值是romimage.exe初始化的,具體見http://blog.csdn.net/chinesedragon2010/archive/2010/10/09/5929007.aspx,下面我們介紹BOOT_CFG結構體,定義如下
//
// Bootloader configuration parameters.
//
typedef struct _BOOTCFG {
?
??? ULONG?????? ImageIndex;
??? ULONG?????? ConfigFlags;
??? ULONG?????? BootDelay;
??? EDBG_ADDR?? EdbgAddr;
??? ULONG?????? SubnetMask;
} BOOT_CFG, *PBOOT_CFG;
其中成員變量ConfigFlags就是用于指示是否清除system.hv和user.hv的變量,系統初始值,也就是romimage.ex初始化ConfigFlags的值是0x2830,但為什么是這個值呢?目前還不知道,如果圖1中的FALSE改為TRUE保存之后,ConfigFlags的值是0x6830。那ConfigFlags和上面提到的bCleanBootFlag有什么關系呢?我們先來看圖1中對應的動作在代碼中是如何是實現的,首先看eboot/main.c中OEMPlatformInit函數下面的代碼
?
圖7
接下來圖1中從FLASH改為TRUE對應在MainMenu函數中的實現部分:
?
圖8
第一次boot的時候,ConfigFlags的值是0x2830,這里是和0x00004000進行異或運算,運算之后,ConfigFlags的值變為0x6830,下一次再選擇“C”對應的操作時,又是0x2830,選擇“C”后需要選擇“W”來修改之后的ConfigFlags值,下面就來看是如何把修改之后的ConfigFlags的值來保存到nandflash中的
?
圖9
這里主要是調用TOC_Write來實現
?
圖10
這樣修改之后的g_pBootCfg->ConfigFlags的值保存到TOC所在的第1個block中了。修改之后g_pBootCfg->ConfigFlags的值是0x6830,這個值保存在nandflash中,那么重啟之后系統啟動的時候,我們知道files.dll是通過bCleanBootFlag來查詢是否在啟動的時候清除system.hv和user.hv的,我們下面就來分析g_pBootCfg->ConfigFlags的值是如何和bCleanBootFlag關聯的,系統啟動后會執行eboot/main.c函數OEMPlatformInit的下面這部分
?
圖11
g_bCleanBootFlag在eboot/main.c調用的OEMPlatformInit函數的下面代碼中實現
?
圖12
這樣我們就知道圖1中的FALSE改為TRUE后,g_pBootCfg->ConfigFlags=0x6830,所以*g_bCleanBootFlag =TRUE,也就是把eboot與OS共享內存變量g_bCleanBootFlag的值改為TRUE。接下來在系統的啟動過程中會調用OEMInit函數的下面代碼
?
圖13
這樣上面提到的幾個值的改變關聯如下:
ConfigFlags->bCleanBootFlag->bHiveCleanFlag
這樣就filesys.dll調用OALIoCtlHalGetHiveCleanFlag函數來查詢bHiveCleanFlag的值來決定是否清除system.hv和user.hv了,下面是help文檔中對NKForceCleanBoot函數的描述:
VOID NKForceCleanBoot(void);
This function forces the operating system (OS) to boot from a clean object store file system when called from the OEMInit function.
?
This function can also be called after the OS has started to force the next boot process to start from a clean object store file system.
?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的WINCE系统启动时是否clean boot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0添加特定的软件键盘
- 下一篇: C/C++从入门到高手所有必备PDF书籍