【原創】關於wince OS開發面試問題的總結系列之Bootloader

參考資料:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章