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