陶琳,張亞楠,楊新鋒
?
嵌入式Linux系統(tǒng)移植研究與實(shí)現(xiàn)
陶琳1,張亞楠1,楊新鋒2
(1.河南工業(yè)職業(yè)技術(shù)學(xué)院電子信息工程系,南陽 473003 2.南陽理工學(xué)院計算機(jī)與信息工程學(xué)院,南陽 473003)
主要研究ARM和Linux嵌入式系統(tǒng)中BotLoader、Linux內(nèi)核及文件系統(tǒng)的移植方法。目標(biāo)板上的微控制器是S3C2440,其內(nèi)核為ARM920T,存儲器有64M的SDRAM、64M的Nand Flash以及2M的Nor Flash;板上還集成了串口、網(wǎng)卡、鼠標(biāo)、鍵盤、LCD、聲卡等多種接口。開發(fā)環(huán)境是在VMvare虛擬機(jī)平臺軟件下安裝的Linux操作系統(tǒng),并構(gòu)建交叉編譯開發(fā)環(huán)境,在此基礎(chǔ)上試驗(yàn)移植了Linux系統(tǒng),包括U-Boot移植、配置、編譯,Linux內(nèi)核的移植、配置、編譯,根文件系統(tǒng)的構(gòu)建、編譯。
ARM平臺;BootLoader;Linux內(nèi)核;根文件系統(tǒng);移植
嵌入式系統(tǒng)是計算機(jī)技術(shù)、通信技術(shù)、半導(dǎo)體技術(shù)、微電子技術(shù)、語音圖像數(shù)據(jù)傳輸技術(shù)等先進(jìn)技術(shù)相結(jié)合后的產(chǎn)物[1]。嵌入式系統(tǒng)一般包括嵌入式微處理器,外圍硬件設(shè)備,嵌入式操作系統(tǒng),和應(yīng)用程序等幾個部分。當(dāng)今的數(shù)字時代是嵌入式系統(tǒng)蓬勃發(fā)展、廣泛應(yīng)用的時代[2-4]。
嵌入式系統(tǒng)中的操作系統(tǒng),首選是Linux,因Linux具有源代碼開放、內(nèi)核穩(wěn)定高效、軟件豐富、支持處理器結(jié)構(gòu)和硬件平臺類型多、可移植性好特點(diǎn)[5]。隨著Linux 2.6內(nèi)核的迅速發(fā)展,嵌入式Linux在嵌入式領(lǐng)域的應(yīng)用越來越廣泛。
軟件開發(fā)平臺是嵌入式開發(fā)的關(guān)鍵,由于嵌入式硬件平臺的存儲空間有限、處理器頻率較低,很難直接在嵌入式硬件式平臺上建立Linux系統(tǒng)、安裝嵌入式開發(fā)軟件,因此只能采用嵌入式交叉開發(fā)環(huán)境來解決這個問題[6-8]。通過建立開發(fā)環(huán)境才能更方便的進(jìn)行Boot Loader移植、Linux內(nèi)核移植以及GUI系統(tǒng)開發(fā)等。
1.1 交叉開發(fā)環(huán)境
由于嵌入式系統(tǒng)的硬件資源的局限性,在嵌入式系統(tǒng)的開發(fā)過程,通常都要借助于交叉開發(fā)環(huán)境,這樣可以在開發(fā)主機(jī)上安裝開發(fā)工具,編輯,編譯目標(biāo)的引導(dǎo)程序,內(nèi)核和文件系統(tǒng),然后在目標(biāo)板上調(diào)試運(yùn)行[9]。
1.2 交叉編譯工具
由于開發(fā)平臺是X86體系結(jié)構(gòu),開發(fā)平臺上運(yùn)行的程序不能在ARM體系的處理器平臺上運(yùn)行,所以必須使用交叉編譯工具鏈來編譯程序[10,11]。把工具鏈安裝在/usr/local/arm目錄下。然后,在環(huán)境變量PATH中添加路徑,其方法是在etc目錄下的profile文件中,添加“PATH=$PATH:/usr/local/arm/3.4.1/bin”,這樣不必在每次重啟機(jī)器后再重設(shè)PATH變量了。
Boot Loader負(fù)責(zé)硬件平臺的最基本的初始化,并引導(dǎo)Linux內(nèi)核的啟動。它的作用就相當(dāng)于Windows中的BIOS(Basic Input Output System)。
Boot Loader是操作系統(tǒng)運(yùn)行之前的一段小程序,它主要負(fù)責(zé)初始化硬件設(shè)備,建立內(nèi)存空間的映射表等,將操作系統(tǒng)映像裝載到內(nèi)存中,然后跳轉(zhuǎn)到操作系統(tǒng)所在的空間,啟動操作系統(tǒng)運(yùn)行[12,13]。
2.1 BootLoader移植與編譯
雖然對于S3C2440和S3C2410來說,三星從一開始就專門為其設(shè)計vivi,其功能和性能都已經(jīng)足夠了,并且vivi從一開始就支持Nand flash啟動,比U-Boot有一定優(yōu)勢,但是U-Boot作為嵌入式系統(tǒng)中通用的Boot Loader,可以很方便的移植到其他硬件平臺,因此對嵌入式系統(tǒng)Boot Loader,研究U-Boot的移植就顯得非常重要。接下來我們以smdk2410公板為模板,開始移植U-Boot到QQ2440V3開發(fā)板。
移植U-Boot到新的嵌入式系統(tǒng)板上包括兩個層面的移植,第一層面是針對CPU的移植,第二層面是針對BOARD的移植,同時需要移植相關(guān)的頭[14]。
U-Boot的移植方法如下:
(1)修改/cpu/arm920t/start.S。start.S文件是整個Boot loader程序的入口點(diǎn),在這里我們需要對寄存器地址定義、中斷禁止部分、時鐘設(shè)置(2440的主頻為405MHz)等部分,按照s3c2440手冊或者vivi的源代碼,將從Flash啟動改成從NAND Flash啟動。
(2)在board/friendlyarm/qq2440加入NAND Flash讀函數(shù)文件,拷貝vivi中的nand_read.c文件到此文件夾即可。
(3)修改board/friendlyarm/qq2440/Makefile文件。
OBJS:= qq2440.o nand_read.o flash.o
(4)修改include/configs/qq2440.h文件。添加NAND FLASH、JFFS2、USB啟動支持。
(5)修改board/friendlyarm/qq2440/lowlevel_init.S文件,依照開發(fā)板的內(nèi)存區(qū)的配置情況, 修改board/tekkaman/tekkaman2440/lowlevel_init.S文件,我們利用友善之臂提供的vivi源碼里的信息做一些簡單的修改。
(6)修改/board/friendlyarm/qq2440/qq2440.c。修改其對GPIO和PLL的配置(需參閱開發(fā)板的硬件說明和芯片手冊):
(7)在個文件中添加“CONFIG_S3C2440”,使得原來s3c2410的代碼可以編譯進(jìn)來。
此外還需要對以下文件進(jìn)行一些修改
include/linux/mtd/nand_ids.h include/linux/mtd/nand.h
/lib_arm/board.c common/env_nand.c
/board/friendlyarm/qq2440/qq2440.c
U-boot交叉編譯較簡單,在U-Boot根目錄下執(zhí)行如下命令:
# make clean
# make qq2400_config
# make
編譯一段時間后,便會生成五個文件u-boot,u-boot.bin,u-boot.srec,System.map。
其中,u-boot是U-Boot映像的ELF格式,System.map文件是U-Boot映像的符號表,u-boot.bin文件是U-Boot映像原始的二進(jìn)制格式,u-boot.srec是U-Boot映像的S-Record格式。以上的三種映像格式都可以燒到flash中,但是需要加載器的支持。一般u-boot.bin最為常用,直接按照二進(jìn)制格式下載即可。
2.2 安裝BootLoader到開發(fā)板
目標(biāo)開發(fā)板采用的Boot Loader是基于vivi改進(jìn)而來,名為Supervivi,它采用功能菜單的方式,并可以和原來的命令交互模式互相切換。Supervivi可以使用JTAG板直接燒寫入Nor Flash中使用,也可以直接燒入Nand Flash中運(yùn)行。當(dāng)燒入Nor Flash并從中啟動時,將會出現(xiàn)菜單模式;當(dāng)燒入Nand Flash并從中運(yùn)行時,則為命令交互模式(提示:需要在超級終端界面下按住空格鍵才能進(jìn)入,否則直接啟動系統(tǒng))。Supervivi的菜單模式主要為燒寫系統(tǒng)而用,也可以設(shè)置參數(shù)和進(jìn)行分區(qū)等,它采用USB下載的方式,因此下載速度快,使用及其方便。Supervivi的編譯與vivi類似。執(zhí)行sjf2440.exe /f vivi 即可以燒寫vivi到目標(biāo)板的NandFlash或Nor flash了。
3.1 Linux內(nèi)核結(jié)構(gòu)
Linux的內(nèi)核源代碼非常龐大,并且隨著版本的發(fā)展不斷的增加。所以它采用了目錄樹結(jié)構(gòu),并且使用Makefile組織配置編譯。Linux內(nèi)核頂層目錄的Makefile是整個內(nèi)核配置編譯的核心文件,負(fù)責(zé)整個組織目錄樹中子目錄的編譯管理。
arch/ 存放體系結(jié)構(gòu)相關(guān)的代碼,如arch/i386,arch/arm等drivers/ 各種設(shè)備驅(qū)動程序,如drivers/char,drivers/block
Documentation/ 內(nèi)核文檔
fs/ 文件系統(tǒng),例如:fs/ext3,fs/jffs2等
include/ 內(nèi)核頭文件
init/ Linux初始化
ipc/ 進(jìn)程間通信的代碼
kernel/ linux內(nèi)核核心代碼
lib/ 各種庫子程序
mm/ 內(nèi)存管理代碼
net/ 網(wǎng)絡(luò)支持代碼,主要是網(wǎng)絡(luò)協(xié)議
scripts/ 內(nèi)部或外部使用的腳本
usr/ 用戶的代碼。
3.2 Linux內(nèi)核的配置
Linux內(nèi)核源代碼支持20多種體系結(jié)構(gòu)的處理器,還有各種各樣的驅(qū)動程序選項(xiàng),因此在編譯之前必須根據(jù)特定平臺配置內(nèi)核源碼。Linux內(nèi)核有上千個配置選項(xiàng),配置相當(dāng)復(fù)雜,所以Linux內(nèi)核源代碼組織了一個配置系統(tǒng)。
1. Linux內(nèi)核移植
首先我們把內(nèi)核的源代碼包復(fù)制到我們的工作目錄,并進(jìn)行解壓這樣內(nèi)核源碼被解壓到了/home/kernel 2.6.13目錄中接下來,需要把根目錄的Makefile中以下兩行注釋掉:
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=
并添加以下兩行
ARCH ?=arm
CROSS_COMPILE ?=/usr/local/arm/bin/arm-linux-
這兩個參數(shù)分別用來指定編譯的體系結(jié)構(gòu)和交叉編譯工具鏈的,或者我們也可以直接在啟動配置菜單或編譯時以參數(shù)的形式指定它們,如
# make menuconfig ARCH=arm
#make CROSS_COMPILE=/usr/local/arm/bin/arm-linux
2. Linux內(nèi)核配置
使用菜單式配置軟件menuconfig配置,啟動menuconfig進(jìn)入主配置菜單。CPU配置界面,如,圖1所示。

圖1 CPU配置界面
可以看到,系統(tǒng)大部分使用了標(biāo)注了S3C2410的選項(xiàng),這是因?yàn)?S3C2410 和3C2440的很多寄存器地址等地址和設(shè)置是完全相同的,該版本的 linux-2.6內(nèi)核沒有再對這兩種CPU分別設(shè)置。 CPU配置之后,配置LCD驅(qū)動、USB鼠標(biāo)和鍵盤、網(wǎng)卡驅(qū)動等,它們都可以很方便的通過如上配置系統(tǒng)進(jìn)行配置。配置完成后,保存退出,默認(rèn)會保存為源代碼根目錄下名為.config的文件,然后如上節(jié)執(zhí)行make zImage命令即可。
文件系統(tǒng)是任何操作系統(tǒng)中都非常重要的概念,每個操作系統(tǒng)都有一種把數(shù)據(jù)保存為文件和目錄的方法。
4.1 Linux根文件系統(tǒng)目錄結(jié)構(gòu)
Linux的跟文件系統(tǒng)包括支持Linux系統(tǒng)正常運(yùn)行的基本內(nèi)容,包含系統(tǒng)使用的軟件和庫,以及一些用戶級軟件支持等。Linux遵守文件系統(tǒng)科學(xué)分類標(biāo)準(zhǔn)(Filesystem Hierarchy Standard,F(xiàn)HS),使得其文件系統(tǒng)布局實(shí)現(xiàn)了標(biāo)準(zhǔn)化。
/dev 設(shè)備文件
/root 用戶主目錄
/usr 存放一般不需要修改的命令程序文件,程序庫手冊和其他文檔等
/home 用戶主目錄的默認(rèn)位置
/proc 系統(tǒng)內(nèi)存的映射
/bin 包含二進(jìn)制文件的可執(zhí)行程序
/etc 存放大部分的系統(tǒng)重要配置文件
/boot 存放系統(tǒng)啟動時所需要的文件
/lib 標(biāo)準(zhǔn)程序設(shè)計庫
/mnt 為其它文件系統(tǒng)提供掛載點(diǎn)
鑒于大多數(shù)嵌入式系統(tǒng)使用Flash存儲介質(zhì),所以傳統(tǒng)的Linux文件系統(tǒng)己經(jīng)不適合應(yīng)用在嵌入式系統(tǒng)中,常見的專用于閃存設(shè)備的文件系統(tǒng)主要有JFFS2和YAFFS。
JFFS2是一個可讀寫的、壓縮的、日志型文件系統(tǒng),并提供了崩潰/掉電安全保護(hù),克服了JFFS的一些缺點(diǎn):使用了基于哈希表的日志節(jié)點(diǎn)結(jié)構(gòu),大大加快了對節(jié)點(diǎn)的操作速度;支持?jǐn)?shù)據(jù)壓縮;提供了“寫平衡”支持;支持多種節(jié)點(diǎn)類型;提高了對閃存的利用率,降低了內(nèi)存的消耗。這些特點(diǎn)使JFFS2文件系統(tǒng)成為目前Flash設(shè)備上最流行的文件系統(tǒng)格式。
YAFFS/YAFFS2是專為嵌入式系統(tǒng)使用NAND型閃存而設(shè)計的一種日志型文件系統(tǒng)。和JFFS2相比它減少了一些功能,所以速度更快,而且對內(nèi)存的占用比較小。此外,YAFFS自帶NAND芯片的驅(qū)動,相對于JFFS2在NAND閃存上的不穩(wěn)定,在NAND閃存上使用YAFFS是更好的選擇。
4.2 YAFFS文件系統(tǒng)映像制作
把下載的 mkyaffsimage.tgz 文件拷貝到臨時目錄,進(jìn)入該目錄,然后執(zhí)行相關(guān)命令,把制作工具mkyaffsimage安裝到系統(tǒng)的可執(zhí)行路徑/usr/sbin目錄。
可以根據(jù)需要,建立自己的文件目錄,但是以一定要把系統(tǒng)所必需的文件拷貝到相應(yīng)的目錄下,這里使用友善之臂提供的光盤中的root_default.tgz為例,來進(jìn)行文件目錄的制作,首先執(zhí)行解壓命令,解壓完成后,就會在目錄下生成一個root_default目錄。接下來,執(zhí)行如下命令進(jìn)行編譯:
#mkyaffsimage root_default root_qq2440
編譯可能需要一段時間,等編譯完成后,就在目錄下生成了映像文件root_qq2440。
與參考文獻(xiàn)中的移植方法相比,本文選擇了主流的內(nèi)核為ARM920T的S3C2440作為目標(biāo)板上的微控制器,其次鑒于當(dāng)前大部分嵌入式系統(tǒng)使用Flash存儲介質(zhì),采用了專為嵌入式系統(tǒng)使用NAND型閃存而設(shè)計的日志型文件系統(tǒng)——YAFFS/YAFFS2,YAFFS自帶NAND芯片的驅(qū)動,在NAND閃存上的更加穩(wěn)定,和JFFS2相比它減少了一些功能,所以速度更快,而且對內(nèi)存的占用比較小。
本文對Linux操作系統(tǒng)移植環(huán)境及過程進(jìn)行了深刻剖析,重點(diǎn)討論了嵌入式系統(tǒng)的引導(dǎo)加載程序—Boot Loader和Linux內(nèi)核的移植實(shí)現(xiàn)過程、同時對Linux根文件系統(tǒng)的建立、硬件平臺的結(jié)構(gòu),進(jìn)行了比較深入的了解。本文的研究旨在對嵌入式系統(tǒng)移植過程進(jìn)行熟悉和了解,因此在選用移植內(nèi)核時,選用的是尚觀科技公司提供的2.6.13內(nèi)核,其中已經(jīng)包含了ARM平臺的BSP包,外圍器件相差不大,從而移植起來也相對比較容易。移植過程并沒有深入到太多的嵌入式移植的底層代碼部分,只是針對已有的2440的BSP包,對代碼進(jìn)行了適量的修改,在很多方面還有待繼續(xù)研究并不斷深化。
[1] 周國運(yùn). ARM9嵌入式系統(tǒng)基礎(chǔ)教程[M]. 北京:人民郵電出版社,2010:1-5.
[2] 孫繼坤, 張小全. 嵌入式Linux系統(tǒng)開發(fā)設(shè)計詳解—基于ARM [M]. 北京:人民郵電出版社,2006:3-8.
[3] 孟慶昌,牛欣源. Linux教程[M].北京:電子工業(yè)出版社,2007:1-6.
[4] 楊建新,竇林卿.Red Hat Linux 9 入門與提高[M].北京:清華大學(xué)出版社,2006:5-9.
[5] 王俊偉,吳俊海. Linux標(biāo)準(zhǔn)教程[M].北京:清華大學(xué)出版社,2006:5-15.
[6] 李善平,劉文峰.王煥龍. Linux與嵌入式系統(tǒng)[M].北京:清華大學(xué)出版社,2006:2-5.
Research and Implementation for Embedded Linux System Migration
Tao Lin1, Zhang Yanan1, Yang Xinfeng2
(1. Department of Electronic Information Engineering, Henan Polytechnic Institute, Nanyang 473004, China;2. School of Computer and Information Engineering, Nanyang Institute of Technology, Nanyang 473004, China)
The paper mainly researches migrationes methods for BotLoader, Linux kernel and file system in embedded system of ARM and Linux. The microcontroller in target board is S3C2440, which kernel is ARM920T. The memorizer has 64M SDRAM, 64M Nand Flash and 2M Nor Flash. The board also integrates interfaces such as serial port, network card, mouse, keyboard, LCD, sound card, etc. Development environment is the Linux operating system installed under virtual machine platform software VMvare. cross-compiler development environment is constructed. On this Linux system is transplanted, which includes the transplant, configuration, compiling of U-Boot and Linux kernel,and the construction and compiling for the root file system.
ARM platform; Boot Loader; Linux kernel; Root file system; Transplant
1007-757X(2016)12-0012-03
TP316
A
河南省科技攻關(guān)重點(diǎn)計劃項(xiàng)目(122102210563,132102210215);河南省高等學(xué)校重點(diǎn)科研項(xiàng)目計劃(15B520008)
陶琳(1979-),女(漢),河南南陽人,工程碩士,講師,研究方向:計算機(jī)應(yīng)用,南陽 473003
張亞楠(1984-),女(漢),河南省泌陽人,工程碩士,講師,研究方向:計算機(jī)應(yīng)用,南陽 473003
楊新鋒(1979-),男(漢),河南南陽人,碩士,副教授,研究方向:圖形圖像處理,南陽 473003
(2016.04.18)