韓占偉
(淮北職業技術學院 計算機科學技術系,安徽 淮北 235000)
?
嵌入式設備的Linux內核移植研究
韓占偉
(淮北職業技術學院 計算機科學技術系,安徽 淮北235000)
摘要:嵌入式設備在生活中扮演者越來越重要的角色,而Linux內核是Linux操作系統的核心。Linux操作系統能夠提供豐富的應用功能和豐富網絡功能都是在Linux內核提供的基礎功能上實現的。在Linux操作系統的支持下,嵌入式設備的應用開發更加的豐富和完善。Linux內核移植的需求分析、環境搭建、詳細設計等內容是嵌入式開發重要環節。
關鍵詞:Linux內核;嵌入式設備;Linux操作系統
Linux 內核是Linux 操作系統的核心部分,包含了操作系統的文件管理、進程管理、內存管理等,并且還加入了對許多外部設備的驅動支持。Linux 內核主要有5個模塊構成,它們分別是:進程調度模塊、內存管理模塊、文件系統模塊、進程間通信模塊和網絡接口模塊。[1]Linux內核的移植是嵌入式應用開發過程必不可少的環節。對于各種類型的嵌入式設備,這里的Linux 內核卻可以通過豐富的驅動和豐富的庫函數來支持不同類型的嵌入式設備。
一、Linux內核移植設計分析
(一)需求分析
Linux內核介于設備硬件驅動和系統調用接口之間,對Linux操作系統提供了最核心的功能支持。[2]Linux內核對x86、arm等很多的主流硬件架構都提供了支持,并且在內核的drivers目錄里包含了很多的設備驅動代碼文件。以上的優勢讓Linux操作系統逐漸成為嵌入式應用開發中使用較多的操作系統。Linux內核在移植過程中需要實現對嵌入式CPU的支持、對板卡的支持和對各種外設的支持。下面通過對Linux目錄的分析來說明Linux內核在移植過程中需要處理的相關內容。

圖1 Linux操作系統結構圖
(二)Linux內核的目錄及編譯過程
Linux內核的移植是一個復雜的工作,要對內核的目錄和編譯過程有深入的了解。Linux內核實現了對許多類型架構cpu和主板的支持。在Linux內核目錄里面有很多的子目錄,每一個子目錄里面有很多的代碼相關文件和下一級子目錄,要進行移植的話就要對Linux內核的目錄結構熟悉。Linux內核具體的目錄包括:
arch目錄:Linux內核對硬件體系架構的支持代碼,對于支持的每個架構的cpu都有一個對應的子目錄。
Block目錄:塊設備的通用函數,是所有塊設備的通用功能函數的封裝,具體細節功能的實現在drivers目錄里有相應的設備驅動代碼。
crypto目錄:對操作系統需要的一些壓縮和CRC校驗算法的實現和支持。
drivers目錄:內核所有支持類型設備的驅動目錄,每一個子目錄里對應一類接口或類型設備,每一個子目錄里又包含了很多同一類型的不同功能類型的設備,比如usb目錄里面包含了usb接口的攝像頭設備、存儲設備、打印設備,等等。
fs目錄:Linux支持的文件系統的代碼,是Linux能夠識別和使用各種類型文件系統的實現代碼。
include目錄:配置內核需要的頭文件。該目錄里包含了各種體系相關的頭文件、各種類型設備的驅動或功能部件的頭文件。
init目錄:內核的初始化代碼。[3]
ipc目錄:進程間通信的實現代碼,通過它可以實現對Linux進程之間進行通信的功能。
Kernel目錄:內核管理的核心代碼。
lib目錄:內核用到的一些庫函數代碼。
mm目錄:通用的內存管理代碼。
net目錄:包含內核對網絡功能支持的實現代碼,每個子目錄里對應網絡的一個方面。
security目錄:系統安全和密鑰的相關代碼文件。
sound目錄:音頻設備的驅動程序。
usr目錄:制作initrd鏡像的代碼文件,它的作用是內核在引導時提供臨時的根文件系統的作用。
Documentation目錄:內核相關的幫助文檔文件,包含了內核功能相關的說明文件。
Scripts目錄:用于配置、編譯內核的腳本文件。
Linux內核的編譯過程:
Linux內核目錄里面包含了很多的Makefile文件和配置文件.config。配置文件.config在配置內核時生成。所有Makefile文件(包括頂層目錄及各級子目錄)都是根據.config來決定使用那些文件。頂層目錄的Makefile文件是所有Makefile文件的核心,從總體上控制著內核的編譯和連接。而很多對應的cpu類型的目錄和各種類型的外設子目錄等里面都包含有Makefile文件。子目錄的Makefile文件主要是對當前目錄內的相關代碼文件和頭文件編譯過程的控制,它決定所在目錄下哪些文件將被編譯進內核,哪些文件將被編譯成模塊。編譯的內容最終組成一個針對這種特定硬件組合的Linux內核。
(三) Linux內核移植的交叉編譯技術環境的搭建
由于Linux內核對應于不同的設備生成的內核映像文件是不同的。尤其是嵌入式設備由于自身硬件架構的不同、外部設備類型的多樣性以及Linux內核的可裁剪性使得生成的Linux內核映像文件與PC上的Linux內核映像文件相差很大。需要使用專門針對于對于嵌入式設備開發的編譯工具來完成,但是嵌入式設備一般不使用鍵盤和鼠標作為輸入輸出設備,造成了在嵌入式設備上對Linux內核代碼文件進行修改和Linux內核的編譯非常困難。于是通過直觀便利的PC技術結合交叉編譯的工具來實現對嵌入式設備Linux內核的修改和編譯。基于windows界面的交叉編譯工具相對來講價格較高并且配置比較麻煩,本文使用基于Linux操作系統的交叉編譯工具,這種方式不需要支付額外的開發工具購買的成本、配置比較簡單,運行也更加高效。Linux內部的編譯工具效率很高,但是對于習慣使用圖形界面工具的人們來說很不習慣。
常用的辦法是使用一臺臺式機,在臺式機上安裝windows操作系統,并在windows操作系統的基礎上通過虛擬平臺軟件虛擬出一臺具有Linux操作系統的虛擬機器。讓安裝windows操作系統和虛擬機中的Linux操作系統能夠通過網絡傳輸工具實現文件的傳輸。嵌入式設備通過JTAG接口、usb接口、網卡接口等方式與電腦相連。這樣就構成了主機和目標機連接的交叉開發模式。
(四)Linux內核移植的詳細設計
Linux內核的移植一般分為四個部分:對CPU Core(CPU核心)的支持、CPU的支持、對SOC片上系統的支持(類似于電腦的主板)、外圍設備驅動程序開發。
首先要從Linux內核的官方網站http://www.kernel.org/下載需要進行移植的Linux內核并進行解壓。
$ cd /path/to/ destination (內核存放目錄)
$ tar xjf linux-2.6.22.6.tar.bz2(解壓內核文件)
$ cd /path/to/ destination/ linux-2.6.22.6
內核移植的具體步驟如下:
(1) 對嵌入式設備硬件系統進行熟悉了解
進行移植時要先對嵌入式硬件相應的內容進行熟悉,包括電路圖和要移植嵌入式設備的CPU和各種外設的芯片手冊、CPU體系結構及匯編語言的使用方式,了解板卡的地址空間分布情況,掌握CPU的通用寄存器和集成在微控制器內的外設寄存器、了解硬件的原理圖等內容。對各個外設的控制寄存器的功能,尤其是對控制寄存器各個二進制位的作用和取值情況進行對應,對芯片工作的時序圖能夠理解。
(2) 建立交叉編譯環境
可以根據需要使用的GCC編譯器版本和GNU發布的libc庫的版本下載已經制作好的,也可以從網上下載源碼進行制作。例如:
$ cd /path/to/ destination (工具鏈存放目錄)
$ tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
然后在環境變量PATH中增加它的路徑,以后就可以直接使用里面的編譯工具對程序進行編譯了。
$export PATH=$PATH:/work/tools/ gcc-3.4.5-glibc-2.3.6/bin
(3) 編寫Bootloader
Bootloader的主要作用是:
第一,對嵌入式硬件系統進行基本的初始化,包括關閉看門狗,關閉中斷,設置CPU的工作頻率,RAM內存的初始化等;第二,獲得硬件的參數保存下來并把它傳遞給內核,包括ip地址、串口波特率、要傳遞給內核的命令行參數等;第三,準備好內核運行的軟件環境并引導Linux內核,主要包括把內核鏡像和根文件系統映像從FLASH上讀入RAM中,設置好堆棧空間等。
(4) 對Linux內核的裁剪
Linux內核的特點就是可以進行裁剪,可以根據需要修改內核的配置文件,進行對內核中多余的內容進行去除,只保留內核最基本的功能。從而實現內核的簡潔和高效,根據嵌入式開發板對應的CPU型號、板卡型號、各種外設型號等等進行修改配置文件,通過命令的方式進行編譯出適合對應開發板的內核。
$ cd /path/to/linux-2.6.22/ (進入內核主目錄)
$ cp config_ok .config(config_ok為修改好的配置文件)
$ make uImage (生成uImage文件,為嵌入式設備使用的內核映像文件)
(5) 建立根文件系統
Linux內核運行時需要掛載臨時的根文件系統,但是Linux內核中沒有硬盤設備的驅動(種類太多,驅動會大大增加內核的大小),于是在內存中使用軟件技術虛擬出臨時的根文件系統(initrd RAM磁盤),里面包含了各種可執行程序和驅動程序,通過虛擬的臨時根文件系統的驅動識別塊設備后,就會將initrd RAM磁盤卸載,并釋放內存。
對于嵌入式設備一般使用NAND Flash作為大容量存儲設備。NAND Flash設備由于自身的一些缺陷問題,比如字反轉等問題的存在,需要使用專用的文件系統來進行管理。YAFFS就是一種類似與JFFS/JFFS2、專門為NAND Flash設計的嵌入式文件系統。我們要對YAFFS文件系統進行移植。
操作步驟:
從http://www.alep1.co.uk/cgi-bin/viewcvs.cgi/獲得源代碼文件。進行解壓保存。
$ cd /path/to/ yaffs (進入保存YAFFS源代碼的目錄)
在yaffs目錄下有一個腳本文件patch-ker.sh來給內核打補丁。
$ . /patch-ker.sh c /work/system/linux-2.6.22.6
(6) 驅動開發
這里主要是一些外設的驅動,可以參照在Linux內核目錄中同類型的設備驅動進行修改。對于一些新型的外部設備或系統沒有實現支持的設備類型需要自己參考外部設備的芯片手冊和SOC系統的電路圖進行編寫,內容比較繁瑣和復雜,這里不做討論和研究。
二、 結論
Linux內核移植是一個復雜的過程,即使是同一塊開發板,同一型號的CPU由于外部設備的不同也不能夠進行直接的移植,也要進行相應的修改。尤其對于一些未實現支持的CPU類型來說就更加的困難,需要對CPU內部的寄存器及電路連接情況有深入的了解。本文闡述了常規的Linux內核的移植過程,以期讓讀者對Linux內核的移植步驟、內核的目錄及編譯過程有所了解。
參考文獻:
[1]趙炯.Linux內核完全注釋[M].北京:機械工業出版社,2004.
[2]陳莉君.Linux操作系統內核分析[M].北京:人民郵電出版社,2000.
[3]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
責任編輯:凈草
收稿日期:2016-06-05
基金項目:本文系安徽省高等學校省級質量工程項目“計算機應用技術專業綜合改革試點”(編號:2013zy110) 、淮北職業技術學院質量工程項目“軟件技術教學團隊”(編號:2014jxtd-02)和淮北職業技術學院質量工程項目“技能型信息人才實踐教育基地”(編號:2014jyjd-01)階段性研究成果。
作者簡介:韓占偉(1980-),男,安徽淮北人,助教,研究方向為嵌入式技術。
中圖分類號:TP368.1
文獻標識碼:A
文章編號:1671-8275(2016)04-0131-03