您的位置:首页 > 职场人生

【原创】关于wince OS开发面试问题的总结系列之OAL

2010-02-09 00:41 921 查看
接着昨天的我们继续来总结面试时遇到的问题,首先再来一个面试中遇到的非技术类题,做为提神之用,快速回答,不得超过5分钟。
Q0:打水时,有一个5升的筒,一个3升的筒,如何打到4升的水?
-------------------------------------------------------------------------------------------------------------
昨天我们说到了bootloader,其实大家知道bootloader其实真正和wince系统的关系并不是非常大,在wince操作系统中,真正做为初始化工作的还是OAL函数集,这里需要区分一下OAL层和OAL函数集的概念,一下讨论的OAL开发,都是围绕着OAL函数集来说,首先就引出来两个问题。
Q1:OAL是什么?
A1:OAL(OEM Adaptation Layer)OEM适配层,还有一个引申出来的概念是PQOAL(产品质量级OAL),但我们一般都说OAL就可以了。其概念为逻辑上驻留在wince内核雨目标设备硬件之间的代码层,在物理上OAL于内核库链接起来产生内核可执行文件。或者也可以这样说,OAL是wince操作系统所基于的硬件平台上的核心硬件的驱动程序、所有设备驱动中的最大集合;
Q2:OAL主要做了哪些事情?
A2:OAL主要做了以下几件事情:1.Startup函数,2.串口调试,3.OEMINIT初始化,4.系统计时器,5.中断处理,6.内核的输入输出,7,kitl(可选),也就是说,OAL从startup函数开始一直运行到Kernlinit后,整个wince的操作系统才正式开始运作;
说道这里会引出一个cacheable和uncachable的问题,这个问题主要是牵涉到MMU以及一些速度上的事情。因为在这个阶段MMU还是需要工作,内存的读写又和cache有关系,所以必须得提出来,关于cache和mmu的概念我这里也给出来,供大家准备,以下又给出两个问题。
Q3:cache是什么?mmu是什么?
A3:cache:一个和CPU很近的高速存储器,用来存储一些不是经常变化的数据,提高速度。在经常改变的数据的时候不适合启用,否则效率会更低 比如我们访问GPIO等不能使用cached 地址,就是这个原因,经常替换,效率很低的。(这个东西,也是我们PC的CPU的重要指标)
MMU:用在多任务操作系统中,给每个任务提供独立的虚拟地址空间,其实现原理是:在主存中存贮页表等数据,通过MMU映射到CPU,然后CPU就可以使用虚拟地址调度任务,访问外设等,虚拟地址和物理地址映射是固定的,这样操作系统比较安全稳定。
Q4:cacheable和uncacheable的区别是什么呢?
A4:cache可以大大提高内存的读写速度,CACHE属性即是对这部分的虚拟地址的读写要使用cache功能,也就是说这部分的虚拟内存是cacheable的,反之,如果设定为UNCACHED属性,则说明虚拟地址的读写不适用cache,也就是uncacheable,其实两者的区别就是虚拟内存在使用时是否使用到cache;
Q5:那为什么有的时候用cacheable有的时候有用uncacheable呢?(不要嫌这个问题啰嗦,就是有一些考官很喜欢问这个问题)
A5:这是因为cacheable时,采用了虚拟内存雨cache连用,当然速度是提高了,但是存在的问题是,会造成内存尤其是IO口的读写数据的不可预计性,所以在操作系统内核中悬着使用uncache部分的静态映射虚拟内存;
以上关于cache和mmu的问题,大家如果想更细致的学习话可以参考以下的网站链接去进一步学习:
http://topic.csdn.net/u/20081231/10/BBDE79C2-2884-48E3-9718-90D7FCC1AFA8.html
http://so.csdn.net/BlogSearchResult.aspx?q=cache%20username:gooogleman
By:GOOOGLEMAN
接下来我们要继续来看我们的OAL下一步会问道什么问题,接下来一个比较重要的环节就是中断了,首先请大家先阅读HJB的关于wince的中断介绍,这篇文章我已经转过无数次了,非常简单易懂,对wince的中断分析的非常透彻,我这里就不多说,大家直接看文章,看完了我们来回答几个面试中碰到的题目,接下来的题目就更什么了。。。自己看。
http://www.cnblogs.com/we-hjb/archive/2009/05/26/1490461.html BY:HJB
Q6:什么是ISR?什么是IST?
A6:中断服务例程(ISR):处于内核中的低级处理程序,中断发生时首先被调用。中断服务线程(IST):处于驱动或者应用中的中断处理线程,由系统调度,完成大部分的中断处理工作。
Q7:什么是MDD?什么是PDD?IST在什么情况下开始工作,具体举例.
A7:MDD是MODEL DEVICE DRIVER的缩写,它是抽象了某一类外设共性的适合任何硬件平台的驱动程序代码,PDD是PLATFORM DEPENDENT DRIVER的缩写,他是反映了一个特定的硬件平台上的某外设的特性的驱动程序代码,IST在如下几种情况下会运行:1.MDD的INIT函数中,2.MDD的OPEN函数第一次被执行时,3.PDD中;
Q8:WaitForsingleObject函数的第一个参数是什么?描述下它的功能(不要感觉到恶心,我就没回答上来实在是紧张的想不出来了,平常用的还挺顺)
A8:DWORD WaitForsingleObject(HANDLE hHandle, DWORD dwMilliseconds),其功能是等待hHandle参数指定的对象,被触发或者dwMilliseconds参数指定的时间达到,hHandle可以是事件,互斥量,信号量,进程和线程五种;
接下来我们要说说时钟,pTOC,KITL和config.bib文件了,前三个内容我在面试的时候并没有遇到过,但是笔试到是考到了,最后一个是面试问道过,问的也很简单,看过一边config.bib文件都应该能答的出来,直接上题目,今天最后几道题目,看完了睡觉。呵呵。
Q9:为什么选择32768Hz做为RTC时钟呢?
A9:32768正好是1024的32倍,也就是说是2的10次方的倍数,比较好算而且是一个整数,方便操作;
Q10:TOC是什么?如何查看bin文件?
A10:TOC(Table Of Content)是整个Nand Flash中存储内容的一个列表,这里面储存了有关启动和系统内核的一些相关存储信息,需要写在Nand Flash的block1中由Nboot里的函数读取。之后Nboot会按照读取的内容进行配置和跳转到不同的地址。在bin文件中会有专门一个部分去描述toc的位置,如何查看呢,只需要在wince的编译环境下进入命令行状态,然后输入viewbin –toc nk.bin>output.txt 这样就能看到bin的内容,而且也把toc的内容也打印出来了。很方便;
Q11:KITL是什么?
A11:KITL是Kernel Independent Transport Layer的缩写,内核无关传输层,主要用来辅助调试驱动设备;
Q12:config.bib看过没有啊?什么样子的啊?(当时考官就这样问我。。。囧吧。)
A12:直接给一个config.bib出来看:

1:  ;


2:  ; Copyright (c) Microsoft Corporation.  All rights reserved.


3:  ;


4:  ;


5:  ; Use of this sample source code is subject to the terms of the Microsoft


6:  ; license agreement under which you licensed this sample source code. If


7:  ; you did not accept the terms of the license agreement, you are not


8:  ; authorized to use this sample source code. For the terms of the license,


9:  ; please see the license agreement between you and Microsoft or, if applicable,


10:  ; see the LICENSE.RTF on your install media or the root of your tools installation.


11:  ; THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.


12:  ;


13:   


14:  MEMORY ;定义了内存分配的相关设置,一般在BSP中的config.bib文件中。


15:   


16:  ;


17:  ; NK and RAM region definitions.


18:  ;


19:  IF IMGFLASH !


20:  #define    NKNAME    NK


21:  #define    NKSTART   80070000


22:  #define    NKLEN     02000000


23:   


24:  #define    RAMNAME   RAM


25:  #define    RAMSTART  82070000


26:  #define    RAMLEN    01E7F000


27:   


28:  ELSE


29:   


30:  #define    NKNAME    NK


31:  #define    NKSTART   88001000


32:  #define    NKLEN     05fff000 // 96mb less 4k


33:   


34:  #define    RAMNAME   RAM


35:  #define    RAMSTART  80070000


36:  #define    RAMLEN    03E7F000


37:   


38:  ENDIF ; IMGFLASH


39:   


40:      PTS            80000000       00020000     RESERVED


41:      ARGS           80020000       00000800     RESERVED


42:      SLEEPSTATE     80020800       00000800     RESERVED


43:      EBOOT          80021000       00040000     RESERVED


44:      EBOOT_STACK    80061000       00004000     RESERVED


45:      EBOOT_RAM      80065000       00006000     RESERVED


46:   


47:      $(NKNAME)      $(NKSTART)     $(NKLEN)     RAMIMAGE


48:      $(RAMNAME)     $(RAMSTART)    $(RAMLEN)    RAM


49:


50:      EFSBUF         83EEF000       00011000     RESERVED


51:      DISPLAY        83F00000       00100000     RESERVED


52:   


53:      ; For Windows CE, reserve FLASH only if IMGFLASH=1


54:      ; For Windows Mobile, always reserve it, for IMGFS


55:  IF IMGFLASH !


56:      FLASH          88000000       06000000     RESERVED


57:  ENDIF ; !IMGFLASH


58:  IF IMGFLASH


59:  IF IMGTPC


60:      FLASH          88000000       06000000     RESERVED


61:  ENDIF ; IMGTPC


62:  IF IMGPPC


63:      FLASH          88000000       06000000     RESERVED


64:  ENDIF ; IMGPPC


65:  ENDIF ; IMGFLASH


66:      EBOOT_CONFIG   880F0000       00010000     RESERVED


67:


68:  ; @CESYSGEN IF CE_MODULES_RAMFMD


69:   


70:  IF IMG_RESERVERAMFMD


71:      ; Set this variable to the size, in bytes, of memory discovered by


72:      ; OEMExtensionDRAM to reserve for the RAM FMD persistent storage


73:      ; driver.  This value must be a multiple of 4K.  Due to limitations


74:      ; in the implementation of RAMFMD, this value must be less than or


75:      ; equal to 32MB.


76:      g_dwExtensionRAMFMDSize   00000000    02000000      FIXUPVAR


77:  ENDIF   ; IMG_RESERVERAMFMD


78:   


79:  ; @CESYSGEN ENDIF CE_MODULES_RAMFMD


80:   


81:  ; This fix-up variable is a bitfield that can be used to initialize


82:  ; the OAL debug zones per oal_log.h.  Uncomment the line and


83:  ; change the hexidecimal bits to enable the desired zones.  The


84:  ; default value (0x0000000B) enables the OAL_LOG_ERROR,


85:  ; OAL_LOG_WARN, and OAL_LOG_INFO zones, and will be used by


86:  ; OEMInit if the line remains commented out.


87:  ;


88:  ;  nk.exe:initialOALLogZones     00000000 0x0000000B       FIXUPVAR


89:   


90:  ; This fix-up variable determines the amount of memory the BSP


91:  ; reserves for Watson dump capture.  The current default behavior is


92:  ; to default to zero unless the image has SYSGEN_WATSON_DMPGEN


93:  ; defined.  The default size is 300KiB.


94:  ;


95:  ; @CESYSGEN IF CE_MODULES_OSAXST0


96:  nk.exe:dwOEMDrWatsonSize  00000000   0x4B000               FIXUPVAR


97:  ; @CESYSGEN ENDIF


98:   


99:  CONFIG ;在最后的Makeimg阶段,为Romimage.exe提供一些生成WinCE image的配置属性。
              ;该项是可选的,一般也在BSP中的config.bib文件中定义。


100:   


101:  ; @CESYSGEN IF !NK_NKNOCOMP


102:      COMPRESSION=ON


103:  ; @CESYSGEN ENDIF !NK_NKNOCOMP


104:  ; @CESYSGEN IF NK_NKNOCOMP


105:     COMPRESSION=OFF


106:  ; @CESYSGEN ENDIF NK_NKNOCOMP


107:   


108:      KERNELFIXUPS=ON


109:   


110:      ; Multi-Region


111:      ;


112:  IF IMGFLASH !


113:      AUTOSIZE=ON        ; AUTOSIZE is used to enable the following flags.


114:  ENDIF


115:      DLLADDR_AUTOSIZE=ON


116:   


117:      ;AUTOSIZE_ROMGAP=10000


118:      ;AUTOSIZE_DLLADDRGAP=0


119:      ;AUTOSIZE_DLLDATAADDRGAP=0


120:      ;AUTOSIZE_DLLCODEADDRGAP=0


121:   


122:  IF IMGPROFILER


123:      PROFILE=ON


124:  ELSE


125:      PROFILE=OFF


126:  ENDIF


127:   


128:  IF IMGFLASH


129:  ROMSTART=88000000


130:  ROMSIZE= 06000000


131:  ROMWIDTH=32


132:  ENDIF ; IMGFLASH


133:   


134:  ;


135:  ; ROMFLAGS is a bitmask of options for the kernel


136:  ;   ROMFLAGS    0x0001      Disallow Paging


137:  ;   ROMFLAGS    0x0010      Trust Module only


138:  ;


139:


140:  IF IMGTRUSTROMONLY


141:          ROMFLAGS=10


142:  ELSE


143:          ROMFLAGS=0


144:  ENDIF


145:   


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

今天就看到这里。明天最后一个部分,驱动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: