参考资料:
1.《Windows CE 工程事件完全解析》 by:李大为
2.《Windos CE 实用开发技术》by:张冬泉 等
3.《Windows®Embedded CE 6.0 Fundamentals》
4.http://www.cnblogs.com/we-hjb/ HJB的WinCE blog
正文:
Bootloader
关于Bootloader,说过很多次了,我们就直接进入主题,在这段时间的面试 中,bootloader做为问题的次数出现过两次,一般考官会先问一下你对wince的整体结构有什么认识,个人感觉这个问的有些太大了,特别是面试的 时候来问,但是考官们会很喜欢问这个问题,所以不管个人感觉如何,能说多少是多少,具体的大家可以参考《Windows®Embedded CE 6.0 Fundamentals》中76页的图3-1来说,这里我做个简单的描述,具体如下:
做为一个完整的wince嵌入式设备系统,当 然,有一套完整的硬件做为支撑,硬件包括CPU,RAM,ROM以及一系列的I/O Device.在此基础上,我们就可以构建我们的软件平台,最初一层的是kernel,也就是内核层,这一层的开发也就是针对嵌入式软件工程师 wince os方向开发的一个主要目标层,在这一个层次的开发中,我们会遇到一个bootloader的开发,这个功能部分主要起到引导系统工作的作用,通常在上电 或者复位后马上进行,后面我们详细说一下,完成了bootloader,系统的镜像将会被加载,也就是内核层开始,内核层主要的接口有两个,一个是 OAL,也就是OEM适配层,另外一个是Device Driver层,OAL层的硬件层对象是CPU,RAM和ROM,然后牵涉到一些基本通讯调试的I/O,例如串口,Device Driver层主要面向的是触摸,SD卡接口,串口,音视频输入输出以及LAN等设备,在Kernel层中我们还需要处理到一些内核中设备的管理,文件系 统的管理,GWES图形环境的处理,网络等(这里能说多少说多少,不能确定的不要说了。说不出来就等等过去),这一部分就基本上处理到整个系统内核成功建 立,完成了这个部分就进入用户处理层,也就是USER PROCESSES这个层次上,这个层次主要是针对应用程序开发,也就是关于WINCE APP开发工程师需要进一步了解的东西,这里我们也需要对其进行了解,这个地方主要牵涉到一个wince api的接口,同时有系统界面的处理,进程线程服务控制处理,设备使用,在此基础上的一系列的应用开发。
做答完毕上面 一个问题,我们来详细的看看bootloader,这个bootloader我们反复说过多次,可能是我个人实在太愚笨在加上考场上比较紧张,考官的口音 有点跟不上(我承认是我广东话的却呒没学好,实在是听有些听唔懂,有机会得恶补广东话嘅),前段时间还写文章分析过,说起来还是丢三落四的,很无语,下面 再来过一边,结合考过的例子,反复说多说几遍就熟悉了。呵呵,以下问题均基于wince来说。
Q1:bootloader是什么?
A1:bootloader 是在wince内核程序启动前的一小段引导程序,用来引导系统内核的启动,bootloader的种类还是比较多的,有nboot eboot uboot等等,但目的都是用来引导系统从上电或者复位进入正常工作状态的一段小程序,一般建议存放在flash中;
Q2:一般来说,bootloader运行的第一句话是什么?整个bootloader过程中做了哪些事情?
A2:第一句话是startup()函数的运行,在startup中,主要做了如下工作:清空TLB和cache,关闭中断,配置PLL,配置内存控制器等;
Q3:刚才你回答了要在bootloader中的startup关闭中断,这是为什么呢?
A3:这个是wince系统设备的一个约定,关闭中断是把整个ARM设备开发简易化,所有的外设中断请求(IRQ)全部关闭,ARM就变成了一个相对不太复杂的单片机,开发起来难度会比原先降低很多,中断打开反倒会使得整个系统的开发复杂度上升;
Q4:startup的作用是什么?
A4:1.对cpu进行简单的初始化,类似于BIOS的功能;2.将自身bootloader加载到RAM中;
Q5:说说MMU是什么,大概描述下其工作的原理?MMU在什么时候开始工作?
A5:MMU 是用在多任务操作系统中,给每个任务提供独立的虚拟地址空间,其实现原理是:在主存中存贮页表等数据,通过MMU映射到CPU,然后CPU就可以使用虚拟 地址调度任务,访问外设等,虚拟地址和物理地址映射是固定的,这样操作系统比较安全稳定,其转换地址的依据是根绝g_oalAddressTable这个 数组来确认。其工作是在startup初始化完成时钟,并建立完成指针堆栈的时候将MMU打开;
Q6:bootloader的大小如何确定?
A6:一般可以参考在对应boot代码路径下的boot.bib文件中有定义其大小;
Q7:bootloader为什么有的是nb0,有的是bin文件?有什么区别,如何确定使用的是nb0还是bin文件?
A7:bin 为记录式镜像,nb0为原始镜像,前者是单位组织的镜像数据,后者是二进制数据的镜像快照,说通俗写bin是压缩后的nb0,使用nb0还是bin主要是 根绝DownloadeImage函数中进行区分,一般来说,在此函数中会将image的起始7个字节与特征值进行比较,特征值有6个,分别代表 bin,nb0,带数字签名的bin,带数字签名的nb0,MULTXIP,MANIFEST。一般采取如下方式进行区分
if (!memcmp (hdr, "N000FF\x0A", BL_HDRSIG_SIZE)) 其中N000FF\x0A是特征值,hdr是获取到的头7个字节;
以下给出6个特征值做为本次总结的结束
N000FF\x0A=BL_IMAGE_TYPE_MANIFEST
X000FF\x0A=BL_IMAGE_TYPE_MULTXIP
B000FF\x0A=BL_IMAGE_TYPE_BIN
S000FF\x0A=BL_IMAGE_TYPE_SIGNED_BIN
R000FF\x0A=BL_IMAGE_TYPE_SIGNED_NB0
None=BL_IMAGE_TYPE_UNKNOWN
来源:http://www.cnblogs.com/mercuryxu/archive/2010/02/09/1666152.html