連載:編譯移植內核入門初探

火星人 @ 2014-03-12 , reply:0
←手機掃碼閱讀

  

     Timesy公司在其24,25期的播客里,向大家講述了怎樣把一個Linux內核植入到一個新的硬體中。筆者以支持ARM的硬體產品為例,教給大家如何去選擇內核,交互性編譯器,以及怎樣啟用引導程序,識別機器ID及設備映射。


尋找合適的內核(24期開始)
     筆者從kernel.org下載主體版本內核。一般,該版本不包括主板外圍設備的驅動,但是如果內核支持大多數或者是研發者僅使用外圍設備的一部分,那麼他們就會使用這種內核。筆者還會使用最新內核版本,其中包括最新修復的優點,功能更新,安全更新等。一旦選定了內核的大版本,就不會再更換版本。
     如果有太多不支持的硬體,那麼建議採用晶元廠家推薦的內核。如果版本過期了,他們會在內核樹之外編譯驅動代碼,以用於特殊的主板。不過最起碼的是會在內核頁眉文件和廠商提供的主板驅動之間作協調。
其它的內核資源還包括致力於特殊處理器,特徵,功能或者是主板的開源工程。最後,開發者可能需要從kernel.org, semi vendor,以及開源站點三個地方來獲取資源。


像一個程序員那樣去編譯內核
     研發者可以使用一些工具把內核和整個系統聯接在一起。交互性編輯器就是其中之一,或者是GCC版本,再或者是試用一些交互性工具的方案。由於很多使用者反映越來越難找到針對特定處理器優化的編譯器,那些針對各種處理器的商業編譯程序越來越收到歡迎。優化對提高硬體設備的性能速度很重要,一般研發者沒有必要使用C語言函數庫,因為內核是獨立的,所以已經包含了printf和printk。


內部架構和功能模塊
     一旦內核和工具鏈準備完畢,研發者就會著手於內核的內部架構。首先是以文件系統模塊開始,由於內核中編譯的文件系統模塊通常佔用很多內存,所以需要去掉。一般研發者沒有必要修改文件系統,但是他們可以添加一些自己需要的模塊。
在內存管理之後,將是支持程序管理和進程管理的功能模塊。然後,研發者就要著手於設備控制了,它一般包括網路,特徵和模塊類型。不過幸運的是,semi的廠商已經對內核支持進行了處理,而且很難被更改。


引導程序(25期開始)
     接下來是植入內核,也就是配置引導程序。它將引導內核進入內存,然後開始運行。如果內核被壓縮了,開發者可能會運行一個編譯過的解壓縮內核,所以引導程序知道內核應該放到哪個位置。一些程序,尤其是Gzip,會佔用很多內存,它們會擴展內核,然後重新運行啟動編碼。在這之後,內核高水平的啟動程序如配置設備,這些程序會映射中斷處理器,啟動內存管理器。


面向不同處理器的機器代碼
     下一步是在Linux內核樹里找合適的機器代碼。在"arch"子目錄里,有一些特殊架構和處理器的文件夾,研發者可以重新使用和修改裡面的所有代碼。其中在ARM文件夾里,用戶可以找到MAC子目錄,它包括特殊的處理器子目錄,內有初始化的機器代碼。研發者也可以看一下ARM文件夾里包括的其它子目錄,它們主要儲存了用於特殊平台的定義和文件頁眉。
     內存管理器已經啟用了特殊架構的機器代碼,所以任何一個地址都是一個有效的物理地址。引導程序留下了一些痕迹以便於開發者觀察結果,典型的方法就是在寄存器中留下特定的值。


設備映射
     為了映射設備,開發者可以:為新的驅動修改內核;在性能上修改已經存在的驅動;再或者是採用第三方驅動設備。首先,設備要先註冊。每一台設備都有唯一的標識符,內核就用這個來為設備分配特定的連接代碼。對於ARM的用戶來說,設備ID被存儲在單一的文件里,路徑為arch/arm/tools/mac。如果涉及到的平台做得很全面,那研發者就不用再來修改設備ID了。不過如果是一個新的主板,那就需要加入新的ID。
     有時,引導程序在註冊表裡存儲著設備ID的值,.所以,當導入時,內核能夠檢測出ID。內核根據這個值,可以給每一個設備執行不同的初始化程序。開發者也可以用一個二進位內核模塊來支持多種設計。


ARM目錄架構
      如果用戶需要修改、刪除、或者是替換文件,那麼植入進程就插入了很多內核子目錄。例如,在Mm子目錄里提供了內存管理的獨立代碼,主要是用於初始化緩存區內未被內存直接存取的程序。
     內核子目錄還包括主初始化代碼,這個主要用於內核的啟動程序,比如說定義了不同的API的系統代碼,還有用於內核初始化的彙編語言。如果研發者想在設備驅動上更深一步的工作,在其它子目錄里的部分代碼可以滿足他們的需求。在"lips"子目錄里,包括字元串的處理、內存複製以及輸入/輸出命令。如果有一些特殊的中斷處理或者是調度需要,那麼目錄里會有一些可以修改的幫助功能。
     研發者可能要準備連接設備的串口。如果研發者想改變主板的串口,那就需要看一下把串口映射到物理存儲地址的代碼。代碼通常分別處在子目錄和因不同處理器而異的目錄中。


設備檢測
     初始化串口之後,Linux內核開始檢測設備ID,然後調用一些函數。還有一個設備啟動架構,它定義了一些信息,如中斷映射的維護、指示等,另外還有設備初使化的進程名稱。其實在理論上,研發者可以複製默認的輸入/輸出映射表,但是如果主板要求改變特殊的引導參數時,那麼就需要改變默認的函數。有一個函數調用了一個設備啟動代碼,它定義了設備和中斷如何被調用。對中斷的定義通常在include文件(也可以翻成包含文件)以及因處理器而異的irq頭文件中。如果開發者想接收一個新的設備或者是改變設備的連接,那他們就專需要重組中斷映射表

      開發者應該檢查一下內存映射,它用來定義設備如何與處理器交換信息。開發者應該堅持用默認值,除非他們想讓系統匯流排來連接不同的外設,這就需要重新定義內存映射表。總的來說,在從零開始編譯代碼之前,最好還是著眼於主板提供的信息。

 

為保護翻作者權益,轉載本站點內容時請註明來自www.linuxeden.com-Linux伊甸園。如不註明,www.linuxeden.com將根據《互聯網著作權行政保護辦法》追究其相應法律責任。(責任編輯:bolibei)






[火星人 via ] 連載:編譯移植內核入門初探已經有138次圍觀

http://www.coctec.com/news/soft/show-post-70476.html