胡恩博
摘要:首先簡要闡述了Linux OS的內核目錄及結構,之后詳細描述將嵌入式Linux OS移植到SAMSUNG ARM 920T為內核的S3C2440AL-40芯片上的流程。通過移植流程的分析與研究,總結及優(yōu)化了基于此類芯片向該類硬件平臺移植Linux內核的方法,為改進OS的設計提供了重要參考,具有重要的應用價值。
關鍵詞:移植;ARM;嵌入式;嵌入式操作系統(tǒng);Linux
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1007-9416(2017)03-0044-02
1 引言
EOS(Embedded Operation System,EOS),即嵌入式操作系統(tǒng)。是一種用途廣泛的系統(tǒng)軟件,是基于軟、硬件的廣義概念,它負責分配軟件與硬件資源、進行任務調度、控制協調并發(fā)活動等任務,具有強實時性、代碼固化、可裁剪、便于移植等特點。當前比較流行的EOS主要有Linux、uCLinux、WinC、VxWorks、uC/OS-Ⅱ QNX等,而尤以Linux的通用與應用性最為突出。在嵌入式芯片上則以ARM為代表。故以下研究的是將嵌入式Linux OS移植到SAMSUNG ARM 920T為內核的S3C2440AL-40芯片的硬件平臺上,與傳統(tǒng)的移植方式不同之處在于BootLoader獨立編寫,并且給出了有針對性的、完整的編寫流程,而非直接使用系統(tǒng)U-Boot。
2 Linux內核源碼目錄結構
Linux內核為系統(tǒng)核心組件,雖然版本眾多,但主要模塊不外乎內存管理、進程調度、文件系統(tǒng)、設備驅動及網絡和進程間通信等。其一級目錄結構如圖1所示,二級及以下目錄并未列出,在后續(xù)的移植過程中如有用到可根據所列目錄推導其所屬一級目錄。此次移植研究使用的Linux版本號為 2.6.23。各級目錄含義版本差異并不明顯,這里不做過多闡述。
3 建立GCC編譯環(huán)境
Linux系統(tǒng)開發(fā)方式多樣,一般采取宿主機-目標機方式,其硬件連接示意如圖2所示。此次移植Linux系統(tǒng)版本為Red Hat Linux 9,移植方式及流程與系統(tǒng)開發(fā)方式類似,在宿主機上裁剪及編譯好所需的Linux系統(tǒng),然后通過雙絞線tftp傳輸完成移植,其流程如圖3所示。
此次GCC編譯器采用arm-linux-gcc-4.3.2版本,需要解壓編譯環(huán)境壓縮包arm-linux-gcc-4.3.2.tgz來實現,其流程為:下載壓縮包到任意目錄→解壓(/usr/local)→復制 arm 至 /usr/local,使編譯環(huán)境集中在/usr/local/arm/4.3.2/bin→修改環(huán)境變量→重啟。
經過以上流程后此次移植所需的GCC編譯環(huán)境就建立起來了。不論采用那一個版本的編譯器,編譯環(huán)境的建立都大同小異。
4 BootLoader
在EOS中,一般并無和BIOS相似的固件程序,但有的ECPU內也會含有一段精簡的啟動程序,這里不作討論。因此EOS的加載啟動任務全部由BootLoader完成。BootLoader是EOS在加電后執(zhí)行的首段代碼,它運行在操作系統(tǒng)內核之前,在它完成CPU和相關硬件的初始化之后,即將操作系統(tǒng)映像或固化的嵌入式應用程序裝載至內存中,然后跳轉到操作系統(tǒng)所在的空間,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境,從而啟動操作系統(tǒng)運行[1]。
ARM 920T的異常向量表有兩種存放方式,一種是從0x00000000處開始的低端存放,另一種從0xfff000000處開始的高端存放,選擇低端存放,建立異常向量表。S3C2440的看門狗在上電啟動時默認為開啟狀態(tài),所有要先關閉看門狗,否則代碼運行不完全就會強制復位。重定位代碼的目的是使代碼的運行地址與鏈接地址相對應,之后就可以直接使用絕對地址。用C語言實現使用絕對跳轉指令跳轉到第二階段。初始化串口可方便調試及為內核啟動時打印信息做好準備。初始化Nand Flash時需注意將其內核鏡像拷貝到內存。
5 Linux內核修改與編譯
Linux內核移植前得先進行內核的修改,而后進行配置與編譯。內核修改流程為:指定硬件與編譯器→添加Header file→建立Nand flash分區(qū)表→加入Nand flash分區(qū)→J建立芯片支持→加入芯片支持至驅動→指定啟動時初始化→禁止FlashECC校驗。具體的修改命令與對應參數這里不做過多闡述。在完成針對性的內核修改后,需要對修改后的內核進行配置與編譯,以便于后期的移植。配置方式相對簡單,可使用makeconfig、makeoldconfig、makemenuconfig、makexconfig中的任意一種[2]。在配置做好后,需要對Linux 2.6.23的內核進行編譯,方法相對簡單,執(zhí)行make即可編譯內核與模塊。
6 制作根文件系統(tǒng)
根文件系統(tǒng)是一個系統(tǒng)運行時必須且存儲數據文件的外部設備。Linux內核代碼映像文件便保存其中。BootLoader會從這個根文件系統(tǒng)設備上把內核執(zhí)行代碼加載到內存中去運行??梢娖渲匾訹3]。
在Linux下輸入ls 命令見到的目錄結構以及這些目錄下的內容都大同小異,這是因為所有的linux發(fā)行版本在對根文件系統(tǒng)布局上都遵循FHS標準的建議規(guī)定,該標準規(guī)定了根目錄下各子目錄的名稱及其存放的內容,制作根文件系統(tǒng)就是要建立以上的目錄,并在其中建立完整目錄內容。其通用流程一般為先編譯、安裝busybox,生成bin、sbin、usr/bin、usr/sbin目錄;然后依次GCC構建lib目錄;手工構建etc及dev目錄;在創(chuàng)建其它空目錄后對系統(tǒng)自動生成的proc目錄進行配置;最后利用udev構建完整的dev目錄并制作根文件系統(tǒng)的映像文件。
采用busybox制作cramfs文件系統(tǒng)的流程為:制作根文件系統(tǒng)→修改Makefile→去警告信息→配置busybox→編譯busybox→創(chuàng)建cramfs所需目錄→創(chuàng)建節(jié)點→目錄對拷→創(chuàng)建cramfs→執(zhí)行。制作過程中要注意,由于采用靜態(tài)編譯,故需去掉applets/ap-plets.c中的警告信息。配置busybox要選擇靜態(tài)編譯并修改其屬性。若假設創(chuàng)建cramfs所需目錄均創(chuàng)建在rootfs下,則在目錄對拷時在busybox中 install目錄下除linuxrc目錄外的其它全部目錄均需拷貝到rootfs目錄下,同時復制常用的lib文件,可稍微精簡。創(chuàng)建節(jié)點前需要準備啟動所需的linuxrc、rcS、inittab和fstab四個文件,創(chuàng)建兩個節(jié)點console、null時必須以root身份。假設創(chuàng)建的cramfs文件系統(tǒng)壓縮包名為ramdisk.gz,執(zhí)行必須在rootfs上一級目錄下。
7 Download
使用串口通過超級終端下載燒寫編寫好的BootLoader,通過網絡tftp下載燒寫修改及編譯后的內核及根文件系統(tǒng)。若在虛擬機下移植,可使用Windows自帶的通訊工具超級終端,或 Linux Vim 下使用Minicom。使用雙絞線連接宿主機與硬件平臺或開發(fā)板,在確保網絡硬件連接無誤的前提下設置好IP,通過指令"tftp a0008000(虛擬)zImage"下載燒寫內核,成功后輸入指令"tftp a0500000(虛擬) ramdisk.gz,若通過命令"go a0008000(虛擬)"可查看到移植內核及文件系統(tǒng),則移植成功并完成。
8 結語
EOS的移植過程繁瑣復雜,涉及到很多方面的知識,包括移植方式、移植核心的體系架構及硬、軟件平臺的搭建等,它要求實踐者熟悉Linux命令及相關第三方軟件的配置,對Linux內核及文件系統(tǒng)熟悉,對移植硬件平臺或目標板的結構了如指掌。隨著Linux內核不斷升級完善及快速發(fā)展,硬件平臺及目標板的結構的更新也異常迅猛。此次移植對以ARM為內核的EOS移值具有非常實用的應用價值,其本身即可作為一個實際應用案例。移植后的Linux系統(tǒng)在以ARM 920T為內核的S3C2440AL-40硬件平臺上運行穩(wěn)定、性能優(yōu)良,達到了預期目標,滿足后續(xù)在此平臺上開發(fā)應用程序的實際應用要求。同時此次移植過程對采用不同硬件與軟件平臺的移植具有很好的參考價值。
參考文獻
[1]李廣軍,閻波,林水生.微處理器系統(tǒng)結構與嵌入式系統(tǒng)系統(tǒng)設計[M].電子工業(yè)出版社,2011.
[2]向濤,吳光敏,李蘭.基于S3C2410的嵌入式Linux操作系統(tǒng)移植[J].微機處理,2010(6):41-44.
[3]趙明鑫.Linux內核在ARM上的裁減與移植[J].計算機與數字工程,2009(7):81-84.