wince工作总结系列:系统启动

工作两年,一直稀里糊涂的,都不知道自己知道什么,一直是处于遭鄙视阶段,虽然比较淡定,但是因为工资的动力,我还是要好好的温故而知新,系统总结一下两年时间中接触过的东西。再说csdn氛围这么好,大家都很热情大方的分享自己的所知,以此表示感谢和支持。

接触过两个系统都是微软的,一个是wince5.0一个是wince7.0(其实名字有点变化了,但是为了方便我就这么写了),因为现在用的是wince7.0,所以先从wince7.0的启动开始,把我所知道的东西梳理清楚,最后把他们之前的不同给搬处理来看看,应该会比较清楚了吧,水平有限,欢迎大家批评指教。我在文中的讲的cpu是ti的。

先按着我们平常最常见的启动方式来吧,上电按开关,这时晶振开始启动,但是因为开始的晶振不稳定,cpu会过些周期启动。cpu启动后首先会跳转到一个固定的地址,那个地址一般是cpu内部的rom(出厂之前就有代码烧写进去,功能是检查系统的基本设置,检测时钟,中断设置,和启动设备的初始化管理以及选择,这时候的内存是芯片里面的ram,bootrom下载的image就是在ram里面),前面加载的image在ti的bsp中称为xldr

xldr中做的工作流程大概就是下面这样(这里默认启动设备是flash了,也可以从其他设备启动,比如说sd卡)

1.把之前bootrom中使用的tlb,cache,中断关掉。

2.设置栈寄存器,跳转到c语言环境中的xldrmain中

3.设置全局变量,初始化watchdog,pin,clock,gpio,i2c(主要是为了电源控制),电源设置

3.初始化cpu芯片内的ddr,flash,网卡寄存器

4.把eboot加载到内存中,然后让pc(指令寄存器)跳转到eboot地址。

接下了就该eboot上场了,

1.加载oemaddresstable,开启tlb,cache,mmu(根据oemaddresstable管理的)

2.少不了一系列初始化不过和xldr还是会有些不同,范围大了很多了嘛(特别注明串口初始化,用来打印调试信息,对于此时的调试有非常大的作用)

3.然后是判断直接加载已有的nk.bin还是从网卡下载烧写到flash之后再启动

4.如果是下载,第一次烧写nk.bin到flash里面去的话,烧写进去之前还需要初始化分区。然后烧写进去吧,O(∩_∩)O哈哈~

5.大家肯定是想着要跳转到nk.bin的入口地址去了,只是先还别忙,还是得把tlb,cache,mmu,中断关掉。因为内核和eboot设置又将是不一样的了。

囧,发现思维还是挺混乱,语言表达能力一如既往的差,在写的过程中觉得很随意,但是却不知道怎么写更好,然后发现越来越多的东西需要我深入,但是最近因为票数落后的问题一直很浮躁,一定要克服。

这里附上一个网址说flash分区的,为我扫了一点盲,希望对大家有用http://www.189works.com/article-586-1.html


nk.bin的入口是oal.exe中的startup,这里面没有做多少工作主要是把oemadresstable作为参数调用kernelstart,在kernelstart函数中会根据oemadresstable建立一级页表、开启i/d cache、建立uncache 内存映射(cache内存映射需要ome决定)、设置各个模式下的栈地址、调用arminit重定位ptoc变量、寻找内核启动所需要的KDataStruct结构体地址以及kernel.dll的入口地址nkstart,然后结构体地址作为参数调用nkstart。

在nkstart中对于内核使用的参数、变量进行初始化和赋值

pfnInitGlob = (PFN_OEMInitGlobals) pKData->dwOEMInitGlobalsAddr;这一句是用来寻找oal的入口。

g_pOemGlobal = pfnInitGlob (g_pNKGlobal);初始化在oal中定义导出给kernel的oemglobals。这个结构体就不多介绍了,定义在中,大家网上搜索下就有

建立中断向量表和一级物理页表映射和cache映射。

如果有kitl则加载

初始化串口

调用oeminit,建立二级页表,

调用KernelStart(),

KernelInit中调用 kernelfindmemory(),apicallinit(),heapinit(),procinit(),kernelvminit(),thrdinit(),mapfileinit()来建立api集,建立内核堆,建立虚拟内存,初始化进程(这个进程是nk.exe)、线程, 第一个进程是nk.exe。

,Reschedule,

以及开始建立整套虚拟内存,建立新的进程,开始调度,建立好自身的服务之后开始加载文件系统(让存储器上的内容以某种结构和形式呈现给系统看),然后加载驱动管理器,驱动管理器建立好自身后就开始读取注册表下hklm的信息,加载这个根目录下的buseumn,通过它枚举这个根目录下的注册表信息,然后根据这些信息加载驱动,把这些做完之后,大概就可以到达待机界面了。

通过这个流程,我可以确定下我要总结的知识点,首先是确定bootrom之后怎么让存储器硬件工作,xldr,和eboot的工作流程(这个则直接丰富到这篇文章上),还有就是oal 和nk(如何实现那些服务的)的加载流程,nk.bin、nk.nb0这些文件结构,文件系统的组织模式,oal和nk是怎沟通的,驱动管理器的实现,几种常用的驱动(比如usb,flash/fmd的实现,display,串口等),知道哪些透明东西的存在(比如tlb流程,如何建立的),内核空间和用户空间的沟通,还有平常工作遇到的编译过程分析、pb下面各种文件的作用、提供的信息,进程线程的内存形式以及沟通、同步,当然还有对于思维方式的总结,和对于硬件、元器件、算法、系统之间的配合以及联系,之后还有对linux学习的一些总结。最后,就想问问亲们有谁喜欢东方神起呀 呵呵,顺便打打广告,如果可以大家看完这篇文章有时间帮我投投票呀,hoho,甩下网址http://mama.interest.me/poll

希望这些总结能在一个月能总结完,上个星期偷懒了,一定要好好安排好时间。工作方法论,和一些反思。

大概的安排是是这样子

10月29日,确定bootrom之后怎么让存储器硬件工作,xldr,和eboot的工作流程(好像下载流程,我还没有去确认)

30日oal的实现

31日nk

1号nk

2号oal和nk是怎沟通的

3号驱动管理器的实现

4号内核空间和用户空间的沟通

5号平常工作遇到的编译过程分析、pb下面各种文件的作用、提供的信息

6号进程线程的内存形式以及沟通、同步

先安排这么多吧,中间过程中我想又会发现很多需要总结深入的东西,哎,我是个很贪心的家伙,所以一直什么东西都做不好却什么都想要。

下班不能娱乐了,上班也是,带着问题找答案,一直到11月29日我每天都要给东方神起投票,时间很紧,我一定要控制好,过了这个坎,我相信,我应该会好很多了,加油!

关于计划我想应该之后会有些变动,文章写得不好,我怀疑能够忍着看完的人都会觉得头痛,呵呵,不过我相信有了这个开始,越写会越好越顺吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值