沙曉艷 肖寧
摘要:以S3C2440(ARM920T核)微處理器為核心,搭建硬件平臺(tái),通過對(duì)Linux2.6.32.2的源代碼結(jié)構(gòu)進(jìn)行分析,進(jìn)一步修改和優(yōu)化內(nèi)核,同時(shí)完成整個(gè)移植過程的配置和編譯,實(shí)現(xiàn)Linux內(nèi)核成功移植到開發(fā)板的實(shí)驗(yàn)效果。
關(guān)鍵詞:S3C2440 ?Linux內(nèi)核 ?內(nèi)核移植
0 引言
隨著計(jì)算機(jī)、Internet技術(shù)的不斷發(fā)展,嵌入式系統(tǒng)得到廣泛應(yīng)用,同時(shí)嵌入式操作系統(tǒng)逐漸成為其中的重要組成部分。對(duì)于嵌入式Linux來(lái)說,通過對(duì)普通Linux操作系統(tǒng)進(jìn)行裁剪、修改,通過嵌入的方式,使之運(yùn)行在計(jì)算機(jī)系統(tǒng)上[1]。將Linux內(nèi)核移植到一些典型的微控制器和微處理器上,成為前嵌入式Linux的一個(gè)熱點(diǎn)應(yīng)用,通過提供操作系統(tǒng)層面的支持,進(jìn)一步開發(fā)嵌入式系統(tǒng)應(yīng)用軟件。
1 Linux內(nèi)核結(jié)構(gòu)分析
1.1 Linux內(nèi)核 Linux內(nèi)核是Linux操作系統(tǒng)的核心,也是整個(gè)Linux功能的體現(xiàn)。Linux內(nèi)核主要由5個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口、進(jìn)程間通信[2]。
各個(gè)子系統(tǒng)之間的依賴關(guān)系如圖1所示。
圖1 ?子系統(tǒng)之間的關(guān)系
1.2 內(nèi)核源碼 Linux內(nèi)核源碼使用目錄樹結(jié)構(gòu),通常位于/usr/src/linux目錄中,如圖2所示。在Linux的源碼根目錄下存在大量子目錄,分別組織存放各種內(nèi)核子系統(tǒng)或文件的。其中,arch/
2 內(nèi)核移植過程
內(nèi)核移植一般包括內(nèi)核配置、內(nèi)核編譯和內(nèi)核下載3大部分。
2.1 內(nèi)核配置 因?yàn)?.6.32版本的linux內(nèi)核已經(jīng)對(duì)S3C2440全系列硬件做了較好的兼容,大部分選項(xiàng)可以使用其缺省值。配置時(shí),主要選擇:處理器類型、板級(jí)支持、對(duì)設(shè)備驅(qū)動(dòng)及文件系統(tǒng)的支持。
2.1.1 搭建交叉編譯環(huán)境。修改源代碼根目錄下的Makefile,將默認(rèn)編譯平臺(tái)
Export KBUILD_BUILDHOST:=$(SUBARCH)
ARCH ? ??= $(SUBARCH)
CROSS_COMPILE ?=
改為:
Export KBUILD_BUILDHOST:=$(SUBARCH)
ARCH ? ??= arm
CROSS_COMPILE ?=arm-linux-
其中,ARCH是指定編譯的目標(biāo)平臺(tái)為arm,CROSS_COMPILE是指定交叉編譯器。如果使用其他的編譯環(huán)境,則要把編譯器的全部路徑寫出。
2.1.2 設(shè)置NAND FLASH 分區(qū)。將NAND FLASH分成2個(gè)區(qū):Kernel、Rootfs,其中name表示分區(qū)的名稱,size表示分區(qū)的大小,offset表示分區(qū)在Flash中的起始地址。代碼在arch/arm/plat-s3c24xx/common-smdk.c中,將此結(jié)構(gòu)體中的內(nèi)容:
static struct mtd_partition smdk_default_nand_part[] = {}
修改為:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "kernel",
.size = SZ_2M,
.offset = 0,
},
[1] = {
.name = "rootfs system",
.offset = SZ_2M,
.size = SZ_64M,
}
};
2.1.3 設(shè)置晶振頻率
代碼在arch/arm/mach-s3c2440/mach-smdk2440.c 中,將代碼:
s3c24xx_init_clocks(16934400);
改為:
s3c24xx_init_clocks(12000000);
2.1.4 修改內(nèi)核配置。在指定交叉編譯環(huán)境后,輸入make menuconfig命令,打開Linux的內(nèi)核配置界面,如圖3所示。針對(duì)特定的硬件平臺(tái)適配內(nèi)核參數(shù)。
圖3 ?內(nèi)核配置界面
①系統(tǒng)配置
System Type--->
[*]MMU-based Paged Memory Management Support│
ARM system type (Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443) --->
S3C2410 Machines--->
[*]SMDK2440
[*]SMDK2440 with S3C2440 CPU module,其余不選。
②串口驅(qū)動(dòng)
Device Drivers ?--->
<*>Memory Technology Device (MTD) support ---> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[*]MTD partitioning support ,其余不選。
Device Drivers ?--->
Character devices ?--->
Serial drivers ?--->
<*>Samsung SoC serial support ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[*]Support for console on Samsung SoC serial port ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <*> Samsung S3C2440/S3C2442 Serial port support (NEW) ? ,其余不選。
③文件系統(tǒng)
File systems --->
Miscellaneous filesystems--->
<*> Journaling Flash File System v2(JFFS2) support,其余不選。
④內(nèi)核設(shè)置
Kernel Features--->
[*]Use the ARM EABI to compile the kernel,其余不選。
2.2 內(nèi)核編譯 內(nèi)核的編譯一般分為2步:建立內(nèi)核映像,建立內(nèi)核模塊。在2.6內(nèi)核中建立內(nèi)核依賴關(guān)系和建立內(nèi)核是同時(shí)完成的。只需:①利用#make uImage命令,生成映像uImage(能被uboot識(shí)別的內(nèi)核鏡像(只對(duì)于uboot))。②利用#make modules命令,建立內(nèi)核模塊。
2.3 內(nèi)核移植 一般來(lái)說與開發(fā)板通信有3種方式:網(wǎng)絡(luò)下載(tftp,ftp等)、串口下載和USB下載。用tftp下載,需要配置Linux下的tftp服務(wù),然后將PC和開發(fā)板直連線(非網(wǎng)線)即可;用串口下載,需要配置Linux下的串口通信工具M(jìn)inicom,配置的主要是一些重要參數(shù)。
實(shí)驗(yàn)中,通過tftp將內(nèi)核直接下載到開發(fā)板的內(nèi)存中。在網(wǎng)絡(luò)暢通的情況下,執(zhí)行下面的命令:
# tftp 30000000 uImage
把linux內(nèi)核下載到開發(fā)板的內(nèi)存的30000000中地址處。
3 內(nèi)核啟動(dòng)
內(nèi)核移植后,要使系統(tǒng)正常啟動(dòng),只有系統(tǒng)內(nèi)核是不夠的,還需要加載文件系統(tǒng),一般是把現(xiàn)有文件系統(tǒng)加載到目標(biāo)板,包括制作文件系統(tǒng)鏡像和用NFS加載文件系統(tǒng)方法。然后,通過串口線與PC相連,給開發(fā)板供電,打開開關(guān),內(nèi)核就可以加載,如圖4所示。
4 總結(jié)
本文分析了Linux-2.6.32.2內(nèi)核源代碼,研究了Linux內(nèi)核移植過程。針對(duì)具體硬件設(shè)備、文件系統(tǒng)及應(yīng)用對(duì)內(nèi)核代碼做了相應(yīng)的配置,完成了基于ARM平臺(tái)的S3C2440處理內(nèi)核的移植過程,取得了預(yù)期的實(shí)驗(yàn)結(jié)果。
參考文獻(xiàn):
[1]趙小林.嵌入式Linux系統(tǒng)研究與網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序開發(fā)[J]. 武漢理工大學(xué),2007.5
[2]劉文,徐磊等.基于ARM平臺(tái)的Linux內(nèi)核分析與移植研究[J].現(xiàn)代計(jì)算機(jī),2011.04.
[3]何云霞.嵌入式Linux系統(tǒng)移植與實(shí)現(xiàn)[J].電子科技大學(xué), 2009.5.
[4]劉洪濤,孫天澤.嵌入式系統(tǒng)技術(shù)與設(shè)計(jì)[M].人民郵電出版社,2009.1.
基金項(xiàng)目:本文系陜西職業(yè)技術(shù)學(xué)院國(guó)家骨干院校建設(shè)子項(xiàng)
目——計(jì)算機(jī)應(yīng)用專業(yè)重點(diǎn)課程建設(shè)階段性研究成果。
作者簡(jiǎn)介:沙曉艷(1972-),女,陜西西安人,陜西職業(yè)技術(shù)學(xué)院副教授,研究方向:教育教學(xué)、嵌入式應(yīng)用;肖寧(1975-),女,陜西西安人,陜西職業(yè)技術(shù)學(xué)院講師,研究方向:計(jì)算機(jī)專業(yè)教學(xué)、智能計(jì)算。