*******************************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.

WINCE系统启动时是否clean boot相关推荐

  1. Linux如何在系统启动时自动加载模块

    下面是以前学习Linux时写的,后来仔细研究rc.sysinit后发现,只需要修改下列地方就可以了,不必这么麻烦的: rc.sysinit中有这样的一段代码: # Load other user-de ...

  2. mac双系统装mysql启动不了了_详解ubuntu双系统启动时卡死解决办法

    详解ubuntu双系统启动时卡死解决办法 ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时, ...

  3. 转载:一篇文章看明白 Android 系统启动时都干了什么

    最近在看<深入理解Android内核设计思想>,老实说,作为教材,这本书实在写的不好.本来内核的东西就比应用层繁杂,需要有个条绳子牵着,有个框子框着才不好跟丢.这个书老是在章节开头抛出一些 ...

  4. 系统启动时提示 ntldr is missing

    http://wenwen.soso.com/z/q57629107.htm 我们偶尔会遇到系统启动时显示"NTLDR is missing"而无法进入系统的情况.其实导致该故障的 ...

  5. 系统启动时显示“NTLDR is missing”而无法进入系统的解决方法

    背景 平时,我们偶尔会遇到系统启动时显示"NTLDR is missing"而无法进入系统的情况.其实导致该故障的原因有佷多,下面我将各种情况和原因进行汇总,希望对大家有所帮助. ...

  6. 菜鸟笔记--debian根文件系统启动时[FAILED] Failed to start Create Volatile Files and Directories.

    今天移植debian的根文件系统到开发板上,根文件系统启动时一堆红色报警,很扎眼. [FAILED] Failed to start Create Volatile Files and Directo ...

  7. win10下双系统安装以及Ubuntu双系统启动时卡死的解决方法

    win10下双系统安装以及Ubuntu双系统启动时卡死的解决方法 win10下双系统安装以及Ubuntu双系统启动时卡死的解决方法 步骤一 制作系统光驱 步骤二 磁盘分区 步骤三 进入Bios设置U盘 ...

  8. linux校时写入硬件,手动校正 Linux 系统时间并把时间写入硬件,系统启动时自动校正时间并把时间写入硬件。...

    手动校正 Linux 系统时间并把系统时间写入硬件,系统启动时自动校正时间并把时间写入硬件. 下面以 CentOS 6.5 (32位)系统为例,设置系统时间:手动校正 Linux 系统时间并把时间写入 ...

  9. linux 卡在grub_详解ubuntu双系统启动时卡死解决办法

    ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于 ...

最新文章

  1. 在leangoo里怎么创建看板,更改看板名称?
  2. 退出页面 数据保留_设计师常用的数据分析指标
  3. html引入iview如何修改样式,vue中如何修改iView的样式,
  4. 大厂测试开发常见面试题收集(python,java,性能等)
  5. CodeForces - 1553F Pairwise Modulo(数论+树状数组)
  6. http://www.cnoug.org/viewthread.php?tid=9292
  7. JavaScript语言精粹笔记
  8. python获取windows路径,Python中的Windows路径
  9. TensorFLow RCNN
  10. 如何编程实现iAMT无线功能的禁用和开启
  11. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(中)
  12. Windows 批处理(bat)语法大全、BAT批处理基本命令总结
  13. 零基础如何入门学习原画?速收藏
  14. 万能浏览器下载|万能浏览器免费下载
  15. 无胁科技-TVD每日漏洞情报-2022-7-12
  16. 【一】机器学习在网络空间安全研究中的应用
  17. shiny 服务器未响应,shiny-server 安装过程出现问题总结
  18. Java毕设项目二次元文化网站(java+VUE+Mybatis+Maven+Mysql)
  19. FastDfs与ElasticSearch和Mysql完成海量数据存储搜索功能
  20. win10待机状态仍然联网设置

热门文章

  1. idea中package和directory的区别
  2. spring 可以有多个ioc容器吗
  3. Java中基本数据类型和Object之间的关系
  4. 001_SpringBoot入门
  5. 023_jdbc-mysql的CRUD操作
  6. 详解python中的用法_详解python中*号的用法
  7. 自然语言理解属于计算机应用的那个范畴,基于自然语言理解的3D场景构造研究-计算机应用技术专业论文.docx...
  8. 即时通讯:XMPP基础
  9. Java数据结构和算法:数组、单链表、双链表
  10. Android安全加密:Https编程