日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

WINCE系统启动时是否clean boot

發布時間:2025/4/16 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE系统启动时是否clean boot 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*******************************LoongEmbedded************************

作者:LoongEmbedded

時間:2010.12.09

類別:WINCE嵌入式系統

********************************LoongEmbedded***********************

?

這里的clean boot可以理解為清除system.hvuser.hv

?

本系統基于nandflash出去NK.bin之外的空間mount成盤符ResidentFlash,其中system.hvuser.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_SYSTEMHIVECLEANFLAG_USERSFilesys.dll會分別用這兩種參數調用兩次IOCTL_HAL_GET_HIVE_CLEAN_FLAG,第一次用HIVECLEANFLAG_SYSTEM來問OEM是否需要清除system.hv,第二次用HIVECLEANFLAG_USERS做參數來查詢是否要清除user.hv,如果返回的lpOutBuf中的值為TRUE則做清除操作(這樣,保存在nandflashhv文件就會被清除掉),如果為False則保留block設備上的注冊表文件。這兩次調用實際上就是調用了函數OALIoCtlHalGetHiveCleanFlag,這個函數被調用的依據見bsp/src/inc/ioctl_tab.h中的內容,見下圖

?

2

下面我們就來看看OALIoCtlHalGetHiveCleanFla的函數體

?

3

下面來看OALArgsQuery函數的主要函數體

?

4

4IMAGE_SHARE_ARGS_UA_START=0xA0020000,其對應的物理內存地址是0x30020000,這是ebootOS共享內存的起始地址,這塊內存是SDRAM的一塊區域,在eboot/boot.bib下的定義如下:

MEMORY

;?? Name???? Start???? Size????? Type

;?? -------? --------? --------? ----

??? ARGS???? 80020800? 00000800? RESERVED

RAM????? 80021000? 0000B000? RAM???

……………………………

這段內存主要是用于ebootOS傳遞參數的,共享一些參數信息,這段內存保存了結構體BSP_ARGS的數據,這個結構體就是ebootOS之間共享的參數信息,本系統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.hvuser.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.hvuser.hv的變量,系統初始值,也就是romimage.ex初始化ConfigFlags的值是0x2830,但為什么是這個值呢?目前還不知道,如果圖1中的FALSE改為TRUE保存之后,ConfigFlags的值是0x6830。那ConfigFlags和上面提到的bCleanBootFlag有什么關系呢?我們先來看圖1中對應的動作在代碼中是如何是實現的,首先看eboot/main.cOEMPlatformInit函數下面的代碼

?

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所在的第1block中了。修改之后g_pBootCfg->ConfigFlags的值是0x6830,這個值保存在nandflash中,那么重啟之后系統啟動的時候,我們知道files.dll是通過bCleanBootFlag來查詢是否在啟動的時候清除system.hvuser.hv的,我們下面就來分析g_pBootCfg->ConfigFlags的值是如何和bCleanBootFlag關聯的,系統啟動后會執行eboot/main.c函數OEMPlatformInit的下面這部分

?

11

g_bCleanBootFlageboot/main.c調用的OEMPlatformInit函數的下面代碼中實現

?

12

這樣我們就知道圖1中的FALSE改為TRUE后,g_pBootCfg->ConfigFlags=0x6830,所以*g_bCleanBootFlag =TRUE,也就是把ebootOS共享內存變量g_bCleanBootFlag的值改為TRUE。接下來在系統的啟動過程中會調用OEMInit函數的下面代碼

?

13

這樣上面提到的幾個值的改變關聯如下:

ConfigFlags->bCleanBootFlag->bHiveCleanFlag

這樣就filesys.dll調用OALIoCtlHalGetHiveCleanFlag函數來查詢bHiveCleanFlag的值來決定是否清除system.hvuser.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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。