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

圖1 CPU配置界面
可以看到,系統大部分使用了標注了S3C2410的選項,這是因為 S3C2410 和3C2440的很多寄存器地址等地址和設置是完全相同的,該版本的 linux-2.6內核沒有再對這兩種CPU分別設置。 CPU配置之后,配置LCD驅動、USB鼠標和鍵盤、網卡驅動等,它們都可以很方便的通過如上配置系統進行配置。配置完成后,保存退出,默認會保存為源代碼根目錄下名為.config的文件,然后如上節執行make zImage命令即可。
文件系統是任何操作系統中都非常重要的概念,每個操作系統都有一種把數據保存為文件和目錄的方法。
4.1 Linux根文件系統目錄結構
Linux的跟文件系統包括支持Linux系統正常運行的基本內容,包含系統使用的軟件和庫,以及一些用戶級軟件支持等。Linux遵守文件系統科學分類標準(Filesystem Hierarchy Standard,FHS),使得其文件系統布局實現了標準化。
/dev 設備文件
/root 用戶主目錄
/usr 存放一般不需要修改的命令程序文件,程序庫手冊和其他文檔等
/home 用戶主目錄的默認位置
/proc 系統內存的映射
/bin 包含二進制文件的可執行程序
/etc 存放大部分的系統重要配置文件
/boot 存放系統啟動時所需要的文件
/lib 標準程序設計庫
/mnt 為其它文件系統提供掛載點
鑒于大多數嵌入式系統使用Flash存儲介質,所以傳統的Linux文件系統己經不適合應用在嵌入式系統中,常見的專用于閃存設備的文件系統主要有JFFS2和YAFFS。
JFFS2是一個可讀寫的、壓縮的、日志型文件系統,并提供了崩潰/掉電安全保護,克服了JFFS的一些缺點:使用了基于哈希表的日志節點結構,大大加快了對節點的操作速度;支持數據壓縮;提供了“寫平衡”支持;支持多種節點類型;提高了對閃存的利用率,降低了內存的消耗。這些特點使JFFS2文件系統成為目前Flash設備上最流行的文件系統格式。
YAFFS/YAFFS2是專為嵌入式系統使用NAND型閃存而設計的一種日志型文件系統。和JFFS2相比它減少了一些功能,所以速度更快,而且對內存的占用比較小。此外,YAFFS自帶NAND芯片的驅動,相對于JFFS2在NAND閃存上的不穩定,在NAND閃存上使用YAFFS是更好的選擇。
4.2 YAFFS文件系統映像制作
把下載的 mkyaffsimage.tgz 文件拷貝到臨時目錄,進入該目錄,然后執行相關命令,把制作工具mkyaffsimage安裝到系統的可執行路徑/usr/sbin目錄。
可以根據需要,建立自己的文件目錄,但是以一定要把系統所必需的文件拷貝到相應的目錄下,這里使用友善之臂提供的光盤中的root_default.tgz為例,來進行文件目錄的制作,首先執行解壓命令,解壓完成后,就會在目錄下生成一個root_default目錄。接下來,執行如下命令進行編譯:
#mkyaffsimage root_default root_qq2440
編譯可能需要一段時間,等編譯完成后,就在目錄下生成了映像文件root_qq2440。
與參考文獻中的移植方法相比,本文選擇了主流的內核為ARM920T的S3C2440作為目標板上的微控制器,其次鑒于當前大部分嵌入式系統使用Flash存儲介質,采用了專為嵌入式系統使用NAND型閃存而設計的日志型文件系統——YAFFS/YAFFS2,YAFFS自帶NAND芯片的驅動,在NAND閃存上的更加穩定,和JFFS2相比它減少了一些功能,所以速度更快,而且對內存的占用比較小。
本文對Linux操作系統移植環境及過程進行了深刻剖析,重點討論了嵌入式系統的引導加載程序—Boot Loader和Linux內核的移植實現過程、同時對Linux根文件系統的建立、硬件平臺的結構,進行了比較深入的了解。本文的研究旨在對嵌入式系統移植過程進行熟悉和了解,因此在選用移植內核時,選用的是尚觀科技公司提供的2.6.13內核,其中已經包含了ARM平臺的BSP包,外圍器件相差不大,從而移植起來也相對比較容易。移植過程并沒有深入到太多的嵌入式移植的底層代碼部分,只是針對已有的2440的BSP包,對代碼進行了適量的修改,在很多方面還有待繼續研究并不斷深化。
[1] 周國運. ARM9嵌入式系統基礎教程[M]. 北京:人民郵電出版社,2010:1-5.
[2] 孫繼坤, 張小全. 嵌入式Linux系統開發設計詳解—基于ARM [M]. 北京:人民郵電出版社,2006:3-8.
[3] 孟慶昌,牛欣源. Linux教程[M].北京:電子工業出版社,2007:1-6.
[4] 楊建新,竇林卿.Red Hat Linux 9 入門與提高[M].北京:清華大學出版社,2006:5-9.
[5] 王俊偉,吳俊海. Linux標準教程[M].北京:清華大學出版社,2006:5-15.
[6] 李善平,劉文峰.王煥龍. Linux與嵌入式系統[M].北京:清華大學出版社,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
河南省科技攻關重點計劃項目(122102210563,132102210215);河南省高等學校重點科研項目計劃(15B520008)
陶琳(1979-),女(漢),河南南陽人,工程碩士,講師,研究方向:計算機應用,南陽 473003
張亞楠(1984-),女(漢),河南省泌陽人,工程碩士,講師,研究方向:計算機應用,南陽 473003
楊新鋒(1979-),男(漢),河南南陽人,碩士,副教授,研究方向:圖形圖像處理,南陽 473003
(2016.04.18)