8/15/2009

要去大陸了之複習(1)

24號即將要飛去深圳...來公司剛滿一個月就被派出去...還要負責3件case...

還滿無言的...hychen笑的很開心!!!!

總而言之,這次是個機會,但是真的實在是有點趕....

信用卡來不及辦...台胞證要落地簽證...沒出過國的我只有一個人去!!!!

超級的坎恪不安的啦...(還要去一個月....= =)

負責的案子相當陌生,除了BT外...山寨機的wifi porting...android porting等等

簡直要逼出我的潛能呀呀呀呀!!!!!!!!!

以下先來複習之前學習過的東東吧...

-------------------------------------------------------

PC通常一上電,第一個執行的是BIOS,它負責的事有:

1.所有硬體週邊初始化
2.遮罩所有的中斷
3.重新分配記憶體資源
4.引導到MBR開機磁區,MBR存放著作業系統的開機程序,此程序會跳到作業系統的初始化入口

其實bootload做的事跟BIOS差不多,但通常BIOS還有負責一些廠商的firmware設定等等其它作用,這些都是廠商的機密,而bootload是沒有像BIOS有這麼多功能的.

bootload是常駐在快閃記憶體(flash)或者是ROM的低階元件,當power on時,bootload會馬上取得控制權.

它主要是設計來執行低階的初始化作業 啟動影像檔載入及系統診斷,也可以包括target board的低階自我測試的程式,像是記憶體和輸出/輸入的測試.

最後,bootload裡會包含一小段程式,它會載入和移轉控制權到其它的程式,而這程式通常都是作業系統.

而這些不是今天的重點...我先把目標放在核心初始化...未來再來複習其它東西.

在不同的處理器架構,都會產出許多的共通檔案,其中有個叫vmlinux的二進位檔,而這個vmlinux就是核心的本尊了.

這vmlinux相當大,它可不可以直接放在嵌入式系統裡?答案是可以的,像是PowerPC架構和U-BOOT開機載入程序建置的平台,通常是可以直接啟動vmlinux影像檔的.(這我不太清楚好壞了...一般來說核心影像檔都是以壓縮的格式儲)

然而其它架構(像是ARM)和開機載入程序的組合,就需要建置適合的內文來整合其它的共用程序.

註:最常見的開機載入程序(bootload)就是U-Boot了,bootload跟硬體架構幾乎是密不可分的,所以不可能會有一個bootload可以適合多種平台架構(未來好像很難講!?)

什麼叫適合的內文?當開機載入程序取得控制權,並沒有準備好執行環境,直到開機載入程序初如化處理器和相關硬體之後才會有.

也就是說,當開機載入程序到執行作業系統的第一支程式(../init/main.c)時,如果沒有建立適合的內文及環境,是沒辦法執行main.c的.

因為開機載入程序取得控制權時是沒有任何堆壘或是堆壘指標,所以這時只要執行一個簡單的C程式,都會造成處理器當機,因為C的任何變數是儲存在stack上的.

這時你就知道為何要做成uImage檔了吧?會有u這個字,是因為U-BOOT的關係,而這個image檔,就是為了建立適合的環境以及低階公用常式,以便在特定架構中啟動核心.

影像檔是很複雜的,而且又有組合語言的關係,令我非常的難以理解...所以大家只要知道為何要做成影像檔就好.

其實真正的開機載入程序是有二層,其中開機載入程序在啟動時控制版子,它完全不依靠核心;而第二層bootstrap loader的主要功能像是介於開機載入程序及核心中間.

也就是說,bootstrap loader的責任是執行解壓縮和重新定位核心影像檔,以便提供核心在運作時有適合的環境.

像常看到成功載入核心時的一段訊息:

Uncompressing Linux...................done, booting the kernel.

這就是bootstrap loader成功解壓縮核心之後的訊息.

另外我要提到一個重點:

在移到核心時,所有的處理器暫存器所指向的邏輯位址,都是實體位址,可是當處理器暫存器以及核心的資料結構初始化之後,馬上就會受到處理器打開的MMU(記憶體管理單元)的影響,突然間,處理器所有能見到的位址空間,都變成了以虛擬位址定址所取代.

這也是為什麼寫driver時,通常都會利用ioremap或其它技巧來轉換實體位址的關係了(除非處理器沒有MMU的架構...之前常被搞死...終於知道原因了...T_T)

核心初始化的第一步,就是執行../init/main.c裡面的start_kernelo()的function,在這裡核心開始發展它的勢力!!!

其中,它呼叫了一個setup_arch(),很清楚的,它會辨識特定的處理器,然後提供一個機制來呼叫(setup_processor)特定處理器的初始化常式,可以在../arch/arm/kernel/setup.c看到.

其實核心初始化非常複雜,越瞭解下去就越煩...其中還有什麼核心命令列巨集等等....但我工作只是porting,深入瞭解對目前的我來說就未必有用,說不定還能因此鬱悶吐血身亡....所以點一點能止渴就好.

No comments:

Post a Comment