• 【原创】关于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:   

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

  • 相关阅读:
    Ubuntu安装php7.0环境
    PHP-FPM参数详情
    phpize是干嘛的
    Ubuntu忘记密码
    Ubuntu下面删除和卸载软件
    Js验证正则表达式
    JS发送验证码;并设置cookie
    Shell脚本之sed的使用
    Bash基本功能:输入输出重定向
    shell常用快捷键
  • 原文地址:https://www.cnblogs.com/mercuryxu/p/1666152.html
Copyright © 2020-2023  润新知