国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于S3C2440的嵌入式Linux系統(tǒng)移植

2012-09-12 03:22:48王劍飛程耀瑜
電子測(cè)試 2012年11期
關(guān)鍵詞:源碼編譯器開(kāi)發(fā)板

王劍飛, 程耀瑜

(中北大學(xué)山西省現(xiàn)代無(wú)損檢測(cè)工程技術(shù)研究中心, 山西太原 030051)

0 引言

嵌入式系統(tǒng)具有低功耗、實(shí)時(shí)性強(qiáng)和穩(wěn)定性高等優(yōu)點(diǎn),在軍事、工業(yè)和家用等領(lǐng)域得到廣泛的應(yīng)用。國(guó)內(nèi)對(duì)嵌入式系統(tǒng)的一般定義是:以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,從而能夠適應(yīng)實(shí)際應(yīng)用中對(duì)功能、可靠性、成本、體檢、功耗等嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)[1]。而操作系統(tǒng)的移植已成為嵌入式系統(tǒng)設(shè)計(jì)中的重要環(huán)節(jié),具有可觀的市場(chǎng)價(jià)值。

1 交叉編譯環(huán)境

對(duì)于嵌入式系統(tǒng)的開(kāi)發(fā)需要建立交叉編譯環(huán)境,交叉編譯環(huán)境就是在一個(gè)平臺(tái)上生成可以在另一個(gè)平臺(tái)上執(zhí)行的代碼的編譯環(huán)境。Linux內(nèi)核完全使用C和GNU形式的匯編完成因此嵌入式Linux的開(kāi)發(fā)環(huán)境采用了GNU工具鏈的交叉開(kāi)發(fā)平臺(tái)。通過(guò)GNU提供的編譯器cc/gcc、連接器ld/gld、匯編器as/gas和C函數(shù)庫(kù)glibc以及精簡(jiǎn)的C庫(kù)uClib,就可以建立完整的交叉開(kāi)發(fā)環(huán)境來(lái)完成從開(kāi)發(fā)GNU工具鏈針對(duì)不同的處理器提供了多種交叉開(kāi)發(fā)平臺(tái)[2]。

本次移植過(guò)程中使用的宿主機(jī)的操作系統(tǒng)是Ubuntu9.10。使用支持軟浮點(diǎn)編譯的交叉編譯器arm-linux-gcc-3.4.5編譯U-boot,而使用支持EABI技術(shù)的交叉編譯器arm-linux-gcc-4.3.3編譯Linux內(nèi)核及根文件系統(tǒng)。使用PATH設(shè)置交叉編譯路徑[3]。將交叉編譯器的源碼包解壓到宿主機(jī)/usr/local/目錄下,然后修改環(huán)境變量:

# vi /etc/environment

PATH=/usr/local/4.3.3/bin

為了使新的環(huán)境變量生效,使用命令:source/etc/environment, 此 時(shí),arm-linux-gcc-4.3.3交叉編譯環(huán)境就建立了。

2 Bootloader引導(dǎo)程序

Bootloader的作用與PC上的BIOS類(lèi)似,它在系統(tǒng)上電時(shí)執(zhí)行,初始化硬件設(shè)備、準(zhǔn)備好軟件環(huán)境,最后調(diào)用操作系統(tǒng)的內(nèi)核。Bootloader的實(shí)現(xiàn)非常依賴(lài)于具體的硬件,在嵌入式系統(tǒng)中硬件的配置千差萬(wàn)別,即使是相同的CPU,它的外設(shè)也可能不同,因此在嵌入式領(lǐng)域幾乎不可能有統(tǒng)一的Bootloader支持所有的電路板?,F(xiàn)在Bootloader種類(lèi)繁多,比如x86上有LILO、GRUB等。不同的板級(jí)硬件,都需要進(jìn)行U-Boot的移植工作[4]。對(duì)于ARM架構(gòu),有U-Boot、Vivi等。U-Boot支持大多數(shù)的CPU,具有較高的可靠性和穩(wěn)定性。同時(shí)由于其開(kāi)放源碼,可以根據(jù)嵌入式Linux系統(tǒng)開(kāi)發(fā)的需要增強(qiáng)U-Boot的功能。

2.1 U-Boot啟動(dòng)過(guò)程分析

U-Boot的啟動(dòng)過(guò)程可以分為兩個(gè)階段:第一階段使用匯編來(lái)實(shí)現(xiàn),完成同CPU體系結(jié)構(gòu)相關(guān)的初始化,并調(diào)用第二階段代碼;第二階段使用C語(yǔ)言實(shí)現(xiàn),完成部分硬件的初始化及檢測(cè),最終啟動(dòng)內(nèi)核[5]。

第一階段主要內(nèi)容包括:

(1)硬件設(shè)備初始化:調(diào)整CPU工作模式、設(shè)置CPU速度和時(shí)鐘頻率、關(guān)閉MMU等。

(2)為加載U-Boot的第二階段代碼準(zhǔn)備RAM空間:調(diào)用lowlevel_init函數(shù)來(lái)設(shè)置存儲(chǔ)控制器,初始化外接的SDRAM。

(3)復(fù)制U-Boot第二階段的代碼到RAM空間。

(4)設(shè)置堆棧。

(5)跳轉(zhuǎn)到U-Boot第二階段代碼的C入口點(diǎn):跳轉(zhuǎn)之前,應(yīng)清除BSS段。

第二階段主要內(nèi)容包括:

(1)初始化相關(guān)的硬件設(shè)備。

(2)檢測(cè)系統(tǒng)內(nèi)存映射。

(3)將內(nèi)核和根文件映像復(fù)制到RAM空間。

(4)為內(nèi)核設(shè)置啟動(dòng)參數(shù)。

(5)調(diào)用內(nèi)核。

對(duì)于ARM架構(gòu)的CPU,是通過(guò)do_bootm_linux函數(shù)來(lái)啟動(dòng)內(nèi)核。這個(gè)函數(shù)中,設(shè)置標(biāo)記列表,通過(guò)theKernel(0,bd->bi_arch_number,bd->bi_boot_params)調(diào)用內(nèi)核。其中,theKernel指向內(nèi)核存放的地址,bd->bi_arch_number就是在U-Boot中設(shè)置的機(jī)器類(lèi)型ID,而bd->bi_boot_params就是標(biāo)記列表的開(kāi)始地址[6]。

2.2 U-Boot移植

從U-Boot的官方網(wǎng)站下載U-Boot-1.1.6.tar。bz2后解壓可以得到全部源碼。U-Boot的移植除了依賴(lài)CPU的體系結(jié)構(gòu)外,還依賴(lài)于具體嵌入式開(kāi)發(fā)板外設(shè)的配置情況。在獲得U-Boot源碼后,需要根據(jù)自己開(kāi)發(fā)板的具體情況和嵌入式開(kāi)發(fā)的相應(yīng)需要修改部分源碼。該版本的U-Boot不支持ARM微處理器S3C2440,但對(duì)同一系列的S3C2410有著完善的支持。由于兩款微處理器在架構(gòu)和使用上很接近,所以移植工作可以在對(duì)應(yīng)的SMDK2410開(kāi)發(fā)板的源碼上做必要的修改,并且添加部分代碼增強(qiáng)U-Boot的功能,以方便嵌入式系統(tǒng)的后期開(kāi)發(fā)工作。

(1)進(jìn)入U(xiǎn)-Boot-1.1.6的源碼目錄,將board/smdk2410目錄復(fù)制為wang2440目錄。修改wang2440目錄下smdk2410.c為wang2440.c。同時(shí)修改該目錄下Makefile文件:COBJS:= wang 2440.o flash.o。 進(jìn)入include/configs目錄, 將smdk2410.h復(fù)制為wang2440.h 。

(2)在頂層Makefile中增加:Wang2440_config :unconfig@$(MKCONFIG) $(@:_config=)arm arm920t wang2440 NULL s3c24x0

各項(xiàng)的意思如下:

arm:CPU的架構(gòu)(ARCH)

arm920t:CPU的類(lèi)型(CPU),對(duì)應(yīng)于CPU/arm920t子目錄。

wang2440:開(kāi)發(fā)板的型號(hào)(BOARD),對(duì)應(yīng)于board/wang2440目錄。

NULL:開(kāi)發(fā)者或經(jīng)銷(xiāo)商(vender),此處NULL為沒(méi)有。

S3c24x0:片上系統(tǒng)(SOC)。

(3)修改SDRAM配置和時(shí)鐘設(shè)置,使其適應(yīng)具體S3C2440開(kāi)發(fā)板的配置。

(4)在cpu/arm920t/s3c24x0目錄中增加NAND flash讀取函數(shù)nand_flash.c。添加S3C2440 nand的驅(qū)動(dòng)函數(shù),同時(shí)修改nand_flash.c中的s3c24x0_init(void)函數(shù),定義S3C2440 NAND flash的時(shí)鐘和初始化NAND flash 。在board/wang2440目錄下增加boot_init.c文件,讓U-Boot支持從nand flash啟動(dòng)。

(5)U-Boot中沒(méi)有提供對(duì)yaffs文件讀寫(xiě)支持,可以通過(guò)增加nand write.yaffs命令實(shí)現(xiàn)對(duì)yaffs文件的讀寫(xiě)支持。在commom/cmd_nand.c中增加處理函數(shù)do_nand.c實(shí)現(xiàn)對(duì)nand yaffs的支持。由于yaffs文件本身就包含了OOB區(qū)的數(shù)據(jù)(壞塊標(biāo)記、ECC校驗(yàn)碼、其他yaffs相關(guān)信息),所以燒寫(xiě)時(shí)不需要再計(jì)算ECC值。

完成以上修改以后使用交叉編譯工具armlinux-gcc-3.4.5編譯U-Boot,在U-Boot目錄輸入:

make ARCH=arm CROSS_COMPILE=armlinux- wang2440_config

make ARCH=arm CROSS_COMPILE=armlinux- all

可以產(chǎn)生u-boot.bin文件。通過(guò)JTAG燒入開(kāi)發(fā)板并復(fù)位,在SecureCRT終端輸出如圖1所示。

圖1 u-boot運(yùn)行結(jié)果

3 Linux內(nèi)核移植

3.1 Linux內(nèi)核啟動(dòng)過(guò)程

Linux的啟動(dòng)過(guò)程可以分為兩部分:架構(gòu)與開(kāi)發(fā)板相關(guān)的引導(dǎo)過(guò)程、后續(xù)的啟動(dòng)過(guò)程。引導(dǎo)階段通常使用匯編語(yǔ)言編寫(xiě),首先檢查內(nèi)核是否支持當(dāng)前架構(gòu)的處理器,然后檢查是否支持當(dāng)前開(kāi)發(fā)板。第二階段使用C語(yǔ)言編寫(xiě),進(jìn)行內(nèi)核初始化的工作,最后調(diào)用rest_init函數(shù),創(chuàng)建第一個(gè)進(jìn)程init。如圖2中是ARM架構(gòu)處理器上Linux內(nèi)核的啟動(dòng)過(guò)程。

圖2 Linux內(nèi)核啟動(dòng)過(guò)程

3.2 Linux內(nèi)核的移植

對(duì)Linux內(nèi)核的移植是一個(gè)非常繁雜的過(guò)程,在對(duì)Linux內(nèi)核深入了解的基礎(chǔ)上,需要添加、修改相關(guān)的代碼并對(duì)內(nèi)核進(jìn)行配置。Linux內(nèi)核的確切能力取決于內(nèi)核構(gòu)建時(shí)所設(shè)定的配置。內(nèi)核的配置可以讓你移除非必要的支持或永遠(yuǎn)不會(huì)被用到的能力[7]。從官方網(wǎng)站可以下載Linux-2.6.30.4.tar.bz2,解壓后可以得到Linux源碼包。

修改Makefile文件,設(shè)置目標(biāo)平臺(tái)和指定交叉編譯器。修改 Makefile中 ARCH=arm 和CROSS_COMPILE=arm-linux-,然后保存退出。修改平臺(tái)時(shí)鐘頻率,修改內(nèi)核源碼arch/arm/mach-s3c2440/mach-smdk2440.c文件,通過(guò)函數(shù)s3c24xx_init_clocks(12000000)獲得12M的外部時(shí)鐘源輸入。修改機(jī)器碼,機(jī)器碼在內(nèi)核的arch/arm/mach-smdk2440.c文件中,確保機(jī)器碼的值和U-boot中的一致。

設(shè)置分區(qū)信息,將NAND Flash劃分為3個(gè)分區(qū),修改內(nèi)核源碼arch/arm/plat-s3c24xx/common-smdk.c文件中結(jié)構(gòu)體smdk_default_nand_part[]如下:

禁止ECC校驗(yàn),修改drivers/mtd/nand/s3c2410.c文件,將chip->ecc.mode修改為chip->ecc.mode = NAND_ECC_NONE。

(3)配置內(nèi)核,將arch/arm/configs/s3c2410_deconfig復(fù)制到.config文件,在默認(rèn)配置單的基礎(chǔ)上,通過(guò)make menuconfig命令 對(duì)內(nèi)核進(jìn)行必要的配置,把最終的配置結(jié)構(gòu)保存為.config文件。

在內(nèi)核源碼目錄下輸入:make zImage,編譯內(nèi)核源碼,編譯完成后在arch/arm/boot目錄下生成zImage鏡像,將其燒入開(kāi)發(fā)板中,可以得到內(nèi)核啟動(dòng)時(shí)的分區(qū)信息如圖3所示。

圖3 MTD分區(qū)信息

3.3 根文件系統(tǒng)

Linux內(nèi)核在系統(tǒng)啟動(dòng)期間所進(jìn)行的最后操作就是掛載根文件系統(tǒng),文件系統(tǒng)對(duì)系統(tǒng)中的文件和設(shè)備進(jìn)行組織,為設(shè)備和用戶(hù)提供統(tǒng)一接口[8]。Linux根文件系統(tǒng)的作用時(shí)存放各種工具、應(yīng)用程序和必需的鏈接庫(kù)等。使用Busybox可以簡(jiǎn)化制作嵌入式系統(tǒng)根文件系統(tǒng)的過(guò)程,因此,Busybox工具在嵌入式開(kāi)發(fā)中廣泛應(yīng)用。從官方網(wǎng)站下載Busybox-1.15.2.tar.bz2,解壓后可以得到源碼。進(jìn)入源碼目錄,修改Makefile文件,執(zhí)行make menuconfig進(jìn)行配置Busybox,根據(jù)實(shí)際需要添加或去除某些選項(xiàng)。配置完畢后,執(zhí)行make、make install命令為新建的根文件系統(tǒng)添加/usr、/bin、/sbin等目錄。

定制根文件系統(tǒng)的步驟如下:

(1)創(chuàng)建目錄,在新建的根文件系統(tǒng)目錄下,建立etc、dev、mnt等常見(jiàn)的Linux系統(tǒng)目錄;

(2)創(chuàng)建設(shè)備節(jié)點(diǎn);

(3)添加所需的庫(kù)文件;

(4)配置系統(tǒng)文件;

(5)指定應(yīng)用程序。

文件系統(tǒng)框架制作好后,使用mkyaffs2image工具,制作yaffs鏡像。把可執(zhí)行文件復(fù)制到/usr/bin目錄下,制作文件系統(tǒng)鏡像:mkyaffs2image root root.bin,將生成的root.bin文件燒入開(kāi)發(fā)板,復(fù)位開(kāi)發(fā)板后,在串口終端輸入ls命令,結(jié)果如圖4所示。

圖4 根文件系統(tǒng)目錄

4 結(jié)束語(yǔ)

本文系統(tǒng)介紹了以S3C2440的ARM9處理器為硬件平臺(tái)的嵌入式Linux系統(tǒng)的移植過(guò)程。針對(duì)U-boot的源碼進(jìn)行了必要的修改,方便嵌入式Linux系統(tǒng)的后續(xù)開(kāi)發(fā)工作。對(duì)嵌入式Linux內(nèi)核的移植及根文件系統(tǒng)的創(chuàng)建方法進(jìn)行總結(jié)。嵌入式Linux系統(tǒng)移植于嵌入式底層開(kāi)發(fā)平臺(tái)對(duì)嵌入式系統(tǒng)開(kāi)發(fā)設(shè)計(jì)具有重要意義。移植后的Linux系統(tǒng)在ARM平臺(tái)下穩(wěn)定工作。

[1]徐英慧,馬忠梅.ARM9嵌入式系統(tǒng)設(shè)計(jì)-基于S3C2410與Linux[M].北京:北京航空航天大學(xué)出版社,2010.

[2]劉文峰,李程遠(yuǎn),李善平.嵌入式Linux操作系統(tǒng)的研究[J].浙江大學(xué)學(xué)報(bào):工學(xué)版,2004,38(4).

[3]宋凱,嚴(yán)麗平.ARM Linux在S3C2410上的移植[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(16).

[4]鄒穎婷,李紹榮.ARM9上的嵌入式Linux系統(tǒng)移植[J].自動(dòng)化技術(shù)與應(yīng)用,2009,28(6).

[5]師磊.U-Boot在S3C2440上的分析與移植[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010,19(4).

[6]韋東山.嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.

[7]Karim Yaghmour, Jonathan Masters, Gilad Ben-Yossef.Building Embedded Linux Systems[M].O’Reilly,2003.

[8]師娟娟,彭迪.基于ARM9的嵌入式Linux移植[J].武漢理工大學(xué)學(xué)報(bào),2008,30(2).

猜你喜歡
源碼編譯器開(kāi)發(fā)板
基于網(wǎng)頁(yè)源碼結(jié)構(gòu)理解的自適應(yīng)爬蟲(chóng)代碼生成方法
基于圖神經(jīng)網(wǎng)絡(luò)的軟件源碼漏洞檢測(cè)方法
企業(yè)如何保護(hù)源碼
基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
Microchip最新推出兩款PIC32 Curiosity開(kāi)發(fā)板
淺析單片機(jī)開(kāi)發(fā)板的設(shè)計(jì)與制作
電子制作(2017年22期)2017-02-02 07:10:14
基于數(shù)據(jù)結(jié)構(gòu)教輔系統(tǒng)的實(shí)驗(yàn)課程改革
Mouser為您呈上開(kāi)發(fā)關(guān)鍵之STMicroelectronics Nucleo開(kāi)發(fā)板
Arduino和Atmel發(fā)布Arduino Zero開(kāi)發(fā)板
通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
揭东县| 大同县| 平江县| 五寨县| 怀来县| 武宣县| 浠水县| 辽中县| 略阳县| 武乡县| 惠来县| 陵水| 蒙自县| 苏尼特左旗| 临泉县| 水富县| 广汉市| 新和县| 昌平区| 辽阳市| 开化县| 诏安县| 甘南县| 句容市| 白山市| 昌都县| 旬邑县| 岗巴县| 舟曲县| 句容市| 麻江县| 康保县| 乃东县| 青冈县| 松潘县| 交城县| 若尔盖县| 湾仔区| 南陵县| 开化县| 鹰潭市|