基于ARM9的嵌入式Linux代碼移植
(2)修改已有的代碼。如前所述,Linux已經(jīng)可以在多種體系結(jié)構(gòu)中運(yùn)行,那么,我們可以參考相近的體系結(jié)構(gòu)的代碼,只修改與我們的目標(biāo)硬件平臺(tái)不同的部分即可。這種方法的難點(diǎn)在于開發(fā)人員除了要了解目標(biāo)硬件平臺(tái)外。還必須對(duì)已支持的軟硬件有一個(gè)較好的理解。本次研究的移植工作就是采用了這種開發(fā)方法。
3.3 內(nèi)核移植方法
對(duì)于系統(tǒng)移植而言,Linux實(shí)際上是由兩個(gè)比較獨(dú)立的部分所構(gòu)成,即內(nèi)核部分和系統(tǒng)部分。通常啟動(dòng)一個(gè)Linux系統(tǒng)的過程為:一個(gè)不隸屬于任何操作系統(tǒng)的加載程序?qū)inux部分內(nèi)核調(diào)入內(nèi)存,并將控制權(quán)交給內(nèi)存中Linux內(nèi)核的第一行代碼,這樣就完成了加載程序的工作。此后Linux要將自己的剩余部分全部加載到內(nèi)存,初始化所有的設(shè)備,在內(nèi)存中建立好所需的數(shù)據(jù)構(gòu)(有關(guān)進(jìn)程、設(shè)備、內(nèi)存等)。此時(shí),內(nèi)核已經(jīng)可以控制所有硬件設(shè)備。而后轉(zhuǎn)入系統(tǒng)部分,操作并使用這些硬件設(shè)備。接下來內(nèi)核加載根設(shè)備并啟動(dòng)init守護(hù)進(jìn)程,init守護(hù)進(jìn)程會(huì)根據(jù)配置文件加載文件系統(tǒng)、配置網(wǎng)絡(luò)、服務(wù)進(jìn)程及終端等。一旦終端初始化完畢,我們就會(huì)看到系統(tǒng)的歡迎界面了。概括說來,一部分內(nèi)核初始化和控制絕大部分硬件設(shè)備,為內(nèi)存管理、進(jìn)程管理、設(shè)備讀寫等做好一切準(zhǔn)備工作;另一部分系統(tǒng)加載必需的設(shè)備,配置各種環(huán)境以便用戶可以使用整個(gè)系統(tǒng)。本文引用地址:http://m.butianyuan.cn/article/151761.htm
圖2所示為L(zhǎng)inux內(nèi)核硬件相關(guān)結(jié)構(gòu)??梢钥闯觯琇inux內(nèi)核中與具體硬件平臺(tái)相關(guān)的結(jié)構(gòu)主要分為兩個(gè)部分:與具體的處理器結(jié)構(gòu)相關(guān)的部分,包括中斷處理、內(nèi)存操作以及進(jìn)程控制等;與具體外設(shè)關(guān)系密切的部分,包括硬件驅(qū)動(dòng)與I/O設(shè)備。
內(nèi)核移植由五個(gè)功能部分組成:進(jìn)程管理(包括調(diào)度和通信)、內(nèi)存管理、設(shè)備驅(qū)動(dòng)、虛擬文件系統(tǒng)與網(wǎng)絡(luò),它們之間存在復(fù)雜的調(diào)用關(guān)
系。前三部分按從前到后的順序,越靠前代表它們與硬件設(shè)備的相關(guān)程度越高,后面的虛擬文件系統(tǒng)和網(wǎng)絡(luò)則幾乎與平臺(tái)無關(guān),它們由設(shè)備管理中所支持的驅(qū)動(dòng)程序來提供底層支持。因此,在做內(nèi)核移植的時(shí)候,需要改動(dòng)的就是進(jìn)程管理、內(nèi)存管理和設(shè)備管理中被獨(dú)立出來的那部分即硬件相關(guān)部分的代碼。在Linux內(nèi)核源代碼樹中,這部分代碼全部在areh目錄下,主要是被內(nèi)核直接調(diào)用的底層支持部分。這些代碼重寫了內(nèi)核所需調(diào)用的所有函數(shù),因?yàn)榻涌诤瘮?shù)是固定的,所以這里更像是為硬件平臺(tái)編寫API。
3.4 內(nèi)核移植過程
首先在通用計(jì)算機(jī)上編寫程序,然后通過交叉編譯生成可在目標(biāo)平臺(tái)上運(yùn)行的二進(jìn)制代碼格式,最后再下載到目標(biāo)平臺(tái)計(jì)算機(jī)的特定位置上運(yùn)行。Linux內(nèi)核移植過程如下:
(1)建立移植所必須的交叉開發(fā)環(huán)境。需準(zhǔn)備兩臺(tái)計(jì)算機(jī),一臺(tái)用作修改編譯Linux內(nèi)核,另一臺(tái)用作移植Linux內(nèi)核。
(2)編寫和修改Linux內(nèi)核。在通用計(jì)算機(jī)上修改和編寫新的內(nèi)核代碼,編譯出新的Linux內(nèi)核。
(3)調(diào)試新的Linux內(nèi)核。將編譯后生成的新Linux內(nèi)核加載到目標(biāo)計(jì)算機(jī)上進(jìn)行運(yùn)行和調(diào)試,這個(gè)調(diào)試的過程就是交叉調(diào)試。
調(diào)試器是一個(gè)單獨(dú)運(yùn)行著的進(jìn)程,它通過操作系統(tǒng)提供的調(diào)試接口來控制被調(diào)試的進(jìn)程。在Linux內(nèi)核移植過程中,調(diào)試時(shí)采用的是在宿主機(jī)和目標(biāo)機(jī)之間進(jìn)行的交叉調(diào)試。交叉調(diào)試有多種方法,它有一些典型特點(diǎn):
◇調(diào)試器和被調(diào)試進(jìn)程通常運(yùn)行在不同的機(jī)器上(注:Linux內(nèi)核作為操作系統(tǒng)內(nèi)核,不同于普通進(jìn)程,但在交叉調(diào)試中作為被調(diào)試對(duì)象,與普通進(jìn)程沒有區(qū)別),一般調(diào)試器運(yùn)行在PC或者工作站主機(jī)(宿主機(jī))上,而被調(diào)試的進(jìn)程則運(yùn)行在各種專業(yè)調(diào)試板(目標(biāo)機(jī))上。調(diào)試器通過某種通信方式與被調(diào)試進(jìn)程建立聯(lián)系,如串口、并口、網(wǎng)絡(luò)、DBM或者專用的通信方式。本次移植采用了串口和JTAG兩種方式與目標(biāo)機(jī)進(jìn)行通信。
◇在目標(biāo)機(jī)上一般會(huì)具備某種形式的調(diào)試代理,它負(fù)責(zé)與調(diào)試器共同配合完成對(duì)目標(biāo)機(jī)上運(yùn)行著的進(jìn)程的調(diào)試。這種調(diào)試代理可能是某些支持調(diào)試功能的硬件設(shè)備(如 DBI2000),也可能是某些專門的調(diào)試軟件(如 gdbserver)。本次移植使用的是GDB―Stub。
◇如果目標(biāo)機(jī)是某種形式的系統(tǒng)仿真器,通過在宿主機(jī)上運(yùn)行目標(biāo)機(jī)的仿真軟件,整個(gè)調(diào)試過程可以在一臺(tái)計(jì)算機(jī)上運(yùn)行。雖然此時(shí)物理上只有一臺(tái)計(jì)算機(jī),但邏輯上仍然存在著宿主機(jī)和目標(biāo)機(jī)的區(qū)別。本次移植沒有使用系統(tǒng)仿真器。調(diào)試時(shí),作為調(diào)試器的GDB運(yùn)行在宿主機(jī)上,相應(yīng)的GDB―Stub運(yùn)行在目標(biāo)機(jī)上。GDB通過串口或者網(wǎng)絡(luò)與GDB―Stub進(jìn)行通信,發(fā)出指令控制、訪問運(yùn)行在目標(biāo)硬件平臺(tái)上的新的Linux內(nèi)核,讀取Linux內(nèi)核的當(dāng)前狀態(tài),并能夠改變Linux內(nèi)核的運(yùn)行狀態(tài)。
經(jīng)過多次移植測(cè)試后,就在基于ARM920T核的53C24lO處理器為核心處理器的ARM9平臺(tái)上成功移植了Linux操作系統(tǒng)。
4 結(jié)束語
文中闡述了在基于ARM920T核的53C2410處理器為核心的ARM9平臺(tái)上移植Linux操作系統(tǒng)的環(huán)境、方案和過程,對(duì)移植的難點(diǎn)進(jìn)行了重點(diǎn)分
析,這對(duì)ARM9平臺(tái)上的嵌入式Linux移植具有較好的實(shí)用價(jià)值和參考價(jià)值,同時(shí)對(duì)于其它平臺(tái)上的嵌入式Linux移植的方法也具有一定的借鑒意義。
評(píng)論