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