51WinCE-博客园分站

WinCE非官方Blog分站

导航

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

接着昨天的我们继续来总结面试时遇到的问题,首先再来一个面试中遇到的非技术类题,做为提神之用,快速回答,不得超过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:   

 

今天就看到这里。明天最后一个部分,驱动。

posted on 2010-02-09 00:41  MercuryXu  阅读(1339)  评论(0编辑  收藏  举报