亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ARM和Linux的嵌入式平臺的構(gòu)建

        2011-02-28 05:10:32曾福振閔聯(lián)營
        關(guān)鍵詞:源代碼內(nèi)核分區(qū)

        曾福振,閔聯(lián)營

        (武漢理工大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢430063)

        進(jìn)入后PC時代以來,伴隨著設(shè)計和制造技術(shù)的發(fā)展,集成電路從當(dāng)初的晶體管集成發(fā)展到現(xiàn)在的IP集成,即SoC(System on Chip)設(shè)計技術(shù)。促使嵌入式系統(tǒng)滲透到了當(dāng)今社會中的各個行業(yè),并且發(fā)揮越來越重要的作用。嵌入式系統(tǒng)一般可定義為以應(yīng)用為中心、以計算機(jī)技術(shù)為基礎(chǔ)、軟硬件可裁剪、適用于應(yīng)用系統(tǒng)且對功能、成本、體積、功耗有嚴(yán)格要求的專用計算機(jī)系統(tǒng),它的主要特點是嵌入、應(yīng)用[1]。

        隨著各種嵌入式設(shè)備功能越來越強(qiáng)大,在設(shè)備中使用嵌入式操作系統(tǒng)也成為必然。Linux操作系統(tǒng)具有開放源代碼、易于移植、資源豐富、免費等特點,在嵌入式領(lǐng)域的地位越來越重要。嵌入式Linux和PC上的Linux是同一套內(nèi)核代碼,只是裁剪的程度不一樣,所以,很多在PC上開發(fā)的軟件,經(jīng)過交叉編譯后可以直接在嵌入式設(shè)備上運(yùn)行。本文主要涉及到Bootloader移植和Linux-2.6.32.2內(nèi)核的移植、根文件系統(tǒng)移植、在S3C2440平臺上構(gòu)建完整的嵌入式開發(fā)平臺三個方面。

        1 交叉開發(fā)環(huán)境的建立

        在進(jìn)行嵌入式軟件開發(fā)之前,必須要在PC上建立ARM的交叉編譯環(huán)境。交叉編譯就是在PC平臺上生成可以在ARM平臺上運(yùn)行的代碼。其中主要包括ARM的交叉編譯器arm-elf-gcc和交叉連接器arm-elf-ld。本文采用的交叉編譯器的版本是gcc-3.4.5-glibc-2.3.6[2]。交叉編譯流程如圖1所示。

        圖1 嵌入式系統(tǒng)交叉編譯流程

        2 BootLoader引導(dǎo)加載程序

        BootLoader是一段在系統(tǒng)上電時開始執(zhí)行的程序,用以初始化硬件設(shè)備,準(zhǔn)備好軟件環(huán)境,設(shè)置好啟動參數(shù),最后引導(dǎo)操作系統(tǒng),與PC上的 BIOS程序相似。當(dāng)前開放源碼的Linux引導(dǎo)程序主要有x86架構(gòu)的LILO、GRUB,對于ARM架構(gòu)的主要有Vivi和U-Boot。本文使用 U-Boot作為引導(dǎo)程序。U-Boot(Universal Boot Loader),即通用的BootLoader,遵循GPL條款開放源代碼。U-Boot相對于Vivi功能更加強(qiáng)大,也更方便后續(xù)程序的調(diào)試。

        BootLoader的啟動一般分為兩個階段,第一階段的代碼主要是用匯編語言編寫,主要的功能是完成硬件設(shè)備的初始化,為加載第二階段的代碼準(zhǔn)備RAM空間,設(shè)置好堆棧;第二階段主要用C語言編寫,檢測內(nèi)存映射,將內(nèi)核映像和根文件系統(tǒng)從Nand Flash讀到RAM中,為內(nèi)核啟動設(shè)置參數(shù),引導(dǎo)內(nèi)核。

        U-Boot的源代碼可以從ftp://ftp.denx.de/pub/u-boot/進(jìn)行下載,本文使用的U-Boot版本是U-Boot2009.08。

        移植U-Boot的關(guān)鍵步驟如下:

        (1)首先,將 include/configs目錄下的 smdk2410.h復(fù)制并改名為mini2440.h,根據(jù)U-Boot的說明可以知道,如果要使用開發(fā)板board/,則先執(zhí)行“make”_config命令進(jìn)行配置,然后執(zhí)行“make all”,生成可執(zhí)行文件。所以,修改 U-Boot頂層的Makefile文件,添加下面一行mini2440_config:unconfig@$(MKCONFIG)$(@:_config=)arm arm920t mini2440 frank s3c24x0。這里有幾個重要的參數(shù),arm指CPU的架構(gòu),arm920t指 CPU的類型,s3c24x0指 CPU的型號。這樣就可以使用make mini2440_config這條命令進(jìn)行配置。

        (2)本文使用的U-Boot是從Nand Flash啟動的,CPU可以直接訪問Nand Flash中前4 KB代碼,利用這4 KB代碼把U-Boot中絕大部分代碼拷貝到內(nèi)存中[3]。其中下面的代碼就是調(diào)用C語言中的Nand Flash的讀寫函數(shù),該函數(shù)主要把Nand Flash中4 KB以后的代碼復(fù)制到RAM中。在編寫nand_read_ll的函數(shù)時,注意參考Nand Flash的數(shù)據(jù)手冊,對大頁和小頁的Nand Flash,其讀寫的命令和時序是不同的。

        由于在后面加載Linux內(nèi)核和根文件系統(tǒng)時,使用的是tftp方式,所以必須添加DM9000EP網(wǎng)卡的驅(qū)動。在mini2440.h文件中,其主要的配置如下:

        其中,CONFIG_DM9000_BASE宏是最重要的,因為它定義的是網(wǎng)卡的地址,不同的網(wǎng)卡有不同的地址,DM9000EP訪問的基址為0x20000000,之所以再偏移0x300是由它的特性決定的。

        (3)要正確引導(dǎo)Linux內(nèi)核,還需要配置下面幾個重要的宏定義,這幾個宏定義不同,意味著引導(dǎo)Linux內(nèi)核的方式也不同。

        其中,root=/dev/mtdblock3是由Linux中的Nand Flash分區(qū)所決定的,意味著Nand Flash的第4個分區(qū)為根文件系統(tǒng)。

        這個宏定義是將Nand Flash中0x60000-0x560000(和kernel分區(qū)一致)的內(nèi)容讀到內(nèi)存 0x32000000中,然后用bootm命令來執(zhí)行。

        要正常地引導(dǎo)Linux內(nèi)核,必須要具備如下幾個條件

        [4]:

        (1)CPU寄存器

        R0=0;

        R1=機(jī)器類型ID;對于 ARM結(jié)構(gòu)的CPU,其機(jī)器類型 ID 在 linux/arch/arm/tools/mach-types;

        R2=啟動參數(shù)標(biāo)記列表在RAM中起始基地址。

        (2)CPU工作模式

        必須禁止中斷(IRQs和 FIQs);

        CPU必須為SVC模式。

        (3)Cach和MMU的設(shè)置

        MMU必須關(guān)閉;

        指令Cach可以打開也可以關(guān)閉;

        數(shù)據(jù)Cach必須關(guān)閉。

        3 Linux2.6.32.2內(nèi)核的移植

        3.1 內(nèi)核的獲取

        Linux內(nèi)核的更新很快,可以從http://www.kernel.org/pub/linux/kernel/得到最新的Linux內(nèi)核版本,本文使用的Linux內(nèi)核版本是Linux-2.6.32.2,交叉編譯工具使用符合EABI標(biāo)準(zhǔn)的arm-linux-gcc-4.3.2。

        3.2 內(nèi)核的移植

        可以在內(nèi)核的根目錄下,運(yùn)行make menuconfig命令,對內(nèi)核進(jìn)行適當(dāng)?shù)牟眉?,以適應(yīng)硬件平臺。

        (1)修改 Makefile文件

        欲設(shè)置Linux的默認(rèn)平臺為ARM平臺,需進(jìn)入Linux-2.6.32文件夾中,修改此目錄下的Makefile文件。

        (2)關(guān)于機(jī)器碼

        在啟動內(nèi)核時,根據(jù)BootLoader傳入的機(jī)器碼(MACH_TYPE)來決定應(yīng)啟動哪種目標(biāo)平臺[6],本開發(fā)平臺的機(jī)器碼為1999。機(jī)器碼存放在文件opt/kernel/linux-2.6.32.2/arch/arm/tools/mach-types中。

        如果機(jī)器碼不匹配,引導(dǎo)內(nèi)核不成功,則會出現(xiàn)如下的錯誤提示:

        (3)修改時鐘源

        將/kernel/linux-2.6.32.2/arch/arm/mach-s3c2440/目錄下的 mach-smdk2440.c文件改名為 mach-mini2440.c。因為mini2440和mach-smdk2440.c極其相似,以該文件為基礎(chǔ)進(jìn)行修改,在mach-mini2440.c文件中將static void__init smdk2440_map_io(void)函數(shù)中的晶振頻率修改為mini2440開發(fā)板上實際使用的12000000。

        (4)為內(nèi)核打上 yaffs2補(bǔ)丁

        ①Yaffs2文件系統(tǒng)是專門針對嵌入式設(shè)備,特別是使用Nand Flash作為存儲器的嵌入式設(shè)備而創(chuàng)建的一種文件系統(tǒng),使用yaffs2就可以支持大頁的Nand Flash。進(jìn)入 yaffs2源代碼目錄執(zhí)行如下命令:

        ②配置內(nèi)核以支持Yaffs2文件系統(tǒng)

        在 Linux內(nèi)核源代碼根目錄運(yùn)行 make xconfig,在“File Systems”選 項 中 ,找 到 “Miscellaneous filesystems”菜單項,找到“YAFFS2 file system support”并選中它,這樣就在內(nèi)核中添加了yaffs2文件系統(tǒng)的支持,保存并退出。然后在命令行中,執(zhí)行make zImage。

        (5)修改 Nand Flash分區(qū)信息

        ①在mach-mini2440.c文件中添加Nand Flash的分區(qū)信息,下面的代碼將Nand Flash分成了4個分區(qū),第1分區(qū)也是 BootLoader所在的分區(qū),對應(yīng) dev/mtdblock0;第2個分區(qū)是 U-Boot的參數(shù)分區(qū),對應(yīng) dev/mtdblock1;第 3個分區(qū)是內(nèi)核分區(qū),對應(yīng)dev/mtdblock2;第 4個分區(qū)為根文件系統(tǒng)分區(qū)對應(yīng)dev/mtdblock3。分區(qū)結(jié)構(gòu)圖如表1所示。

        表1 128 MB Nand Flash的分區(qū)結(jié)構(gòu)圖

        其部分實現(xiàn)代碼如下:

        其中 name是分區(qū)的名字,offset是偏移的開始地址,size是分區(qū)的大小,其余部分的分區(qū)與此類似。

        ②下面代碼是添加Nand Flash的設(shè)置表,因為板子上只有一片Nand Flash,因此也就只有一個設(shè)置表。

        ③上面的設(shè)置完成后,還需要將Nand Flash設(shè)備注冊到系統(tǒng)中。下面這段代碼就是將Nand Flash設(shè)備添加到開發(fā)板的設(shè)備列表結(jié)構(gòu)。

        現(xiàn)在可以進(jìn)入kernel/linux-2.6.32.2/arch/arm/boot目錄,然后執(zhí)行下面的命令,就會在該目錄下生成uImage.img格式的、U-Boot可以引導(dǎo)的內(nèi)核鏡象。

        至此,可以把生成的uImage.img格式的鏡像文件復(fù)制到tftp目錄下,使用tftp進(jìn)行下載。

        3.3 文件系統(tǒng)

        所謂根文件系統(tǒng),就是創(chuàng)建各個目錄,例如在/bin、/sbin/目錄下存放各種可執(zhí)行的程序,在/etc目錄下存放配置文件,在/lib目錄下存放庫文件。

        可以利用Busybox工具創(chuàng)建根文件系統(tǒng),Bosybox是一個遵循 GPL v2協(xié)議的開源項目,它在編寫過程中對文件大小進(jìn)行優(yōu)化,并考慮了系統(tǒng)資源有限(例如內(nèi)存)的情況,使用 Busybox可以自動生成根文件系統(tǒng)所需的bin、sbin、usr目錄和 linuxrc文件,可以使用 make menuconfig對Busybox的選項進(jìn)行配置。

        (1)進(jìn)入 opt/kernel,創(chuàng)建一個 shell腳本用于構(gòu)建根文件系統(tǒng)的各個目錄,并且為其增加執(zhí)行權(quán)限;

        (2)Linux中的init進(jìn)程會根據(jù)etc/inittab文件創(chuàng)建其他子進(jìn)程,下面代碼是inittab文件中的內(nèi)容,說明了系統(tǒng)啟動后首先執(zhí)行的腳本文件是rcS,虛擬的終端是串口 0,當(dāng)按下 ctr+alt+del時重啟系統(tǒng),inittab文件的作用就是控制系統(tǒng)啟動時和啟動后一些程序的運(yùn)行。

        使用yaffs源碼提供的工具制作文件系統(tǒng)的映像文件。由于128 MB的Nand Flash是大頁結(jié)構(gòu),所以需要使用相應(yīng)的大頁制作工具;使用命令mkyaffs2image rootfs rootfs.img生成根文件系統(tǒng)映像文件。

        本文通過對U-Boot移植和Linux內(nèi)核移植的討論,給出了移植U-Boot和Linux到大多數(shù)開發(fā)板的關(guān)鍵部分。由于移植的復(fù)雜性,不可能包括全部步驟,但通過本文的闡述可以了解移植的基本流程和關(guān)鍵點,為移植不同版本到其他硬件平臺提供了參考,也為應(yīng)用程序的開發(fā)搭建了一個比較完整的嵌入式平臺。

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

        [2]孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解[M].北京:人民郵電出版社,2006.

        [3]Samsung Electronics.S3C2440A 32-bit RISC microprocessor user′s manual[S].2004.

        [4]RUSSELL K.ARM Linux kernel Boot requirements[EB/OL].[2002-03-18].http://www.arm.linux.org.uk/developer/booting.php.

        [5]陳莉君.深入理解 Linux內(nèi)核[M].北京:中國電力出版社,2007.

        [6]JONATHAN C,ALESSANDRO R,GREG KROAH H.Linux

        設(shè)備驅(qū)動程序[M].北京:中國電力出版社,2006.

        猜你喜歡
        源代碼內(nèi)核分區(qū)
        人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
        萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
        上海實施“分區(qū)封控”
        強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
        基于TXL的源代碼插樁技術(shù)研究
        基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
        Linux內(nèi)核mmap保護(hù)機(jī)制研究
        軟件源代碼非公知性司法鑒定方法探析
        浪莎 分區(qū)而治
        揭秘龍湖產(chǎn)品“源代碼”
        一区二区三区蜜桃av| 又黄又爽又高潮免费毛片| 偷窥村妇洗澡毛毛多| 精品无码人妻久久久一区二区三区 | 日本一区二区三区视频免费观看| 国产裸体美女永久免费无遮挡| 国产精品欧美福利久久| 亚洲欧美国产双大乳头| 最新永久无码AV网址亚洲| 丰满熟女人妻一区二区三区| av色一区二区三区精品| 99久久免费只有精品国产| 精品久久久中文字幕人妻| 99精品久久久中文字幕| 亚洲黄片av在线免费观看| 91三级在线观看免费| 亚洲一区二区三区影院| 老子影院午夜精品无码| 成人午夜视频一区二区无码| 精品av一区二区在线| 国产一区二区三区在线蜜桃| 久久精品国产亚洲av网站| 亚洲av一宅男色影视| 国产亚洲女人久久久久久| 精品国产女主播一区在线观看| 国产丝袜美腿精品91在线看| 痉挛高潮喷水av无码免费| 亚洲AV无码秘 蜜桃1区| 久久夜色精品国产九色| 人妻熟女翘屁股中文字幕| 久久无码专区国产精品| 亚洲免费观看在线视频| 日韩精品视频在线一二三| 男女激情视频网站在线| 亚洲女同一区二区| 国产亚洲av手机在线观看| 无码天堂在线视频| 少妇被粗大猛进进出出男女片| 国产精品永久在线观看| 亚洲人成绝费网站色www| 中文字幕高清无码不卡在线|