参考资料:
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
前序:
自从2月1日正式提出离职到今天已经一个星期了,在这个一周的时间里面面试了几家公司,第一感觉都还是比较好的公司,很正规,应聘的职位是嵌入式软件工程师 wince os方向,经过几场面试下来,完全的无地自容,第一,三年工作下来,发现自己的基础知识仍然是薄弱,说起来好像什么都做过了,但是实际问起细节还是说不清楚,最悲哀的是智商都貌似变低很多,30秒之内回答这个问题:“长跑超过第二名,是第几名”。这样的幼稚园问题都不知道如何去作答,很尴尬。看到这个文章的朋友应该都能在10秒中之内回答的很清楚。
以下的文章对这类的考察智力的题目不在做过多说明,只希望大家不要像我工作的技术知识基础不牢固,连智商都工作的低了很多,这样就很亏,下面只对关于wince os方向嵌入式工程师开发面试做一些个总结,今天做一个大概的分析和关于bootloader方面的总结,在接下来的两天再对OAL和驱动两块进行一个分析。临近春节,祝大家新年快乐,希望通过这个文章能给和我一样正在找工作的和在年后准备找工作的朋友一点帮助。
正文:
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