wince6.0启动

Wince 6.0 开机自启动 总结 最近在做基于Wince6.0的应用程序的开发,应用程序基本开发完毕,需要把程序烧写进内核。经过一段时间折腾,算是完成了任务,先总结如下: wince6.0的应用程序烧写进内核方法与wince5.0修改的地方基本一致。这里需要说明,在\WINCE600\OSDesigns\S3C6410_DEM0\RelDir\Samsung_SMDK6410_Release里的操作前提是已经编译生成NK.bin 阅读详情

以S3C6410为例子,S3C6410的内部SRAM地址为0x0C00 0000 ~ 0x0C00 1FFF,DRAM的Base地址为0x50000000 ,S3C6410支持NAND,SD启动,S3C6410里面有固化的ROM,
当系统上电的时候,将执行固化ROM中的代码,然后检查硬件的GPIO配置,如果配置成NAND 启动,则把NAND的前8K读入内部的SRAM(stepping Stone)中,然后跳转到
Stepping Stone的开头,执行Bootloader1 (也就是下文的stepldr), stepldr负责把eboot从NAND中搬到DRAM中,然后执行eboot( boot loader 2),eboot通过网络下载
NK.bin或者从NAND中把内核搬到DRAM中,然后执行WINCE内核.所以整个启动过程分为三阶段,stepldr -->eboot --> wince kernel .
下面详细地分析各个阶段.
一 bootloader 1  stepldr
  从stepldr的startup.s开始.startup.s主要是初始化硬件,中断,配置好C运行的环境,然后跳转到main函数中,执行C代码.
   startuo.s 的流程是 :
       startup --> Enable I cache -->关闭watchdog ,Interrupt dosable -> 时钟初始化 --> 初始化DRAM控制器 --> 初始化IRQ,SVC stack -->
      判断是否睡眠 ---N--> Clear DRAM -->main
                  --Y-> 跳到NK的开头 (也就是DRAM + 0x100000的地方)
                               

   main.c :
      UART初始化 --> nand 初始化 -> 从NAND中把eboot搬到DRAM中 -->跳转到 eboot的开头
       
  我们看代码有2个全局变量。
   ROMHDR * volatile const pTOC = (ROMHDR *)-1; 这个在ROMImage里面会赋值。
   static BOOL g_bLargeBlock = FALSE; // For Large Block Check
   这两个全局变量的位置为:500F0000 根据stepldr.bib
  

二 bootloader 2  eboot
  startup.s
   startup -->  Enable I cache -->关闭watchdog ,Interrupt dosable -> 时钟初始化 --> Disable VIC --> enable 中断 -->CLEAR DRAM(从1M到128M地址的DRAM,因为低1M地址
   空间目前放的是eboot ) --> 初始化MMU Table (根据g_oalAddressTable,把DRAM的Base地址0x50000000映射到0x80000000,此后地址都用虚拟地址) --> 初始化IRQ,SVC stack -->
    -->main 
 
   
  main.c
    main --> BootloaderMain
  
  BootloaderMain的流程:
  KernelRelocate -->OEMDebugInit(初始化串口,这样就可以打印信息了) -->OEMPlatformInit -->OEMPreDownload -->DownloadImage-->OEMLaunch (切换到ce内核了)
  OEMPlatformInit :
    InitializeDisplay --> 初始化中断 -->NAND Flash驱动 初始化 --> MainMenu (一些选项,比如设置IP) -->ethernet 驱动初始化
  
  OEMPreDownload : get IP , initialize TFTP
  DownloadImage :
   先用OEMReadData读7位头,然后根据这7位判断是bin 还是 nb0 等
   假如是bin , 调用 DownloadBin

  
 

三 wince OS
  wince os 的启动我们也可以换分为2个阶段,第一个阶段,初始化OAL,一直到FirstSchedule开始调度,第二阶段,开始对文件系统,注册表,driver的
  初始化和加载。
(1)初始化 OAL
 
1.startup.s
  
    初始化一些硬件外设 --> KernelStart

2.KernelStart
   在PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\armstart.s中
   根据OALAddress Table初始化页表 , 打开MMU和初始化Cache和中断向量
   初始化stack
   调用ArmInit
    mov     r12, r0
    ldr     r0, =KData
    mov     pc, r12                          ; jump to entry of kernel.dll
3 ArmInit
   在PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\arminit.c中
   LPVOID ARMInit (struct KDataStruct *pKData)
{
    /* Initialize kernel globals */
    KernelRelocate (pTOC);

    /* The only argument passed to the entry point of kernel.dll is the address */
    /* of KData, we need to put everything we need to pass to in in KData. */
    pKData->dwTOCAddr     = (DWORD) pTOC;
    pKData->dwOEMInitGlobalsAddr = (DWORD) OEMInitGlobals;

    SetOsAxsDataBlockPointer(pKData);

    return FindKernelEntry (pTOC);
}
 主要是内核重定位 .返回kernel.dll的入口位置.
  在上面的KernelStart函数中,mov pc, r12指令跳转到kernel.dll的入口位置.
 

4 FindKernelEntry找到NKStartup
   在PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c中
   调用 ARMSetup (PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c)to perform addition setup for CPU (vector table, 1st-level PT mappings, etc)
   调用OEMInitDebugSerial 以及    OEMInit
   
5   OEMInit
   在\PLATFORM\SMDK6410\SRC\OAL\OALLIB\init.c中

      OALCacheGlobalsInit();
      .....
    OALArgsInit((BSP_ARGS *)IMAGE_SHARE_ARGS_UA_START);// Check and Initialize the BSP Args area
     .....
      if (!OALIntrInit())// Initialize Interrupts
    {
        OALMSG(OAL_ERROR, (L"[OAL:ERR] OEMInit() : failed to initialize interrupts\n"));
    }
    .......
    OALTimerInit(RESCHED_PERIOD, (OEM_COUNT_1MS ), 0);// Initialize System Clock
    .......
    KITLIoctl(IOCTL_KITL_STARTUP, NULL, 0, NULL, 0, NULL);  // Initialize the KITL connection if required
  
  

6、KernelSstart函数:
    这里的KernelStart函数与前面的KernelStart函数的属于两个完全不同的函数,NKStartup函数中调用的KernelStart 函数为
    $(_PRIVATEROOT)\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s文件中的KernelStart 函数,
    主要完成调用内核初始化函数KernelInit,并跳转到操作系统的第一个启动的任务。
LEAF_ENTRY KernelStart
    ldr r4, =KData ; (r4) = ptr to KDataStruct
    ldr r0, =APIRet
    str r0, [r4, #pAPIReturn] ; set API return address
    mov r1, #SVC_MODE
    msr cpsr_c, r1 ; switch to Supervisor Mode w/IRQs enabled
    CALL KernelInit ; initialize scheduler, etc.
    mov r0, #0 ; no current thread
    mov r1, #ID_RESCHEDULE
    b FirstSchedule
ENTRY_END

7、KernelInit函数:
    Windows CE 6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等操作。
void KernelInit (void)
{
#ifdef DEBUG
    g_pNKGlobal->pfnWriteDebugString (TEXT("Windows CE KernelInit\r\n"));
#endif
    APICallInit ();// setup API set
    HeapInit ();// setup kernel heap
    InitMemoryPool ();// setup physical memory
    PROCInit ();// initialize process
    VMInit (g_pprcNK);// setup VM for kernel
    THRDInit ();// initialize threadsv
    MapfileInit ();
#ifdef DEBUG
    g_pNKGlobal->pfnWriteDebugString (TEXT("Scheduling the first thread.\r\n"));
#endif
}

8、FirstSchedule:
    FirstSchedule函数为Windows CE操作系统启动过程中最后无条件跳转的一个函数,windows CE进行第一个调度,实际为一个空闲线程,因为windows CE系统还没有完成启动,只有当windows CE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序 explore.exe。

 

(2)系统的其它部分初始化

2.1    FirstSchedule --〉SystemStartupFunc
2.2    而在SystemStartupFunc中,会创立一个内核线程
   CreateKernelThread (RunApps,0,THREAD_RT_PRIORITY_NORMAL,0)
   这样就执行线程的函数RunApps
2.3    在RunApps中,NKLoadLibraryEx (L"filesys.dll", MAKELONG (LOAD_LIBRARY_IN_KERNEL, LLIB_NO_PAGING), NULL);
     进行filesys.dll的加载,
2.4     然后启动一个线程,执行filesys.dll的 WinMain
2.5      等待filesys.dll 的event SYSTEM/FSReady
2.6      收到后: 
            InitMUILanguages();// Initialize MUI-Resource loader (requires registry)
       
            InitSystemSettings (); // Read system settings from registry
   
我们再来看看 FILESYS.DLL 。它相当于Windows CE以前版本中的FILESYS.EXE,负责初始化文件系统、对象存储、注册表、CEDB数据库、设备通知以及其它一些工作。

1  Filesys.dll 检测是冷启动还是热启动
  如果是冷启动,对象存储内存将被初始化并映射给Filesys.dll.对于热启动,不用初始化而直接映射给Filesys.dll
2 Filesys.dll 从ROM中加载 OEM的 Certification DLL .

3 对于热启动,如果系统必须冷启动, Filesys.dll调用OAL函数pNotifyForceCleanboot.

4 对于冷启动, Filesys.dll 初始化RTC,通过调用OEMIoControl函数,控制号为IOCTL_HAL_INIT_RTC I/O.
5 Filesys.dll 按照顺序初始化下列APIs:
   Database APIs
   File system APIs
   Point-to-point message queue APIs
   Event log APIs
   Registry APIs
对于冷启动, Filesys.dll初始化注册表数据.数据初始化过程取决于是hive注册表还是RAM注册表.
如果在注册表里指定了缺省的用户Profile, Filesys.dll加载缺省用户的profile并初始化 HKEY_CURRENT_USER下的数据.

6 如果Device.dll 没有启动并且HKEY_LOCAL_MACHINE\System\StorageManager 指向一个可以加载的DLL, Filesys.dll加载存储管理器.
  如果存储管理器加载了, Filesys.dll创建一个线程来初始化它.

7 Filesys.dll 初始化NLS数据(national language support).
8 对于一个干净的启动,Filesys.dll查阅Initobj.dat文件,然后从ROM中拷贝这些文件到根文件系统.
  比如Initobj.dat内容为:
  root:-Directory("Program Files")
  root:-Directory("My Documents")
  Directory("\Windows"):-Directory("Desktop")
  Directory("\Windows"):-Directory("Programs")
  Directory("\Windows"):-Directory("Recent")
  Directory("\Windows\Desktop"):-File("Media Player.lnk", "\Windows\ceplayer.lnk")
  Directory("\Windows\Programs"):-File("Media Player.lnk", "\Windows\ceplayer.lnk")
  Directory("\Windows\Desktop"):-File("Messenger.lnk", "\Windows\msmsgs.lnk")
  Directory("\Windows\Programs"):-File("Messenger.lnk", "\Windows\msmsgs.lnk")
  它的意思是:
   先用root命令在根目录\下面建立2个文件夹,分别叫Program Files和My Documents.
   然后在\Windows下面建立3个文件夹Desktop,Program,Recent
   最后把Media Player的链接ceplayer.lnk,msmsgs.lnk拷贝到\windows\Desktop,Programs目录下,命名为Media Player.lnk,Messenger.lnk. 

9 如果需要的话,Filesys.dll初始化时区并设置夏令时 (daylight saving time ,DST).
10 对于冷启动, Filesys.dll为用数据库引擎设置区域,对于EDB数据库,通过调用CeChangeDatabaseLCID (EDB)而对于CEDB数据库调用CeChangeDatabaseLCID (CEDB).
   此外,对于冷启动,Filesys.dll从Initdb.ini文件中加载数据来填充对象存储数据库.
  

11 Filesys.dll告诉kernel:Filesys.dll已经好了. Filesys.dll然后等待kernel通知去启动OS的其他部分.

12 Filesys.dll根据HKEY_LOCAL_MACHINE\System\Events注册表创建命名的事件. 这些事件被拥有他们的进程设置.

13 Filesys.dll 启动HKEY_LOCAL_MACHINE\Init所列的应用
如果Device.dll在HKEY_LOCAL_MACHINE\Init中,而它又已经被启动,Filesys.dll会去打开SYSTEM/BOOTPHASE2事件,并会向Device.dll发信号。
该动作使得Device.dll会去重读注册表,并完成最后阶段的驱动初始化。任何驱动都可以去等待该同样的事件,这样驱动就可以去再读一次注册表。

在正常的启动过程中,Filesys.dll建立了一些文件并把他们存储在user storage中. 这些文件将占用 1.8 MB的可用的user storage.

下列文件在启动过程中被创建:

System.hv    \Documents and Settings\system.hv          345 KB   系统注册表hive文件
User.hv       \Documents and Settings\default\user.hv   345 KB    缺省用户的用户注册表hive文件

对于filesys.dll启动过程,参见 http://msdn.microsoft.com/en-us/library/aa912276.aspx

再来看Device.dll,它被加载后,将读取 HKLM\Drivers\BuildIn下面的信息,然后一个一个驱动被加载,加载后相应地在 HKLM\Drivers\Active下面创立相应的键.

S3C2410下WinCE的启动过程详解及编程示例 引导加载程序是一个位于芯片内部或外部存储器中的小型程序,负责初始化硬件、加载操作系统镜像并将控制权转交给操作系统。加载操作系统镜像的过程包括从存储器中读取镜像数据,并将其加载到内存中的适当位置。在引导加载程序中,需要对S3C2410芯片上的硬件进行初始化。在完成硬件初始化和操作系统镜像加载之后,引导加载程序将控制权转交给操作系统。控制权的转交意味着引导加载程序停止执行,并将程序的控制权交给操作系统内核。请注意,以上示例代码仅为演示目的,实际的引导加载程序和操作系统镜像加载过程可能更为复杂。 阅读详情

相关推荐

WINCE BOOT文件

WINCE BOOT文件,从软盘上拷贝下的,用来覆盖制作WinCE的U盘启动盘。

Android 系统属性读取和设置详解

Android 系统属性读取和设置详解一、在adb中进行属性读取和设置1、Settings Provider设置和读取获取设置2、SystemProperties属性读取和设置二、Android代码中进行属性读取和设置1、Settings Provider设置和读取2、SystemProperties设置和读取SystemProperties在底层代码中读取和设置,示例:三、在文件中进行读取和设置1、Settings Provider设置和读取Android 6之前的Settings Provider的文件

wenzhi的博客 1万+

如何制作Mike21溢油模型围油栏文件

这段时间群友在做海洋环评的做了一个MIKE21的溢油模型,溢油模型其实也是ECOLAB模块的应用,而在海上发生溢油事件的时候,为防止溢油对海洋生态的破坏,经常使用的一种手段就是使用围油栏技术将溢油控制在一定范围并进行处理。今天小编就给大家说说在MIKE21里怎么实现围油栏文件的制作

zhuzhujiayoua的博客 1330

号称开源的wince6.0介绍以及下载地址

微软公司今天宣布其最新的嵌入式平台Windows Embedded CE 6.0正式上市。作为业内领先的软件工具,Windows Embedded CE 6.0将为多种设备构建实时操作系统,例如:互联网协议(IP)机顶盒、全球定位系统(GPS)、无线投影仪,以及各种工业自动化、消费电子以及医疗设备等。 在Windows Embedded诞生十周年之际,微软将首次在“共享源计划(Microsoft

gooogleman#foxmail.com 5575

VIVADO网表文件DCP和EDF

为了便于模块化设计,同时保护自己的知识产权,Xilinx VIVADO 提供两种代码封装方法:DCP文件和edf文件。

u014035968的博客 1万+

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

Windows CE 6.0 启动过程分析(转)

在Windows CE 6.0中,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层的实现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oal.exe,而与内核相关且独立于硬件的OAL层代码包含在kernel.dll中;内核无关

梦中江湖——vcleaner 4118

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

【亲测免费】 探索WinCE 6.0的宝藏:搭建你的嵌入式世界

探索WinCE 6.0的宝藏:搭建你的嵌入式世界 【下载地址】WinCE6.0中文SDK下载 WinCE 6.0 中文 SDK 下载 项目地址: https://gitcode.com/open-source-toolkit/f3...

gitblog_09816的博客 794

196、NPU的编译器开发:教程与示例代码编写

NPU编译器开发实战指南 摘要:本文分享了NPU编译器开发中的核心挑战与实战经验,通过具体代码示例展示了关键实现技术: 指令生成:必须考虑硬件特性(如地址对齐)和芯片配置抽象化 图优化:重点处理常见冗余结构(Reshape合并、BN融合),并注意数值稳定性 算子拆分:采用分块计算策略适配有限SRAM,需特别注意边界条件处理 内存分配:基于张量使用频率的贪心算法优化SRAM使用效率 文中包含多个真实踩坑案例: DMA地址未对齐导致硬件错误 BN融合时的除零风险 tile边界处理不当引起的精度下降 这些经验为开

m0_50546716的博客 88

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1729

S3C2410下WinCE6.0的启动过程详解

  转自(http://www.cnblogs.com/we-hjb)              通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK)。那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析。需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C24

sphink的专栏 1171

LDRA Testbed(TBrun)软件单元测试_操作指南

通过前面的几篇文章,使用Testbed进行软件静态分析的内容已经基本讲解完毕。从这篇文章开始,将继续讲解如何使用TBrun进行软件单元测试、软件集成测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 7778

WINCE6.0 + S3C2443的启动过程---nboot篇

WINCE6.0 + S3C2443的启动过程---nboot篇我们启动WINCE6.0的方式是:nboot+eboot+NK。那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboot拷贝到SDRAM中执行的地址处运行,接着eboot把NK.bin拷贝到SDRAM指定的地址处运行。首先,我们需要通过JTAG把我们nboot文件编译生成的stpldr.nb0文件烧录到nandflash的第0个block中。那么系统复位或者上电启动的动作产生之后,是如何从nboot开始执行的呢?我们先看S3C2

chinesedragon2010的专栏 1071

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 633

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCE6.0+S3C2443的启动过程---内核启动

********************************LoongEmbedded********************************作者:LoongEmbedded(kandi)时间:2010.11.07类别:WINCE操作系统********************************LoongEmbedded********************************WINCE6.0+S3C2443系统启动过程我们知道是NBOOT用来引导EBOOT,继而EBOOT加载并引导

LoongEmbedded的专栏 4141

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【转】S3C2410下WinCE6.0的启动过程详解

转载: 博客园 S3C2410下WinCE6.0的启动过程详解 通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK)。那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分

anne20072010的专栏 659

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Eboot之函数BootloaderMain函数分析
下一篇: WINCE6.0 远程工具,不能使用ActiveSync连接的问题
马中马
博客等级 码龄18年 112粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值