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