第一篇:應(yīng)用Scratchbox構(gòu)建基于CF卡的嵌入式linux系統(tǒng)
應(yīng)用Scratchbox構(gòu)建基于CF卡的嵌入式Linux系統(tǒng)
石濤 師衛(wèi)
(太原理工大學(xué)信息工程學(xué)院 山西省 太原市 030024)
摘要: 本文介紹了一種應(yīng)用Scratchbox構(gòu)建Linux操作系統(tǒng)的新方法,詳細(xì)論述了應(yīng)用Scratchbox和Busybox等開源軟件在CF卡上構(gòu)建一個嵌入式Linux操作系統(tǒng)的全過程。關(guān)鍵詞:Busybox; Scratchbox ;CF ;嵌入式Linux操作系統(tǒng) 中圖法分類號:TP399文獻(xiàn)標(biāo)識碼:A
Construction of embeded Linux on CF card using Scratchbox
SHI Tao, SHI Wei
(Department of Information Engineering,Taiyuan University of Technology,Shanxi Taiyuan,030024)
Abstract:This paper introduces a new method of building embedded Linux using Scratchbox.It also describes the whole process in detail of building a embedded Linux on CF card using Scratchbox and Busybox etc, open source software.Key Words:Busybox;Scratchbox;CF;embedded Linux
面的4項內(nèi)容,分別來構(gòu)建Linux根文件系統(tǒng),這樣不僅增加了開發(fā)的時間和成本,而且增加了開發(fā)的難度,很難成功。在長期的摸索和實踐中,我們發(fā)現(xiàn)了一種新的開源軟件Scratchbox,利用他來構(gòu)建嵌入式Linux系統(tǒng)可以達(dá)到事半功倍的效果。
Scratchbox是一個交叉編譯的工具組,可以簡化嵌入式Linux應(yīng)用開發(fā)。Scratchbox提供了一組工具,用這組工具我們可以構(gòu)建一個完整的Linux交叉編譯環(huán)境。用Scratchbox來構(gòu)建嵌入式Linux系統(tǒng)具有以下優(yōu)點:
1)運行與chroot的環(huán)境中,完全獨立于主機,編譯2)可以很容易的變換目標(biāo)系統(tǒng)中的工具鏈。3)根據(jù)Linux系統(tǒng)的目標(biāo)運行環(huán)境對chroot后的系過程將與主機系統(tǒng)無關(guān)。
引言
Linux由于其內(nèi)核的可裁剪性,而受到嵌入式市場應(yīng)用領(lǐng)域的青睞。在某些領(lǐng)域,Linux實際上已經(jīng)處于領(lǐng)導(dǎo)地位,成為最流行的嵌入式操作系統(tǒng)之一。然而,我們在應(yīng)用嵌入式Linux操作系統(tǒng)時,都面臨著如何快速方便的構(gòu)建一個特定的嵌入式環(huán)境的問題。本文在這里探索了一種新的方法,利用Scratchbox、Busybox等開源軟件實現(xiàn)基于CF卡的嵌入式linux系統(tǒng)的構(gòu)建。
統(tǒng)進(jìn)行定制,這樣就可以進(jìn)行交叉編譯,使軟件誤認(rèn)為是在1、嵌入式Linux系統(tǒng)構(gòu)建方法介紹
嵌入式Linux系統(tǒng)包含引導(dǎo)程序、內(nèi)核和文件系統(tǒng)3
目標(biāo)平臺上進(jìn)行編譯。
4)可以自動創(chuàng)建Linux的根文件系統(tǒng)所需的目錄結(jié)構(gòu)?;赟cratchbox以上幾個優(yōu)點,我們完全可以在自己
部分。對于嵌入式Linux系統(tǒng)來說,這三個部分是必不可少的。在這3個部分中,構(gòu)建Linux的根文件系統(tǒng)是最困難的。在這里主要介紹一些構(gòu)建Linux根文件系統(tǒng)的方法。
Linux的根文件系統(tǒng)具有非常獨特的特點,就其基本組成來說,Linux的根文件系統(tǒng)應(yīng)該包括支持Linux系統(tǒng)正常運行的基本內(nèi)容,包含著系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件。因此,至少應(yīng)該包括以下幾項內(nèi)容。
1)基本的文件系統(tǒng)結(jié)構(gòu),包含一些必需的目錄:2)基本程序運行所需的庫函數(shù),如Glibc/uC-libc。3)基本的系統(tǒng)配置文件,比如rc,inittab等腳本文/dev,/proc,/bin,/etc,/sbin,/usr,/lib,/tmp等。的主機系統(tǒng)中用Scratchbox構(gòu)建一個基于目標(biāo)平臺的虛擬系統(tǒng),chroot進(jìn)這個系統(tǒng)之后,對工具鏈和函數(shù)庫進(jìn)行定制編譯。然后將Scratchbox創(chuàng)建好的根文件系統(tǒng)拷貝到目標(biāo)平臺上即可。
2、構(gòu)建嵌入式Linux系統(tǒng)
2.1 Linux操作系統(tǒng)裁剪
由于CF卡的容量大小有限,我們在CF卡上構(gòu)建Linux
操作系統(tǒng)時,需要對Linux內(nèi)核進(jìn)行裁剪。要得到一個精簡的Linux操作系統(tǒng),大致有二個步驟:編譯裁剪內(nèi)核,形成精簡的內(nèi)核映像;構(gòu)建根文件系統(tǒng),形成可以運行的新系統(tǒng)。
件。
4)基本的應(yīng)用程序,如sh,ls,cp,mv等。
傳統(tǒng)的構(gòu)建Linux根文件系統(tǒng)方法,通常都是按照上
2.2.1 編譯Linux內(nèi)核
Linux內(nèi)核裁剪主要是根據(jù)系統(tǒng)所需要的功能,縮減掉不需要的模塊和組件,重新編譯內(nèi)核。Linux內(nèi)核由專門的機構(gòu)維護(hù),我們可以從
Linux
官方網(wǎng)站
(http:// 通信地址:太原理工大學(xué)北區(qū)3241信箱 郵編:030024
聯(lián)系電話:0351-6011570,***師衛(wèi) 男
太原理工大學(xué)信息工程學(xué)院,電路與系統(tǒng) 碩士導(dǎo)師,主要研究方向嵌入式系統(tǒng)應(yīng)用
第二篇:構(gòu)建嵌入式linux系統(tǒng)
構(gòu)建嵌入式linux系統(tǒng)
(MP3播放器)
功能要求:
(1)系統(tǒng)(bootloader,kernel,rootfs)燒寫在板子中;
(2)打開電源開關(guān),系統(tǒng)自動啟動,啟動最后進(jìn)入到一個GUI界面(MP3播放器)。
(3)用戶可以操作該界面,播放歌曲。
具體要求:
(1)自定義的bootloader添加內(nèi)核啟動功能;或者修改u-boot的go命令使之能夠啟動zImage。
(2)根文件系統(tǒng)制作時,移植Qt庫。
(3)sqlite3的移植
(4)madplay移植
./configure--help
--host=arm-linux
第三篇:基于CF卡的 linux系統(tǒng)制作
在CF卡上安裝嵌入式linux全過程
吳剛 2007-4-4 摘要:本文主要介紹在一塊128M的CF卡上定制安裝linux操作系統(tǒng),并在此基礎(chǔ)上建立一個簡單的應(yīng)用平臺。
關(guān)鍵詞:extlinux,busybox, CF卡,嵌入式linux
隨著信息技術(shù)和網(wǎng)絡(luò)技術(shù)的高速發(fā)展,嵌入式技術(shù)的廣泛應(yīng)用,嵌入式系統(tǒng)已經(jīng)打破傳統(tǒng)PC工業(yè)的壟斷地位,成為非PC設(shè)備的主體。而作為嵌入式系統(tǒng),應(yīng)用環(huán)境通常比較惡劣,而應(yīng)用又比較簡單,為保證系統(tǒng)的穩(wěn)定性和便攜性通常使用DOM卡或CF卡一類的存儲設(shè)備來代替硬盤。
經(jīng)過一段時間的摸索和收集資料終于在一塊CF卡上實踐安裝了一個滿足特定需要的嵌入式linux系統(tǒng),這里取名為cflinux.在這里首先要感謝《babylinux制作全過程的》作者,正是這片文章,為我制作cflinux指明了道路。本文將講述在一張容量為128M的CF卡上定制安裝嵌入式linux操作系統(tǒng)的詳細(xì)過程,一 主機和目標(biāo)機情況簡介
主機:
Linux:Red Hat 9.0 Kernel: 2.4.20 目標(biāo)機:
基于X86的工控板
二 cflinux簡介
cflinux是一運行于CF卡上的經(jīng)過自定義剪裁的嵌入式linux操作系統(tǒng)。因其運行于CF卡上,故取名為cflinux.當(dāng)此操作系統(tǒng)和應(yīng)用環(huán)境搭建好后可以通過網(wǎng)絡(luò)telnet和串口訪問目標(biāo)板,可運行QT/E圖形界面應(yīng)用程序。可以通過串口,網(wǎng)口和USB口和外圍設(shè)備交互。既可作為嵌入式操作系統(tǒng),也可作為啟動盤作為系統(tǒng)維護(hù)工具。
三 linux得引導(dǎo)過程簡介
在系統(tǒng)啟動時,主板上的BIOS會讀取硬盤的主引導(dǎo)記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬盤讀取操作系統(tǒng)核心文件并運行,因為這個程序太小了,因此通常這個小程序不具備直接引導(dǎo)系統(tǒng)內(nèi)核的能力,他先區(qū)引導(dǎo)另一個稍微大一點的小程序去引導(dǎo)系統(tǒng)內(nèi)核。在linux系統(tǒng)中這樣得小程序有LILO,GRUB和SYSLINUX等。我們在這個項目中這里用到的引導(dǎo)程序是SYSLINUX得一個分支:EXTLINUX。
Linux系統(tǒng)內(nèi)核被引導(dǎo)程序裝進(jìn)內(nèi)存并運行后,linux內(nèi)核會檢測系統(tǒng)中得各種硬件,并做好硬件得初始化工作,使他們在系統(tǒng)正式運行后能正常工作。剩下就是linux內(nèi)核要做得最后一個工作:運行/sbin下得init程序。Init是英文單詞(initialization)初始化得簡稱,init程序得工作是讀取/etc/inittab文件中的指令,對系統(tǒng)的各種軟硬件環(huán)境做最初的初始化工作,最后運行g(shù)ettty活mingetty等待用戶輸入用戶名和密碼(當(dāng)然根據(jù)需要也可以跳過登錄這個步驟,直接以root身份登錄)。所有的工作就是這么簡單。明白了這個道理,你也可以寫一些腳本程序讓他在系統(tǒng)啟動時的特定時間完成運行,完成你指定的任務(wù)。/sbin/init程序只是系統(tǒng)默認(rèn)的運行的第一個程序,他可以是一個二進(jìn)制程序也可以是一段bash腳本,一個指向另一個程序的鏈接。他的位置也并不一定在/sbin下,只要啟動內(nèi)核時加上init參數(shù)節(jié)能被運行,開始時給內(nèi)核加上init=/bin/sh參數(shù),內(nèi)核就能直接運行時并給出提示符,不需要登陸。
四 extlinux安裝
EXTLINUX是SYSLINUX的一個新的派生。可以從linux系統(tǒng)的ext2和ext3文件系統(tǒng)啟動。EXTLINUX使用和SYSLINUX相似,只需做一點改動即可。首先從http://004km.cn/pub/linux/utils/boot/syslinux/ 上下載syslinux-3.20.tar.gz。
cp syslinux-3.20.tar.gz /usr/tmp tar xzvf syslinux-3.20.tar.gz 進(jìn)行解壓。然后用IDE to CF轉(zhuǎn)接卡把CF卡連到主機上(注意:一般CF卡是不支持熱插拔的,故插上CF后一般需要重新啟動主機系統(tǒng))。我的CF卡對應(yīng)的設(shè)備文件是hdd1.在這里先使用fdisk工具把CF卡分成兩個區(qū),一個用于存放內(nèi)核和randisk,另一個用于存放應(yīng)用程序及相關(guān)文件。Fdisk的使用可參見相關(guān)資料,這里不做詳細(xì)說明。我的CF卡主分區(qū)為hdd1,擴展分區(qū)為hdd2,將所有的擴展分區(qū)都分給邏輯分區(qū)hdd5。分好區(qū)后,將hdd1 和 hdd5格式化為ext2系統(tǒng) mke2fs –m 0 /dev/hdd1 mke2fs –m 0 /dev/hdd5 //-m 0參數(shù)的作用是告訴系統(tǒng)不為root保留空間 一切準(zhǔn)備好后,就可以安裝EXTKINUX了,安裝步驟如下: mount –t auto /dev/hdd1 /mnt cd /usr/tmp/syslinux-3.20/extlinux./extlinux –i /mnt
安裝成功后會提示extlinux 成功安裝到/mnt,然后在/mnt目錄下會出現(xiàn)extlinux.sys文件。
umount /mnt 至此extlinux已經(jīng)安裝完畢,可以把CF卡插到工控板上,上電啟動一下看看有什么效果。如果安裝成功的話,啟動后會出現(xiàn)如下的提示:
EXTLINUX 3.20 2006-08-06 EBIOS Copyright(c)1994-2005 H.peter Anvin Could not finf kernel image:linux boot: 注:關(guān)于extlinux的詳細(xì)使用方法,請參閱syslinux-3.20目錄下的extlinux.doc文件
五 linux內(nèi)核編譯
在內(nèi)核編譯前,我們首先要明確你需要內(nèi)核支持什么樣的硬件,支持多少種分區(qū)類型和文件系統(tǒng),支持那些網(wǎng)卡,支持那些網(wǎng)絡(luò)協(xié)議等等。雖然現(xiàn)在有128兆的空間,但也不能什么都要,夠用就行啊。好了,現(xiàn)在開始內(nèi)核的編譯工作。首先準(zhǔn)備好內(nèi)核代碼,可以到官方網(wǎng)站上下載,我的內(nèi)核源碼是安裝linux時帶上的,在/usr/src/linux-2.4/目錄下。cd /usr/src/linux-2.4 make mrproper 清理源碼樹 make menuconfig 然后對各項取舍如下:(至于具體配置項的意義,請參考相關(guān)資料,不在本文討論范圍之內(nèi))
code maturity level options 先不選,當(dāng)我們配置好常規(guī)的東西,要加入framebuffer支持時再將這一項選上。因為在2.4.20版本中,對frambuffer的支持尚屬于試驗性代碼,如果不選擇此項將不能配置frambuffer.Load module support 取消選擇此項,為了簡化系統(tǒng)的制作,這個項目中將不選擇可加載內(nèi)核模塊的支持。
Processer type and features Processor family中選擇你需要的cpu類型,如果你想讓老至386,新到p4的CPU都能運行cflinux的話,請選擇386,否則根據(jù)實際情況來選擇。建議選386。
General setup Networking support 都選上
PCI支持 選上,除非你不用PCI設(shè)備,不過一般人都要的,因為大部分的網(wǎng)卡都是PCI的。
System V ipc 選上 Systrl support選上
Kernel support for ELF 選上
其他內(nèi)容如果沒什么特殊需要,都不選。
Memory technology devices(MTD)不選
Parallel port support 由于本項目中需要使用并口打印機,故將此項選上
Plug and play configuration 不選
Block devices Normal floppy disk support 不選
Loopback device support RAM disk support Initial RAM disk(initrd)support Per partion statics in /proc/partions
以上幾項都選上。由于這幾項比較重要這里做詳細(xì)說明。Loopback device 即回環(huán)設(shè)備,我們平時用的命令瓜子ramdisk或光盤鏡像時都用到回環(huán)設(shè)備。如:mount –o loop ramdisk.img /mnt RAM disk support 即內(nèi)存磁盤(比較貼切的說法是虛擬磁盤,即撥出一部分內(nèi)存當(dāng)磁盤用)。本項目中將所有系統(tǒng)的的文件都做成ramdisk,所以在運行時你在根文件系統(tǒng)上所作的操作都是在內(nèi)存中完成的,但形式上和在真正的磁盤上運行一樣。只不過放在RAM disk上的所有內(nèi)容會在系統(tǒng)關(guān)閉后全部消失。
不僅在運行cflinux時用到ramdisk,我們在制作根文件系統(tǒng)時也用到ramdisk。學(xué)習(xí)ramdisk的使用也是制作cflinux的重要目標(biāo)之一。在linux中還支持另外一種虛擬磁盤:shm.(shared memory),這種要虛擬磁盤機制比ramdisk更加先進(jìn)。Ramdisk的大小是固定的,由編譯內(nèi)核時的default ram disk size決定,默認(rèn)為4096K,因為本項目中要往ramdisk中放很多東西,故這里我們要將其改為8192K(8M)。也可以在內(nèi)核加載錢加上ramdisk_size=參數(shù)來決定他的大小,但系統(tǒng)一啟動,ramdisk的大小是不能改變的,而shm的大小卻是動態(tài)改變的。默認(rèn)情況下為物理內(nèi)存的一半,當(dāng)系統(tǒng)需要更多內(nèi)存的時候,他就自動縮小。系統(tǒng)內(nèi)存富余時,他又會自動增大,這樣可以充分靈活的利用內(nèi)存空間,shm通常作為磁盤的高速緩存,放在系統(tǒng)運行中的臨時文件等。既然shm這么好,為什么這里還使用ramdisk呢,因為ramdisk可以很方便的在系統(tǒng)啟動時加載,而shm則沒那么容易。Initial RAM disk(initrd)support 即初始化ramdisk支持,這個選項讓內(nèi)核有能力在內(nèi)核加載階段就能裝入RAMDISK,并運行其中的內(nèi)容。否則只能在系統(tǒng)運行階段用ramdisk,我們平時編譯了一個內(nèi)核后,如果你的根文件系統(tǒng)用的是ext3,而你沒有把ext編譯進(jìn)內(nèi)核,而作為一個模塊編譯了,那么就需要用mkinitrd命令做一個initrd,這個ramdisk里放了ext3的模塊,這樣內(nèi)核在加載根文件系統(tǒng)前就能正確識別ext3系統(tǒng),否則內(nèi)核加載的最后一步就會出現(xiàn)kernel panic cant not find init?..的錯誤。
Per partion statics in /proc/partions 這個選項不是必須的,但是不把這個選項編譯進(jìn)內(nèi)核在執(zhí)行fdisk指令時就會提示找不到/proc/partions,另外還可能出現(xiàn)不能以簡寫的掛載命令來掛載文件系統(tǒng)。所以我把該選項也編譯進(jìn)內(nèi)核。
Multi-device support(RAID and LVM)不選 Cryptography support(CryptoAPI)不選
Networking options 在這一大項中需要把下列項目編譯進(jìn)內(nèi)核: Packet socket:mmapped IO TCP/IP networking 對于IP:advanced router 這項,如果你想重點把cflinux用做靜態(tài)路由軟件,那么把這項編譯進(jìn)去。另外unix domain sockets 這項也不必選擇,只有運行X的情況下才需要這項。
Telephony support 不選
ATA/IDE/MFM/RLL support 選上,然后在下面的“IDE,ATA and ATAPI Block Devices”按鈕就被激活,下面幾項選上,其余都不用選
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support Include IDE/ATA-2 DISK support Auto-Geometry Resizing support Include IDE/ATA CDROM support
SCSI support 因為這個項目中是通過CF卡啟動的,所以把這項也選上。在這個大項中只需選擇一下3項即可: SCSI disk support SCSI generic support SCSI tape support
Fusion MPT device support 不選 IEEE1394(FireWrite)support 不選
I2O device support 選上,子項全部選上 Network device support 選上,這樣就可以支持網(wǎng)卡了,其余都選擇N.然后點Ethernet(10 or 100 Mbit)按鈕選擇你 需要的網(wǎng)卡驅(qū)動,你可以把最常見的幾種Reltek8139,NE2000,3COM等網(wǎng)卡編譯進(jìn)內(nèi)核.雖然網(wǎng)卡的驅(qū)動通常都很小
如果你發(fā)現(xiàn)你需要的網(wǎng)卡是灰色的,不能點,那么先確定他上一級的選項已經(jīng)點了,比如你想選NE2000的網(wǎng)卡,就必需先選擇ELSA,VLB,PCI and on board controllers.如果還不能點,那么請確定是否已經(jīng)把PCI的支持選項選上了,(在Geneal setup)里.沒有PCI的支持,PCI的網(wǎng)卡將不能選.Amateur Radio support 不選 IrDA(infrared)support 不選 ISDN subsystem 不選
Old CD-ROM drivers(not SCSI,not IDE)不選
Import core support 因為本項目中要使用到鍵盤和鼠標(biāo),所以選上該項,其子項也全部選中。然后把Horizontal screen resoulution 改為 800,vertial scrren resoulution 改為600。
Character devices 這一項和block devices一樣重要,這里將作重點講述。
如果要在終端上顯示系統(tǒng)信息就必須將virtual terminal 和support for console on virtual terminal 選上。因為本項目中防治系統(tǒng)信息覆蓋掉QT的圖形界面,所以沒選這兩項。
接下來就是對串口的指出。因為本項目中需要通過串口和并口與設(shè)備交互,故下面幾項都要選上:
Standard(gtneric18250/16550 and compatible UARTs)serial support Support for console serial port Extended dumb serial driver options Support special multport boards Non-standard serial port support
Unix98 PTY support(telnetd 服務(wù)用到)Parallel printer support Support for console on line printer Support for user-space parallel device drivers
哈哈,下面的文件系統(tǒng)可是個重頭戲哦,配置完這一項,整個內(nèi)核配置也基本急速了。選上下面幾個常用的文件系統(tǒng)選項: Kernel auto mounter support Kernel automounter version 4 support DOS FAT fs support MSDOS fs support UMSDOS:unix-like file system on top of standard MSDOS VFAT fs support EFS file system support /proc file system support 少了他很多軟件和命令都不能運行 /dev/pts file system for unix98 PTYs telnetd服務(wù)用到 ROM file system support Second extended fs support cflinux的基本文件系統(tǒng)
最后是console drivers 這是linux在字符模式下高分辨率顯示的內(nèi)核模塊,前面三個子項都選上。
Frame-buffer support 按鈕是灰色的不能選,別急,回到第一個大項,選上他,然后在Frame-buffer support的子項中選上 Support for framebuffer devices VESA VGA granphics console 你也可以選擇其他的顯卡驅(qū)動,比如nVida的,但是VESA和VGA是通用性最好的,只要不是幾十年前的黑白卡,都兼容VESA和VGA。Support only 8 pixels wide fonts 這個一定要選,否則當(dāng)你給內(nèi)核傳遞vga=768參數(shù),讓linux在字符界面下高分辨率顯示的時候,系統(tǒng)會因為找不到合適的字體而返回低分辨率模式。
好了,所有的內(nèi)核配置到這里就全部結(jié)速了,剩下的幾個大項全部不用選。保存退出。make dep make baImage 編譯好的內(nèi)核放在:/usr/src/linux-2.4.20-8/arch/i386/boot目錄下 將其拷貝到CF卡的主分區(qū)上: mount /dev/hdd1 /mnt cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /mnt
到此為止我們已經(jīng)安裝好了extlinux和內(nèi)核編譯,現(xiàn)在就可以試試剛編譯的內(nèi)核是否能啟動了。不過首先要在bzImage所在的目錄建立extlinux.conf配置文件,告訴extlinux在哪里尋找內(nèi)核和ramdisk。extlinux.conf的格式如下: default emblinux display logo.txt label emblinux kernel bzImage append root=/dev/hdc1 initrd=ramdisk.img ide=nodma vga=0x0314 保存即可。注:在工控板上cf卡對應(yīng)的設(shè)備是hdc所以這里用root=/dev/hdc1 指明根文件系統(tǒng)所在 initrd=ramdisk.img 指明ramdisk名稱。
ide=nodma 告訴內(nèi)核不使用DMA控制器,這是針對CF卡的一個選項。vga=0x0314 指明分辨率為800×600
執(zhí)行 umount /mnt 卸載CF卡,然后將CF卡插到工控板上上電啟動,看看是不是能看到系統(tǒng)內(nèi)核啟動信息了啊。
六 編譯busybox 1 busybox簡介
Busybox是一個集成一百多個最長用的linux命令和工具的軟件,他甚至還集成了http服務(wù)器、dhcp服務(wù)器和telnet服務(wù)器,而所有這些功能卻只有1M左右的大小。我們平時用的那些linux命令就好比分離的電子元件,而busybox就好比是一個集成電路,把常用的工具和命令集成壓縮在一個可執(zhí)行的文件里,功能基本不變,而大小卻小很多倍,在嵌入式式linux中使用非常廣泛?,F(xiàn)在最新的busybox版本是1.5.0可以從busybox的官方網(wǎng)站上下載得到:http://004km.cn> # # Note: BusyBox init doesn't support runlevels.The runlevels field is # completely ignored by BusyBox init.If you want runlevels, use # sysvinit.# # Format for each entry: # # id == tty to run on, or empty for /dev/console # runlevels == ignored # action == one of sysinit, respawn, askfirst, wait, and once # process == program to run # Startup the system null::sysinit:/bin/mount-o remount,rw / null::sysinit:/bin/mount-t proc proc /proc null::sysinit:/bin/mount-a >> /etc/mtab null::sysinit:/bin/hostname-F /etc/hostname null::sysinit:/sbin/ifconfig lo 127.0.0.1 up null::sysinit:/sbin/ifconfig-a eth0 null::sysinit:/sbin/ifconfig eth0 192.168.4.44 netmask 255.255.255.192 null::sysinit:/sbin/route add-net 127.0.0.0 netmask 255.0.0.0 lo null::sysinit:/sbin/route add-net 192.168.4.0 netmask 255.255.255.255 eth0 # now run any rc scripts ::sysinit:/etc/init.d/rcS # Set up a couple of getty's # 使用login登陸管理 tty1::respawn:/sbin/getty 38400 tty1 #不需要登陸直接進(jìn)入控制臺,進(jìn)行操作 #tty1::respawn:/bin/sh tty2::askfirst:/bin/sh # Put a getty on the serial port #ttyS0::respawn:/sbin/getty-L ttyS0 115200 vt100 # Stuff to do for the 3-finger salute ::ctrlaltdel:/sbin/reboot ::restart:/sbin/init # Stuff to do before rebooting null::shutdown:/bin/umount-a –r passwd: root:x:0:0:root:/root:/bin/sh cf:x:1001:0:Linux User,,:/home/soullon:/bin/sh shadow: root::10933:0:99999:7::: cf::13604:0:99999:7::: 注意:這里兩個用戶都沒設(shè)密碼,如果要加密碼胡話在用戶名后的第一個“:”和第二個“:”之間加上密碼胡hash值。如: root:$1$NuFDgiiI$664QR8N4HSdgkUDKpxEB00:10933:0:99999:7::: shadow-: root::10933:0:99999:7::: cf::13604:0:99999:7::: resolv.conf -> /tmp/resolv.conf fstab: /dev/hdc1 / ext2 defaults 1 1 /dev/hdc1 / ext2 defaults 1 1 none /proc proc defaults 0 0 usbdevfs /proc/bus/usb usbdevfs rw 0 0 none /dev/pts devpts rw,gid=5,mode=620 0 0 none /tmp tmpfs defaults 0 0 /dev/hdc5 /myapp ext2 defaults 0 0 init.d(目錄): rcS: #start inetd and telnetd /sbin/telnetd-p 23 #run myapp export QTDIR=/yysg export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/myapp/lib:/usr/lib cd /myapp./myapp –qws issue: Welcome to CFLinux profile : # ~/.bashrc: executed by bash(1)for non-login interactive shells.export PATH= /bin: /sbin: /usr/bin: /usr/sbin: /usr/bin/X11: /usr/local/bin # If running interactively, then: if [ “$PS1” ];then if [ “$BASH” ];then export PS1=“[u@h W]$ ” alias ll='/bin/ls--color=tty-laFh' n/ls--color=tty-F' export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:';else if [ “`id-u`”-eq 0 ];then export PS1='# ' else export PS1='$ ' fi fi export USER=`id-un` export LOGNAME=$USER export HOSTNAME=`/bin/hostname` export HISTSIZE=1000 export HISTFILESIZE=1000 export PAGER='/bin/more ' export EDITOR='/bin/vi' export INPUTRC=/etc/inputrc export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile ### Some aliases alias ps2='ps facux ' alias ps1='ps faxo “%U %t %p %a” ' alias af='ps af' alias cls='clear' alias df='df-h' alias indent='indent-bad-bap-bbo-nbc-br-brs-c33-cd33-ncdb-ce-ci4-cli0-cp33-cs-d0-di1-nfc1-nfca-hnl-i4-ip0-l75-lp-npcs-npsl-nsc-nsob-nss-ts4 ' #alias bc='bc-l' alias minicom='minicom-c on' alias calc='calc-Cd ' alias bc='calc-Cd ' fi; inputrc: # /etc/inputrc-global inputrc for libreadline # See readline(3readline)and `info readline' for more information.# Be 8 bit clean.set input-meta on set output-meta on set bell-style visible # To allow the use of 8bit-characters like the german umlauts, comment out # the line below.However this makes the meta key not work as a meta key, # which is annoying to those which don't need to type in 8-bit characters.# set convert-meta off “e0d”: backward-word “e0c”: forward-word “e[h”: beginning-of-line “e[f”: end-of-line “e[1~”: beginning-of-line “e[4~”: end-of-line #“e[5~”: beginning-of-history #“e[6~”: end-of-history “e[3~”: delete-char “e[2~”: quoted-insert # Common standard keypad and cursor #(codes courtsey Werner Fink, securetty: tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8 ttyS0 ttyS1 ttyS2 ttyS3 network(目錄): interfaces: # Configure Loopback auto lo iface lo inet loopback 八 復(fù)制需要的庫到/lib目錄下 1 看看需要什么庫 進(jìn)入busybox編譯目錄,執(zhí)行l(wèi)dd指令看看需要哪些動態(tài)聯(lián)結(jié)庫 #cd /usr/tmp/busybox-1.5.0 #ldd busybox 會出現(xiàn)如下信息: libcrypt.so.1-> /lib/libcrypt.so.1(0x40029000)libc.so.6-> /lib/tls/libc.so.6(0x42000000)/lib/ld-linux.so.2-> /lib/ld-linux.so.2(0x4000000) 2 拷貝庫文件 然后把這些庫文件相關(guān)聯(lián)的庫文件都拷貝到相應(yīng)的目錄: #cd /usr/tmp/rootfs/lib #cp –arf /lib/libcrpt*./ #cp –arf /lib/ld-linux*./ #mkdir tls #cp –arf /lib/tls/libc.so*./tls/ 如果你的應(yīng)用程序還需要其他的動態(tài)庫,且不是很大的話都可以放過來。 九 制作ramdisk映象文件 cflinux根文件系統(tǒng)需要的所有東西都已經(jīng)在/usr/tmp/rootfs目錄下準(zhǔn)備好了。我們將利用ramdisk把這些內(nèi)容做成ramdisk映象文件。 以下是ramdisk的制作過程。#cd /usr/tmp #mkdir ramdisk #dd if=/dev/zero of=./ramdisk.img bs=1M count=6 讀入了 6+0個塊 輸出了 6+0個塊 #mke2fs –m 0 ramdisk.img make2fs 1.32(09-Nov-2002)ramdisk.img is not a block special device Proceed anyway?(y,n)//輸入y,按回車鍵 Filesystem label = OS type:Linux Block size=1024(log=0)1536 inodes ,6144blocks ???????????????????? 180 days,whichever comes first.Use tune2fs –c or –I to overrite zero是一個特殊的設(shè)備,表示全部為零的字符塊。上面這條指令的意思是把系統(tǒng)的第一個ramdisk用全部為0的數(shù)據(jù)填充。Bs=1M 表示塊的大小為1M,count=6 表示有6塊。即我們監(jiān)理了一個大小為6M的ramdisk.接下來就應(yīng)該往ramdisk中填充文件了: #mount –o loop ramdisk.img ramdisk #cp –arf rootfs/* ramdisk/ #umount ramdisk 做完以上幾步,你就應(yīng)該明白ramdisk設(shè)備的含義,他和hda1,hdb1,一樣的塊設(shè)備用mount掛到文件系統(tǒng)下后就可以訪問,往里面放東西,但是所有的東西在內(nèi)存上,關(guān)機將丟失所有東西。 十 系統(tǒng)整合 前面已經(jīng)做好了內(nèi)核,安裝好了extlinux,現(xiàn)在只需要把ramdisk放到bzImage 所 在的目錄就可以了。 #mount /dev/hdd1 /mnt #cp ramdisk /mnt #umount /mnt 好了現(xiàn)在就可以把cf卡插到工控板上,試一把了。如果一切正常的話就可以進(jìn)入登陸界面了,呵呵。 十一 移植應(yīng)用程序 在本文開始的時候已經(jīng)說過將操作系統(tǒng)文件放在cd卡的注分區(qū)上hdd1上,把應(yīng)用程序放在邏輯分區(qū)hdd5上。因此我們將編譯好的應(yīng)用程序及其相關(guān)文件拷貝到hdd5上。由于應(yīng)用程序用到的共享庫不是固定的所以就沒有將他們放到ramdisk中,直接和應(yīng)用程序放在一起,只不過在系統(tǒng)啟動后要將這個庫目錄加到系統(tǒng)庫目錄路徑上即可。在這個項目中,我在hdd5上件了一個lib目錄,然后把應(yīng)用程序用到的庫全部放在這個目錄下面,然后在profile文件中增加一項兩行就行: export LD_LIBRARY_PATH=#LD_LIBRARY_PATH:/myapp/lib export QTIDR=/myapp 十二 參考文獻(xiàn) 《BabyLinux制作過程詳解》作者:GuCuiwen email:win2linux@163.com 嵌入式系統(tǒng)的主要應(yīng)用 嵌入式系統(tǒng)是一種包括硬件和軟件的完整的計算機系統(tǒng),它的定義是:“嵌入式系統(tǒng)是以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),并且軟硬件可剪裁,適用于應(yīng)用系統(tǒng)對功能、可靠性、成本、體積和功耗有嚴(yán)格要求的專用計算機系統(tǒng)?!鼻度胧较到y(tǒng)所用的計算機是嵌入到被控對象中的專用微處理器,但是功能比通用計算機專門化,具有通用計算機所不能具備的針對某個方面特別設(shè)計的、合適的運算速度、高可靠性和較低比較成本的專用計算機系統(tǒng)。 嵌入式系統(tǒng)的應(yīng)用前景是非常廣泛的,人們將會無時無處不接觸到嵌入式產(chǎn)品,從家里的洗衣機、電冰箱,到作為交通工具的自行車、小汽車,到辦公室里的遠(yuǎn)程會議系統(tǒng)等等。在家中、辦公室、公共場所,人們可能會使用數(shù)十片甚至更多這樣的嵌入式無線電芯片,將一些電子信息設(shè)備甚至電氣設(shè)備構(gòu)成無線網(wǎng)絡(luò);在車上、旅途中,人們利用這樣的嵌入式無線電芯片可以實現(xiàn)遠(yuǎn)程辦公、遠(yuǎn)程遙控,真正實現(xiàn)把網(wǎng)絡(luò)隨身攜帶。其應(yīng)用領(lǐng)域可以包括: 1.交通管理:在車輛導(dǎo)航、流量控制、信息監(jiān)測與汽車服務(wù)方面,嵌入式系統(tǒng)技術(shù)已經(jīng)獲得了廣泛的應(yīng)用,內(nèi)嵌GPS模塊,GSM模塊的移動定位終端已經(jīng)在各種運輸行業(yè)獲得了成功的使用。目前GPS設(shè)備已經(jīng)從尖端產(chǎn)品進(jìn)入了普通百姓的家庭,只需要幾千元,就可以隨時隨地找到你的位置。2.家庭智能管理系統(tǒng):水、電、煤氣表的遠(yuǎn)程自動抄表,安全防火、防盜系統(tǒng),其中嵌有的專用控制芯片將代替?zhèn)鹘y(tǒng)的人工檢查,并實現(xiàn)更高,更準(zhǔn)確和更安全的性能。 3.POS網(wǎng)絡(luò)及電子商務(wù):公共交通無接觸智能卡發(fā)行系統(tǒng),公共電話卡發(fā)行系統(tǒng),自動售貨機,各種智能ATM終端將全面走入人們的生活。 4.環(huán)境工程與自然:水文資料實時監(jiān)測,防洪體系及水土質(zhì)量監(jiān)測、堤壩安全,地震監(jiān)測網(wǎng),實時氣象信息網(wǎng),水源和空氣污染監(jiān)測。在很多環(huán)境惡劣,地況復(fù)雜的地區(qū),嵌入式系統(tǒng)將實現(xiàn)無人監(jiān)測。 5.機器人:嵌入式芯片的發(fā)展將使機器人在微型化,高智能方面優(yōu)勢更加明顯,同時會大幅度降低機器人的價格,使其在工業(yè)領(lǐng)域和服務(wù)領(lǐng)域獲得更廣泛的應(yīng)用。 6.工業(yè)控制:相對于其他的領(lǐng)域,機電產(chǎn)品可以說是嵌入式系統(tǒng)應(yīng)用最典型最廣泛的領(lǐng)域之一。從最初的單片機到現(xiàn)在的工控機、SOC在各種機電產(chǎn)品中均有著巨大的市場。工業(yè)設(shè)備是機電產(chǎn)品中最大的一類,在目前的工業(yè)控制設(shè)備中,工控機的使用非常廣泛,這些工控機一般采用的是工業(yè)級的處理器和各種設(shè)備,其中以X86的MPU最多。工控的要求往往較高,需要各種各樣的設(shè)備接口,除了進(jìn)行實時控制,還須將設(shè)備狀態(tài),傳感器的信息等在顯示屏上實時顯示。這些要求8位的單片機是無法滿足的,以前多數(shù)使用16位的處理器,隨著處理器快速的發(fā)展,目前32位、64位的處理器逐漸替代了16位處理器,進(jìn)一步提升了系統(tǒng)性能。采用PC104總線的系統(tǒng),體積小,穩(wěn)定可靠,受到了很多用戶的青睞。不過這些工控機采用的往往是DOS或者Windows系統(tǒng),雖然具有嵌入式的特點,卻不能稱作純粹的嵌入式系統(tǒng)。另外在工業(yè)控制器和設(shè)備控制器方面,則是各種嵌入式處理器的天下。這些控制器往往采用16位以上的處理器,各種MCU,Arm、Mips、68K系列的處理器在控制器中占據(jù)核心地位。這些處理器上提供了豐富的接口總線資源,可以通過它們實現(xiàn)數(shù)據(jù)采集,數(shù)據(jù)處理,通訊以及顯示(顯示一般是連接LED或者LCD)。最近飛利浦和ARM共同推出32位RISC嵌入式控制器,適用于工業(yè)控制,采用最先進(jìn)的0.18微米CMOS嵌入式閃存處理技術(shù),操作電壓可以低至1.2伏,它還能降低25%到30%的制造成本,在工業(yè)領(lǐng)域中對最終用戶而言是一套極具成本效益的解決方案。美國TERN工業(yè)控制器基于Am188/186ES、i386EX、NEC V25、Am586(Elan SC520),采用了SUPERTASK實時多任務(wù)內(nèi)核,可應(yīng)用于便攜設(shè)備、無線控制設(shè)備、數(shù)據(jù)采集設(shè)備、工業(yè)控制與工業(yè)自動化設(shè)備以及其它需要控制處理的設(shè)備。 7.家電行業(yè)是嵌入式應(yīng)用的另一大行業(yè)?,F(xiàn)在只有按鈕、開關(guān)的電器顯然已經(jīng)不能滿足人們的日常需求,具有用戶界面,能遠(yuǎn)程控制,智能管理的電器是未來的發(fā)展趨勢。據(jù)IDG發(fā)布的統(tǒng)計數(shù)據(jù)表明,未來信息家電將會成長五至十倍。中國的傳統(tǒng)家電廠商向信息家電過渡時,首先面臨的挑戰(zhàn)是核心操作系統(tǒng)軟件開發(fā)工作。硬件方面,進(jìn)行智能信息控制并不是很高的要求,目前絕大多數(shù)嵌入式處理器都可以滿足硬件要求,真正的難點是如何使軟件操作系統(tǒng)容量小、穩(wěn)定性高且易于開發(fā)。Linux核心可以起到很好的橋梁作用,作為一個跨平臺的操作系統(tǒng),它可以支持二三十種CPU,而目前已有眾多家電業(yè)的芯片都開始做Linux的平臺移植工作。1999年就登錄中國的微軟“維納斯”計劃給了國人一個數(shù)字家庭的概念,引導(dǎo)各大家電廠商紛紛投入到這場革命中來,雖然最終未能獲得成功,卻使信息家電深入人心。如今各大廠商仍然在努力推出適用于新一代家電應(yīng)用的芯片,英特爾公司已專為信息家電業(yè)研發(fā)了名為StrongARM的ARM CPU系列,這一系列CPU本身不象X86CPU需要整合不同的芯片組,它在一顆芯片中可以包括你所需要的各項功能,即硬件系統(tǒng)實現(xiàn)了SOC的概念。美商網(wǎng)虎公司已將全球最小的嵌入式操作系統(tǒng)——QUARK成功移植到StrongARM系列芯片上,這是第一次把Linux、圖形界面和一些程序進(jìn)行完整移植(QUARK的內(nèi)核只有143K),它將為信息家電提供功能強大的核心操作系統(tǒng)。相信在不久的將來,數(shù)字智能家庭必將來到我們身邊。 這些應(yīng)用中,可以著重于在控制方面的應(yīng)用。就遠(yuǎn)程家電控制而言,除了開發(fā)出支持TCP/IP的嵌入式系統(tǒng)之外,家電產(chǎn)品控制協(xié)議也需要制訂和統(tǒng)一,這需要家電生產(chǎn)廠家來做。同樣的道理,所有基于網(wǎng)絡(luò)的遠(yuǎn)程控制器件都需要與嵌入式系統(tǒng)之間實現(xiàn)接口,然后再由嵌入式系統(tǒng)來控制并通過網(wǎng)絡(luò)實現(xiàn)控制。所以,開發(fā)和探討嵌入式系統(tǒng)有著十分重要的意義。 目錄 嵌入式系統(tǒng)概述...................................................................................................................4 1.1 嵌入式系統(tǒng)簡介.......................................................................................................4 1.2 嵌入式系統(tǒng)的組成...................................................................................................5 1.3 本課題的背景和意義...............................................................................................5 2 硬件平臺及ARM體系結(jié)構(gòu)................................................................................................7 2.1 處理器選擇...............................................................................................................7 2.2 ARM體系結(jié)構(gòu)............................................................................................................7 3 軟件平臺...............................................................................................................................9 3.1嵌入式操作系統(tǒng)選擇................................................................................................9 3.2 交叉編譯環(huán)境的建立.............................................................................................10 3.2.1 上位機的軟硬件配置.........................................................................................10 3.2.2 硬件連接與調(diào)試.............................................................................................11 3.2.3 配置TFTP及NFS服務(wù)...................................................................................13 3.2.4 安裝交叉編譯工具.........................................................................................15 4 移植 Bootloader.................................................................................................................16 4.1 Bootloader 概述.................................................................................................16 U-boot 簡介...................................................................................................................17 4.2.1 U-boot 的獲取.................................................................................................17 4.2.2 U-boot 目錄結(jié)構(gòu).............................................................................................17 U-boot 的啟動過程及工作原理...................................................................................18 4.3.1 啟動模式介紹...................................................................................................18 4.3.2 啟動階段1分析...............................................................................................19 4.3.3 啟動階段2分析...............................................................................................20 U-boot的移植過程........................................................................................................20 4.4.1 準(zhǔn)備工作...........................................................................................................20 4.4.2 添加支持 NAND Flash 啟動功能...................................................................21 4.4.3 添加 NAND Flash 讀寫功能.......................................................................22 4.4.4 修改 U-boot環(huán)境變量保存方式....................................................................22 4.4.5 加入 NAND Flash 閃存型號支持...............................................................23 4.5 U-boot 的燒寫及測試.........................................................................................23 4.6 設(shè)置U-boot環(huán)境變量..................................................................................................24 5 Linux 內(nèi)核的移植.............................................................................................................25 Linux 內(nèi)核的結(jié)構(gòu).........................................................................................................25 Linux 啟動過程簡析.....................................................................................................26 Linux內(nèi)核的移植過程..................................................................................................26 5.3.1 選擇參考板.......................................................................................................26 5.3.2 修改 NAND Flash 分區(qū)信息...........................................................................26 5.3.3 關(guān)閉 ECC 校驗.................................................................................................27 5.4 CS8900a網(wǎng)卡的移植過程....................................................................................28 5.4.1 修改硬件地址映射...........................................................................................28 5.4.2 添加 CS8900A 內(nèi)核編譯項.............................................................................28 5.5 Linux 內(nèi)核的剪裁配置.......................................................................................29 5.5.1 使用配置菜單...........................................................................................................29 5.5.2 基本配置選項...................................................................................................30 5.5.3 驅(qū)動程序配置選項...................................................................................................31 5.5.4 保存配置文件...................................................................................................31 5.5.5 編譯 Linux 內(nèi)核.............................................................................................31 5.6 內(nèi)核的下載及啟動...............................................................................................32 5.6.1 將引導(dǎo)信息加入內(nèi)核映像...............................................................................32 5.6.2 內(nèi)核映像的下載及運行...................................................................................32 6 建立根文件系統(tǒng).................................................................................................................33 6.1 根文件系統(tǒng)概述...................................................................................................33 6.1.1 根文件系統(tǒng)簡介...........................................................................................33 6.1.2 NFS 文件系統(tǒng)與Cramfs文件系統(tǒng)...................................................................33 6.2 建立Linux根文件系統(tǒng)目錄...............................................................................33 7 心得體會.............................................................................................................................34 基于嵌入式系統(tǒng)的圖形界面應(yīng)用設(shè)計 嵌入式系統(tǒng)概述 1.1 嵌入式系統(tǒng)簡介 嵌入式系統(tǒng)是一種以應(yīng)用為目的,軟硬件可裁減,適應(yīng)應(yīng)用系統(tǒng)對功能、成本、體積、功耗嚴(yán)格要求的專用計算機系統(tǒng)。隨著計算機的發(fā)展和應(yīng)用的普及,嵌入式系統(tǒng)取得了迅猛的發(fā)展,嵌入式產(chǎn)品已經(jīng)滲透到社會經(jīng)濟、軍事、交通、通信等相關(guān)行業(yè),而且深入到家電、娛樂等各個領(lǐng)域,掀起了一場數(shù)字化革命。嵌入式圖形用戶界面系統(tǒng)是嵌入式系統(tǒng)的一個重要組成部分,它將極大的促進(jìn)嵌入式技術(shù)的發(fā)展和應(yīng)用。 嵌入式系統(tǒng)是當(dāng)前最熱門、最有發(fā)展前途的IT應(yīng)用技術(shù)之一。一方面,嵌入式系統(tǒng)廣泛的應(yīng)用于智能家電、手持終端、工業(yè)控制等專用設(shè)備上,通常這些設(shè)備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感,有時對實時響應(yīng)要求很高;另一方面,隨著計算機技術(shù)的發(fā)展,越來越多的嵌入式系統(tǒng)設(shè)備需要良好的人機交互界面,這需要一個高性能、高可靠、占用系統(tǒng)資源少的用戶圖形界面的支持。為了適應(yīng)嵌入式設(shè)備對人機交互界面的要求,本論文對基于嵌入式Linux圖形用戶界面的設(shè)計實現(xiàn)進(jìn)行了研究。 一方面,嵌入式硬件性能不斷提升,使得嵌入式設(shè)備上運行精美的圖形用戶界面成為可能;另一方面,嵌入式手持式消費電子產(chǎn)品的普及,例如PDA(個人數(shù)字助理)、智能手機、PMP(便攜式多媒體播放器),一個完善的嵌入式圖形用戶界面成為不可缺少的組成部分,嵌入式GUI(圖形用戶界面:Graphical User Interface)為嵌入式系統(tǒng)提供了一種應(yīng)用于特殊場合的人機交互接口。 縱觀國際相關(guān)產(chǎn)業(yè)在圖形用戶界面方面的發(fā)展現(xiàn)狀,許多國際知名公司早已認(rèn)識到GUI在嵌入式產(chǎn)品方面產(chǎn)生的強大增值功能,以及帶動的巨大市場價值,因此在公司內(nèi)部成立了專門從事GUI研究與設(shè)計的部門。 圖形用戶界面(GUI)是一種結(jié)合計算機科學(xué)、美學(xué)、心理學(xué)、行為學(xué),以及商業(yè)領(lǐng)域需求分析的人機系統(tǒng)工程。這種面向用戶的系統(tǒng)工程設(shè)計目的是優(yōu)化產(chǎn)品性能,使操作更人性化,減輕使用者的認(rèn)知負(fù)擔(dān),使其更適合用戶的操作需要,直接提升產(chǎn)品的市場競爭力。 圖形用戶界面的廣泛流行是當(dāng)今計算機技術(shù)的重大成就之一,它極大的方便了非專業(yè)用戶的使用,可以通過窗口、菜單方便的進(jìn)行操作。一個圖形用戶界面通常由三個基本層次組成,也就是顯示模型、窗口模型和用戶模型。用戶模型包含了顯示和交互的主要特征,因此用戶圖形界面有時也僅指用戶模型。 然而,對于嵌入式系統(tǒng)來說,由于其固有的體積、功耗以及價格的限制,使得傳統(tǒng)的圖形用戶界面并不能直接應(yīng)用于嵌入式系統(tǒng)[41,在嵌入式系統(tǒng)上實現(xiàn)GUI是一個具有挑戰(zhàn)性的課題??偟膩碚f,嵌入式GUI要求簡單、直觀、可靠、占用資源小且反應(yīng)速度快,以適應(yīng)系統(tǒng)硬件資源有限的條件嘲。另外,由于嵌入式系統(tǒng)硬件本身的特殊性,嵌入式GUI應(yīng)具備高度可移植性與可裁減性,以適應(yīng)不同的硬件條件和使用需求。具體的嵌入式GUI一般具備如下特點: 1.體積小 2.運行時耗用系統(tǒng)資源小 3.上層接口與硬件無關(guān),高度可移植 4.高可靠性 5.在某些應(yīng)用場合應(yīng)具備實時性 目前,嵌入式GUI的開發(fā)正處于起步階段,有許多技術(shù)難題尚待解決,因此對嵌入式圖形系統(tǒng)的研究成為嵌入式系統(tǒng)研究及發(fā)展中的一個重要內(nèi)容。 可以預(yù)見,隨著電子、計算機等行業(yè)的高速發(fā)展,嵌入式系統(tǒng)將以它專用化,效率高的特性深入實際應(yīng)用的各個領(lǐng)域,因而開發(fā)與改進(jìn)嵌入式圖形用戶界面有著長遠(yuǎn)的意義。 1.2 嵌入式系統(tǒng)的組成 嵌入式系統(tǒng)一般可以分為四個部分:嵌入式處理器、嵌入式外圍設(shè)備、嵌入式操作系統(tǒng)和嵌入式應(yīng)用軟件,如圖1-1所示。 圖1-1 嵌入式系統(tǒng)的組成 1.3 本課題的背景和意義 嵌入式導(dǎo)航計算機是飛機,車輛,導(dǎo)彈和船舶等運載體上的重要設(shè)備,主要任務(wù)是按照原定的計劃和任務(wù),以要求的精度,在一定時間內(nèi)將載體引 導(dǎo)至目的地。嵌入式導(dǎo)航計算機主要分為兩部分:硬件電路,嵌入式操作系 統(tǒng)。本課題的目的就是針對其硬件環(huán)境,搭建起一個高效、穩(wěn)定的嵌入式操 作系統(tǒng)的平臺。它具有通用操作系統(tǒng)的基本特點,能夠有效管理復(fù)雜的系統(tǒng) 資源;能夠快速的處理大量的信息;能夠提供庫函數(shù)、驅(qū)動程序、工具集以 及部分應(yīng)用程序。在這個系統(tǒng)平臺上可以運行導(dǎo)航程序,接受傳感器的數(shù)據(jù) 經(jīng)處理后得到任務(wù)所需要的信息,從而實施導(dǎo)航任務(wù)。 嵌入式Linux有著嵌入式導(dǎo)航計算機操作系統(tǒng)需要的很多特色:支持多 任務(wù)處理、中斷處理及任務(wù)間通信,性能穩(wěn)定,剪裁性好,開發(fā)與使用都很 方便。因此,本設(shè)計選用嵌入式Linux作為嵌入式導(dǎo)航計算機的操作系統(tǒng),這對于實現(xiàn)導(dǎo)航計算機的高效率、低功耗具有現(xiàn)實意義。 圖1-2 嵌入式導(dǎo)航計算機硬件平臺結(jié)構(gòu)圖 1.4 本課題的主要工作和研究內(nèi)容 本課題的最重目標(biāo)是為嵌入式導(dǎo)航計算機移植Linux操作系統(tǒng)。通過參 閱大量文獻(xiàn),學(xué)習(xí)嵌入式Linux系統(tǒng)和 ARM 體系微處理芯片S3C2410的相 關(guān)知識,研究啟動下載程序 Bootloader 和 Linux內(nèi)核的基本工作原理,并且 搭建交叉編譯平臺,重點是移植Bootloader和內(nèi)核,以及制作根文件系統(tǒng)。具體工作內(nèi)容包括: (1)學(xué)習(xí)Linux操作系統(tǒng)的知識。 (2)了解 ARM的體系結(jié)構(gòu)和S3C2410芯片硬件結(jié)構(gòu)。(3)完成交叉編譯環(huán)境的建立。(4)修改并移植U-boot 1.2.0。 (5)修改和裁剪Linux 2.6.24.4內(nèi)核,移植網(wǎng)卡驅(qū)動程序。(6)制作根文件系統(tǒng)。(7)編寫應(yīng)用程序進(jìn)行測試。 (8)將內(nèi)核和根文件系統(tǒng)部署到開發(fā)板。2 硬件平臺及ARM體系結(jié)構(gòu) 2.1 處理器選擇 本設(shè)計的處理器選擇高性能、低功耗的ARM9微處理器Samsung S3c2410。S3c2410 是著名半導(dǎo)體公司 Samsung 推出的一款 32 位 RISC 處理器。S3c2410的內(nèi)核基于 ARM920T,帶有MMU功能,主頻高達(dá)203MHz,可以支持 Linux、WinCE 等主流嵌入式操作系統(tǒng)。同時它還采用了一種叫做Advanced Microcontroller Bus Architecture(AMBA)的新型總線結(jié)構(gòu)。 此外S3c2410還集成了以下片上功能: (1)16KB指令 Cache和16KB的數(shù)據(jù)Cache;(2)LCD控制器(支持STN和TFT); (3)4通道DMA; (4)3通道UART; (5)2通道USB; (6)4路PWM和 1個內(nèi)部時鐘控制器; (7)117個通用IO,24路外部中斷; (8)16位看門狗定時器;(9)RTC(實時時鐘); (10)1通道IIC/IIS控制器; (11)NAND Flash控制器; (12)PLL數(shù)字鎖相環(huán)。 S3c2410 將系統(tǒng)的存儲空間分為 8 組(bank),每組大小是 128MB,共1GB。Bank0 到 Bank6 都采用固定 Bank 起始尋址,用于 ROM 或 SRAM。Bank7具有可編程的 Bank的起始地址和大小,用于ROM、RAM或SDRAM。S3c2410還支持從NAND Flash啟動,NAND Flash具有容量大、比NOR Flash價格低等特點。系統(tǒng)采用NAND Flash與SDRAM相結(jié)合的方式,可以獲得非常高的性價比。 2.2 ARM體系結(jié)構(gòu) ARM微處理器基本架構(gòu): ARM9微處理器采用RISC體系結(jié)構(gòu):優(yōu)先選取使用頻最高的簡單指令,避免復(fù)雜指令 RISC體系結(jié)構(gòu)應(yīng)具有如下特點: 1.采用固定長度的指令格式,指令歸整、簡單、基本尋址方式有2~3種。2.使用單周期指令,便于流水線操作執(zhí)行。3.大量使用寄存器,數(shù)據(jù)處理指令只對寄存器進(jìn)行操作,只有加載/ 存儲指令可以訪問存儲器,以提高指令的執(zhí)行效率。 4.除此以外,ARM體系結(jié)構(gòu)還采用了一些特別的技術(shù),在保證高性能的前提下盡量縮小芯片的面積,并降低功耗: 5.所有的指令都可根據(jù)前面的執(zhí)行結(jié)果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率。 6.可用加載/存儲指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率。7.可在一條數(shù)據(jù)處理指令中同時完成邏輯處理和移位處理。8.在循環(huán)處理中使用地址的自動增減來提高運行效率。ARM微處理器的寄存器結(jié)構(gòu): 1.ARM處理器共有37個寄存器,被分為若干個組(BANK),這些寄存器包括: 2.31個通用寄存器,包括程序計數(shù)器(PC指針),均為32位的寄存器。3.6個狀態(tài)寄存器,用以標(biāo)識CPU的工作狀態(tài)及程序的運行狀態(tài),均為32位,目前只使用了其中的一部分。 4.同時,ARM處理器又有7種不同的處理器模式,在每一種處理器模式下均有一組相應(yīng)的寄存器與 之對應(yīng)。即在任意一種處理器模式下,可訪問的寄存器包括15個通用寄存器(R0~R14)、一至二個狀態(tài)寄存器和程序計數(shù)器。在所有的寄存器中,有些是在 7種處理器模式下共用的同一個物理寄存器,而有些寄存器則是在不同的處理器模式下有不同的物理寄存器。 ARM微處理器的指令結(jié)構(gòu): ARM微處理器的在較新的體系結(jié)構(gòu)中支持兩種指令集:ARM指令集和Thumb指令集。其 中,ARM指令為32位的長度,Thumb指令為16位長度。Thumb指令集為ARM指令集的功能子集,但與等價的ARM代碼相比較,可節(jié)省30% ~40%以上的存儲空間,同時具備32位代碼的所有優(yōu)點。 ARM9系列微處理器具有以下特點: 1.5級整數(shù)流水線,指令執(zhí)行效率更高。2.提供1.1MIPS/MHz的哈佛結(jié)構(gòu)。 3.支持32位ARM指令集和16位Thumb指令集。4.支持32位的高速AMBA總線接口。 5.全性能的MMU,支持Windows CE、Linux、Palm OS等多種主流嵌入式操作系統(tǒng)。 6.MPU支持實時操作系統(tǒng)。 7.支持?jǐn)?shù)據(jù)Cache和指令Cache,具有更高的指令和數(shù)據(jù)處理能力。大小都為16K。8.ARM9系列微處理器主要應(yīng)用于無線設(shè)備、儀器儀表、安全系統(tǒng)、機頂盒、高端打印機、數(shù)字照相機和數(shù)字?jǐn)z像機等。 9.ARM9系列微處理器包含ARM920T、ARM922T和ARM940T三種類型,以適用于不同的應(yīng)用場合。軟件平臺 3.1嵌入式操作系統(tǒng)選擇 本設(shè)計的嵌入式操作系統(tǒng)選擇嵌入式Linux操作系統(tǒng)。 嵌入式操作系統(tǒng)是一種支持嵌入式系統(tǒng)應(yīng)用的操作系統(tǒng)軟件,它是嵌入式系統(tǒng)(包括硬、軟件系統(tǒng))極為重要的組成部分,通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器等Browser。 一般情況下,嵌入式操作系統(tǒng)可以分為兩類,一類是面向控制、通信等領(lǐng)域的實時操作系統(tǒng),如 WindRiver 公司的 VxWorks、ISI 的 pSOS、QNX系統(tǒng)軟件公司的QNX、ATI的 Nucleus等;另一類是面向消費電子產(chǎn)品的非實時操作系統(tǒng),這類產(chǎn)品包括個人數(shù)字助理(PDA)、移動電話、機頂盒等。嵌入式 Linux 操作系統(tǒng) Linux 的嵌入式改造主要圍繞體積和實時性展開,目前已經(jīng)有很多公司在進(jìn)行這方面的工作,其中包括 RT-Linux,uClinux,Embedix,Xlinux,MidoriLinux和紅旗嵌入式 Linux等等。 與目前市場上的眾多商業(yè)的實時系統(tǒng)相比,嵌入式Linux除具有內(nèi)核穩(wěn)定,功能強大,支持多種硬件平臺,兼容性好的優(yōu)勢外,還擁有以下的特點:(1)完全開放源代碼 嵌入式 Linux完全開放其源代碼,這使得修改,裁剪 Linux成為可能,開發(fā)者可以根據(jù)實際需要優(yōu)化操作系統(tǒng)代碼,降低整個系統(tǒng)的開銷與能耗。(2)成本低 GPL協(xié)議保證了源自Linux的嵌入式Linux也是開放源代碼的自由軟件。而大多數(shù)嵌入式Linux使用的開發(fā)工具也是遵守GPL協(xié)議的,同樣也可以免費獲得。 (3)豐富的實用軟件支持 Linux 提供了大量的實用程序和各種應(yīng)用軟件。這些軟件的正確性和有效性都經(jīng)過了實際檢驗,可以根據(jù)需要合理利用他們迅速構(gòu)建嵌入式應(yīng)用的軟件環(huán)境。這樣可以極大地減小嵌入式軟件開發(fā)的時間和費用,提高系統(tǒng)可靠性。而商用的實時操作系統(tǒng)也試圖提供各種常用軟件工具包,但其數(shù)量是無法和Linux操作系統(tǒng)匹敵的。由此可見,選擇嵌入式Linux操作系統(tǒng),就有了豐富的資源保障,在節(jié)省成本的同時,提高了開發(fā)效率。 3.2 交叉編譯環(huán)境的建立 采用交叉開發(fā)環(huán)境(Cross Development Environment)是嵌入式應(yīng)用軟 件開發(fā)時的一個顯著特點,通常在通用計算機上編寫程序,然后通過交叉編 譯生成目標(biāo)平臺上可運行的二進(jìn)制代碼格式,最后再下載到目標(biāo)平臺上的特 定位置運行,交叉開發(fā)環(huán)境是指編譯、鏈接和調(diào)試嵌入式應(yīng)用軟件的環(huán)境,它與運行嵌入式應(yīng)用軟件的環(huán)境有所不同,通常采用主機/目標(biāo)及模式。交叉開發(fā)模型如圖2-1所示: 圖3-1 交叉開發(fā)模型 3.2.1 上位機的軟硬件配置 硬件: 本課題用到一臺通用PC機和一臺筆記本電腦,其硬件配置如下: PC機: CPU:P IV 2.0G RAM:256MB 串口:RS-232 并口:25針母頭 筆記本電腦: CPU:PM 705 RAM:768MB 網(wǎng)卡:10/100MBps自適應(yīng)網(wǎng)卡 軟件: PC機的操作系統(tǒng)為Windows XP,裝有DNW串口調(diào)試工具以及SJF2410 三星Flash燒寫工具。前者用于串口調(diào)試,后者用于燒寫B(tài)ootloader。 筆記本電腦的操作系統(tǒng)為 Ubuntu7.10,裝有 GCC 等編譯工具以及arm-linux-gcc交叉編譯工具,并開啟TFTP和 NFS服務(wù)。用于 Linux內(nèi)核編 譯和軟件開發(fā),并作為TFTP服務(wù)器和NFS主機。其中,Ubuntu7.10 是 Linux 的桌面發(fā)行版之一,是當(dāng)今最為流行的桌面Linux 系統(tǒng)。使用 Linux 操作系統(tǒng)及其自帶的工具,是目前最權(quán)威的嵌入式Linux系統(tǒng)開發(fā)方式,但是許多操作都是基于命令行的,所以需要扎實的Linux基礎(chǔ)知識。 在 Ubuntu 中建立 arm用戶,專門用于 ARM 開發(fā)。在 home 目錄中建立下列幾個子目錄: Boot:用于存放bootloader相關(guān)程序。Kernel:用于存放 Linux內(nèi)核源碼。FS:用于存放根文件系統(tǒng)相關(guān)的程序。Program:用于存放用戶程序。 3.2.2 硬件連接與調(diào)試 硬件連接方式: 圖3-2 硬件連接圖 (1)開發(fā)板串口UART0通過交叉串口線與PC主機的 COM1口相連。 (2)開發(fā)板的JTAG口通過20PIN排線與SUPER JTAG調(diào)試頭相連,再通過25PIN并口線連接到主機的LPT1口。 (3)開發(fā)板的網(wǎng)卡接口通過以太網(wǎng)線連接到路由器的LAN1口。 (4)筆記本的網(wǎng)卡接口通過以太網(wǎng)線連接到路由器的LAN2口。 (5)路由器的 WAN口連接到INTERNET。串口調(diào)試: 在本課題嵌入式系統(tǒng)中的目標(biāo)開發(fā)板,采用串口調(diào)試的方法,即把串口當(dāng)作目標(biāo)開發(fā)板的顯示終端,無論是打印輸出,還是管理配置輸入,都使用串口,這就需要主機系統(tǒng)裝有串口調(diào)試工具。PC機中安裝有DNW串口調(diào)試工具,在使用DNW之前,應(yīng)當(dāng)對PC機的串口進(jìn)行設(shè)置。方法如下: (1)XP系統(tǒng)中,右鍵單擊“我的電腦”,選擇“屬性”。 (2)選擇“硬件”——“設(shè)備管理器。 (3)選擇“端口”——“串口(COM1)”,打開的對話框按圖2-3設(shè)置。 圖3-3 串口屬性設(shè)置 運行 DNW 工具,選擇菜單“Configuration”——“Options”,按圖 2-4所示進(jìn)行設(shè)置。 圖 3-4 DNW 設(shè)置 每次使用DNW之前,應(yīng)當(dāng)設(shè)置DNW連接到串口。點擊菜單中的 “Serial Port”——“Connect”,當(dāng)DNW的標(biāo)題欄出現(xiàn)[COM1,115200bps]的提示后,表明已經(jīng)連接好,此時才可以使用DNW工具。 3.2.3 配置TFTP及NFS服務(wù) TFTP 服務(wù)簡介: TFTP(Trivial File Transfer Protocol)協(xié)議即簡單文件傳輸協(xié)議,是TCP/IP協(xié)議族中的一個用來在客戶機與服務(wù)器之間進(jìn)行簡單文件傳輸?shù)膮f(xié)議,提供不復(fù)雜、開銷不大的文件傳輸服務(wù)。TFTP承載在UDP上,提供不可靠的數(shù)據(jù)流傳輸服務(wù),不提供存取授權(quán)與認(rèn)證機制,使用超時重傳方式來保證數(shù)據(jù)的到達(dá)。 TFTP 服務(wù)在 Linux 系統(tǒng)中有客戶端和服務(wù)器兩個軟件包。配置 TFTP服務(wù),必須都安裝好。 TFTP 服務(wù)安裝與配置: (1)Ubuntu中安裝tftp工具只需在終端中鍵入命令: $ sudo apt-get install tftp tftpd 其中,前者是客戶端,后者是服務(wù)器。 (2)Ubuntu是debian類的系統(tǒng),默認(rèn)是沒有安裝 inetd的,安裝命令如下: $ sudo apt-get install netkit-inetd(3)在home目錄里建立tftpboot 文件夾,命令如下: $ cd ~ $ sudo mkdir tftpboot $ sudo chmod 777 tftpboot 其中,參數(shù) 777 的意義是:根管理員、組和其他用戶對 tftpboot 文件夾 的權(quán)限均為“可讀、可寫、可以執(zhí)行”(4)修改/etc/inetd.conf,添加如下語句: tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /home/arm/tftpboot 目的是指定 tftp 服務(wù)的根目錄為/home/arm/tftpboot,修改/etc/inetd.conf 文件后應(yīng)當(dāng)重啟 inted進(jìn)程,命令如下: $ sudo /etc/init.d/inetd reload(5)重啟 inted 進(jìn)程后,配置即可生效,在 tftpboot 中建立文件 test 后,用 下列命令可以進(jìn)行測試: $ cd ~ $ tftp 127.0.0.1 Tftp> get test 若可下載test 文件,則證明TFTP服務(wù)配置正確。NFS 服務(wù)簡介: NFS 就是 Network File System 的縮寫,最早之前是由 Sun 這家公司所開發(fā)的。最大的功能就是可以透過網(wǎng)絡(luò),讓不同的機器、不同的操作系統(tǒng)、可以彼此分享個別的檔案(share files)。所以,可以簡單的將它看做是一個文件服務(wù)器(file server)。通過 NFS 服務(wù)器可以讓開發(fā)板將網(wǎng)絡(luò)遠(yuǎn)端的 NFS 主機分享的目錄,掛載到開發(fā)板當(dāng)中,在開發(fā)板看起來,那個遠(yuǎn)端主機的目錄就好像是自己的根目錄一樣,可以方便的進(jìn)行開發(fā)調(diào)試。NFS 服務(wù)安裝與配置: (1)Ubuntu上默認(rèn)是沒有安裝NFS服務(wù)器的,首先要安裝NFS服務(wù)程序: $ sudo apt-get install nfs-kernel-server 在安裝nfs-kernel-server時,apt 會自動安裝nfs-common和portmap。這樣,宿主機就相當(dāng)于NFS Server。(2)配置/etc/exports: NFS 掛載目錄及權(quán)限由/etc/exports 文件定義。本課題要將 home 目錄中 的/home/zp/share 目錄讓 192.168.0.*的 IP 共享, 則在該文件末尾添加下列語句: /home/arm/FS/myrootfs 192.168.0.2/10(rw,sync,no_root_squash)配置參數(shù)說明: rw:具有可擦寫的權(quán)限。 sync:文件同步寫入到內(nèi)存和硬盤當(dāng)中。 no_root_squash:若登陸共享目錄的使用者是 root 的話,則他的權(quán)限將被限 制為匿名使用者,通常他的UID和GID都會變?yōu)閚obody。(3)本地測試NFS: 輸入以下命令可以將NFS根目錄掛載到本地的/mnt 目錄中: $ sudo mount 192.168.0.2:/home/arm/FS/myroot /mnt 此時/mnt 中的內(nèi)容應(yīng)當(dāng)與NFS根目錄中的內(nèi)容一致。 3.2.4 安裝交叉編譯工具 交叉編譯簡介: 所謂交叉編譯,簡單的說,就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼,比如在 PC平臺上(X86 CPU)編譯出能運行在以 ARM 為內(nèi)核的CPU平臺上的程序,一般選擇GNU開發(fā)工具 gcc。GNU的開發(fā)工具都是免費的,遵循 GPL協(xié)議,任何人可以從網(wǎng)上獲取。GNU 提供的編譯工具包括匯編器as、c編譯器gcc、c++編譯器g++、連接器ld和二進(jìn)制轉(zhuǎn)換工具objcopy。出于兼容性和穩(wěn)定性考慮,本課題選擇目前比較穩(wěn)定的版本 Cross-3.3.2 和Cross-3.4.1。 交叉編譯器的安裝及配置: (1)獲取arm-linux交叉編譯工具: 登陸arm-linux項目組的FTP服務(wù)器: ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下載cross-3.3.2.tar.bz2和cross-3.4.1.tar.bz2。 (2)通過下列命令可以安裝arm-linux交叉編譯工具: $ cp cross-3.4.1.tar.bz2 / $ cd / $ tar jxvf cross-3.4.1.tar.bz2 這樣,交叉編譯工具就被安裝到了/usr/local/arm/3.4.1中。用同樣的方法 可以安裝cross-3.3.2版的交叉編譯工具。 (3)設(shè)置環(huán)境變量: 修改home目錄下的profile文件,加入如下代碼,指明交叉編譯工具的 目錄。 # User specific environment and startup programs export TARGET=arm-linux export PRJROOT=/home/arm export PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/3.4.1/bin:/sbin:/usr/ sbin:/usr/local/sbin 測試交叉編譯器: 可以通過一個簡單的程序測試安裝好的交叉編譯工具,看其能否正常工作。編寫一個 hello.c源文件,通過以下命令進(jìn)行編譯,編譯后生成名為Hello的可執(zhí)行文件,通過 file 命令可以查看文件的類型。當(dāng)顯示以下信息是表明交叉編譯工具正常安裝了,通過編譯生成了ARM體系可執(zhí)行的文件。注意,通過該交叉編譯器編譯的可執(zhí)行文件只能在 ARM 體系下執(zhí)行,不能在基于X86的普通PC上執(zhí)行。 $ arm-linux-gcc –o Hello hello.c $ file Hello Hello:ELF 32-bit LSB executable ,ARM, version 1(ARM), for GNU/Linux 2.4.3, dynamically linked(uses shared libs), not stripped 4 移植 Bootloader 4.1 Bootloader 概述 簡單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。 通常,Bootloader是嚴(yán)重地依賴于硬件而實現(xiàn)的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的Bootloader幾乎是不可能的,不同處理器構(gòu)架都有不同的 Bootloader。Bootloader 不但依賴于 CPU 的體系結(jié)構(gòu),而且依賴于嵌入式板級設(shè)備的配置。對于不同的嵌入式板而言,即使它們使用同一種處理器,要想讓運行在一塊板子上的Bootloader運行在另一塊板子上,一般也要修改其源代碼。 目前常用的Bootloader程序有以下幾種: U-boot、VIVI、Blob和RedBoot。其中,U-boot 功能豐富,且對于ARM體系支持良好,事實上,它已成為ARM平臺上標(biāo)準(zhǔn)Bootloader。因此,本課題選用U-boot 作為移植對象。U-boot 簡介 U-boot 是德國 DENX 小組的開發(fā)用于多種嵌入式 CPU 的 Bootloader 程序,U-boot 不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),還支NetBSD,VxWorks,QNX,ARTOS,LynxOS 等嵌入式操作系統(tǒng)。U-boot 除了支持 ARM 系列的處理器外,還能支持 MIPS、x86、PowerPC、NIOS、XScale 等諸多常用系列的處理器。 4.2.1 U-boot 的獲取 U-boot 的源碼可以從sourceforge網(wǎng)站下載,網(wǎng)址為: http://sourceforge.net/project/u-boot。 下載的文件為u-boot-1.2.0.tar.bz2,用以下命令將其解壓。 $ tar jcvf u-boot-1.2.0.tar.bz2 /home/arm/boot/ 4.2.2 U-boot 目錄結(jié)構(gòu) 解壓后,在 U-boot 頂層目錄下有 18 個子目錄,分別存放和管理不同的源碼。這些目錄中所要存放的文件有其規(guī)則,可以分為3類,如表3-1所示: 第一類目錄與處理器體系結(jié)構(gòu)或開發(fā)板硬件直接相關(guān)。第二類目錄是一些通用的函數(shù)或者驅(qū)動程序。第三類目錄是U-boot 的應(yīng)用程序、工具或者文檔。 表4-1 U-boot頂層目錄下部分目錄的存放規(guī)則 U-boot 的啟動過程及工作原理 4.3.1 啟動模式介紹 Bootloader 都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載工作模式的區(qū)別。 啟動加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式。也即 Bootloader 從目標(biāo)機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載 到 RAM中運行,整個過程并沒有用戶的介入。這種模式是 Boot Loader 的 正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時侯,Bootloader 顯然必須工作在這種模式下。 下載(Downloading)模式:在這種模式下,目標(biāo)機上的 Boot Loader 將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被 Bootloader保存到目標(biāo)機的 RAM 中,然后再被 Bootloader 寫到目標(biāo)機上的 FLASH 類固態(tài)存儲設(shè)備中。Bootloader 的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用; 此外,以后的系統(tǒng)更新也會使Bootloader的這種工作模式。工作于這種模式下的 Bootloader 通常都會向它的終端用戶提供一個簡單的命令行接口。 U-boot 這樣功能強大的Bootloader 同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進(jìn)行切換。 大多數(shù)Bootloader都分為階段1(stage1)和階段2(stage2)兩大部分,U-boot也不例外。依賴于CPU體系結(jié)構(gòu)的代碼(如CPU初始化代碼等)通常都放在階段1中且通常用匯編語言實現(xiàn),而階段 2 則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。 圖 4-1 U-boot啟動代碼流程圖 4.3.2 啟動階段1分析 如果 S3C2410 被配置成從 NAND 閃存啟動,上電后,S3C2410 的 NAND 閃存控制器會自動把 NAND 閃存中的前 4K 數(shù)據(jù)搬移到內(nèi)部 RAM中,并把 0x00000000 設(shè)置為內(nèi)部 RAM 的起始地址,CPU 從內(nèi)部 RAM 的0x00000000 位置開始啟動。因此要把最核心的啟動程序放在 NAND 閃存的前4K中。由于NAND閃存控制器從NAND閃存中搬移到內(nèi)部RAM的代碼是有限的,所以,在啟動代碼的前 4K里,必須完成 S3C2410 的核心配置,并把啟動代碼的剩余部分搬到 RAM 中運行。這前4K完成的主要工作就是 U-boot 啟動的第一個階段(stage1)。 U-boot 的stage1代碼通常放在start.s文件中,它用匯編語言寫成。此階段要完成的主要工作如下: (1)設(shè)置異常向量,當(dāng)發(fā)生異常時,執(zhí)行 cpu/arm920t/interrupts.c 中定義的中斷處理函數(shù)。 (2)設(shè)置CPU的模式為SVC(管理模式,操作系統(tǒng)使用的保護(hù)模式)(3)關(guān)閉看門狗。(4)禁掉所有中斷。 (5)設(shè)置 cpu 頻率,默認(rèn)頻率比為 FCLK:HCLK:PCLK = 1:2:4,默認(rèn)FCLK的值為120 Mhz,該值為S3C2410手冊的推薦值。(6)調(diào)用cpu初始化函數(shù)cpu_init_crit。其中一個功能是設(shè)置CP15寄存 器,失效指令(I)Cache和數(shù)據(jù)(D)Cache后,禁止MMU與 Cache。(7)重定向,將 NAND Flash代碼復(fù)制到 RAM,其中有以下兩個個步 驟: (a)通過copy_myself子程序,把數(shù)據(jù)從Nand Flash中拷貝到RAM。 (b)配置??臻g,配置代碼段的開始地址、動態(tài)內(nèi)存區(qū)長度、全局?jǐn)?shù)據(jù) 大小以及分配IRQ 和FRQ的??臻g。 (8)BSS(Block Started by Symbol)段清零。(9)進(jìn)入C代碼: ldr pc, _start_armboot _start_armboot:.word start_armboot 其中 start_armboot 是 U-boot 運行的第一個 C 程序,在 lib_arm/board.c 文件中定義。隨后進(jìn)入第二階段。 4.3.3 啟動階段2分析 lib_arm/board.c 中的 start armboot 是 C 語言開始的函數(shù),也是整個啟動代碼中C語言的主函數(shù),同時還是整個 U-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作:(1)定義初始化函數(shù)表。 (2)NAND Flash初始化,利用 nand_init()函數(shù)實現(xiàn)。(3)環(huán)境變量初始化,利用env_relocate()函數(shù)實現(xiàn)。(4)外圍設(shè)備初始化,利用 devices_init()函數(shù)實現(xiàn)。(5)使能中斷,利用enable_interrupts()函數(shù)實現(xiàn)。(6)初始化網(wǎng)絡(luò)設(shè)備。 (7)進(jìn)入U-boot 的命令循環(huán),接受用戶輸入的命令,執(zhí)行相應(yīng)的工作。 U-boot的移植過程 移植U-boot 的主要工作就是添加開發(fā)板硬件相關(guān)的文件、配置選項,然后進(jìn)行編譯。 4.4.1 準(zhǔn)備工作 (1)建立開發(fā)板編譯項,在頂層Makefile中加入如下兩行: LJD2410_config : unconfig @$(MKCONFIG)$(@:_config=)arm arm920t LJD2410 NULL s3c24x0 各項意義如下: arm:CPU 的架構(gòu)(ARCH)arm920t:CPU 的類型(CPU),其對應(yīng)于 cpu/arm920t 子目錄。LJD2410:開發(fā)板的型號(BOARD),對應(yīng)于 board/crane2410 目錄。NULL:開發(fā)者/或經(jīng)銷商(vender)。s3c24x0:片上系統(tǒng)(SOC)。 (2)在 board 子目錄中建立 LJD2410開發(fā)板目錄: $ cp rf board/smdk2410 board/LJD2410 $ cd board/LJD2410 $ mv smdk2410.c LJD2410.c(3)在 include/configs/中建立配置頭文件: $ cp include/configs/smdk2410.h include/configs/LJD2410.h(4)測試編譯能否成功: $ make distclean $ make LJD2410_config $ make CROSS_COMPILE=arm-linux-如果編譯成功,證明已經(jīng)建立好了LJD2410的編譯項,但是還要進(jìn)行進(jìn)一步的修改,因為現(xiàn)在的代碼是完全拷貝 smdk2410 開發(fā)板的,還不能工作在LJD2410板上。接下來要按照 LJD2410板的硬件配置來進(jìn)一步移植。(5)調(diào)整SDRAM的刷新率,修改 lowlevel_init.S: #define REFCNT 1268 在smdk2410.c中調(diào)整 HCLK為 100MHz: /*Fout = 200MHz */ #define M_MDIV 0x5C #define M_PDIV 0x4 #define M_SDIV 0x0 4.4.2 添加支持 NAND Flash 啟動功能 由于U-boot 不支持從NAND Flash啟動,所以將程序復(fù)制到RAM里面去需要新加代碼實現(xiàn),一般通過 copy_myself 函數(shù)實現(xiàn)。這可以參考 VIVI的copy_muself代碼將其添加到Start.S中,詳見附錄 A-1。 在Start.S中調(diào)用了nand_reak_ll函數(shù),該函數(shù)用于NAND Flash讀操作,在U-boot 中沒有定義,需要新加代碼實現(xiàn),該函數(shù)的實現(xiàn)可以參考VIVI源代碼。將VIVI/s3c2410/nand_read.c 復(fù)制到LJD2410目錄內(nèi)即可。 由于使用了新的 Flash 讀函數(shù),在編譯時需要重新鏈接,修改 LJD2410目錄中的Makefile文件,將原先的OBJS := myboard.o flash.o 改為:OBJS := myboard.o nand_read.o。 S3c2410處理器帶有NAND Flash控制器,但是U-boot 沒有定義其寄存器地址,修改 include/s3c2410.h文件,加入如下代碼: #define oNFCONF 0x00 #define oNFCMD 0x04 #define oNFADDR 0x08 #define oNFDATA 0x0C #define oNFSTAT 0x10 #define oNFECC 0x14 4.4.3 添加 NAND Flash 讀寫功能 U-boot 運行至第二階段進(jìn)入 start_armboot()函數(shù)。其中 nand_init()函數(shù)是對 NAND Flash 的最初初始化函數(shù)。其調(diào)用與CFG_NAND_LEGACY 宏有關(guān),如果沒定義 CFG_NAND_LEGACY 這個宏,就按照 start_armboot()調(diào)用 drivers/nand/nand.c 中的 nand_init 函數(shù)(該函數(shù)在 1.2.0 已經(jīng)被實現(xiàn))默認(rèn)規(guī)定,但還有個 board_nand_init()函數(shù)沒實現(xiàn),需自己添加。如果定義CFG_NAND_LEGACY,就不使用默認(rèn)的nand_init,而調(diào)用自己寫的nand_init函數(shù)了,本課題選擇第二種方式。 在/drivers/nand_legacy/nand_legacy.c 中添加 NAND Flash 初始化函數(shù)nand_init,詳見附錄 A-2。 可以看到 nand_init()調(diào)用 NF_Init()函數(shù),使能 NAND Flash 控制器和 NAND Flash;調(diào)用 NF_Reset()函數(shù)置位,NF_WaitRB()查詢 NAND Flash 的狀態(tài),最后再調(diào)用 nand_probe((ulong)nand)函數(shù)探測 NAND Flash。 在 include/configs/smdk2410.h 文件的后半部原先有 Flash 的參數(shù),刪除它,并加入NAND Flash的參數(shù),并且開啟一些命令宏。 4.4.4 修改 U-boot環(huán)境變量保存方式 由于本課題使用NAND Flash作為外存儲器,所以U-boot 的參數(shù)存儲函數(shù)應(yīng)當(dāng)進(jìn)行適當(dāng)?shù)男薷摹?/p> 在/common/env_common.c里添加default_env函數(shù),此函數(shù)的作用是對環(huán)境變量保存方式的簡單初始化。這個文件中還定義了U-boot 保存環(huán)境變量的底層函數(shù)。其中/* Environment not changable */行下面的部分應(yīng)當(dāng)用 default_env 函數(shù)代替。這樣,就可以在 U-boot 命令行中實現(xiàn)對環(huán)境變量的設(shè)置與保存。文件 /common/env_nand.c 中 包 含 了 Flash 擦 寫 函 數(shù),結(jié)合 CFG_NAND_LEGACY這個宏,添加代碼實現(xiàn) NAND Flash的擦寫功能。初 始化環(huán)境仍用 default_env函數(shù)替換。 4.4.5 加入 NAND Flash 閃存型號支持 在/include/linux/mtd/ nand_ids.h 中 對 nand_flash_dev nand_flash_ids結(jié)構(gòu)體的賦值進(jìn)行修改,加入下列代碼: {“Samsung K9F1208U0B”, NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}, 這樣,U-boot 就可以正確識別此款NAND Flash芯片。 4.5 U-boot 的燒寫及測試 若開發(fā)板中沒有任何程序,則不能啟動,需要先將 U-boot 燒寫到 Flash中。常用的燒寫方法有如下幾種:(1)將Flash取下,用編程器燒寫。(2)通過串口線燒寫。(3)通過JTAG調(diào)試接口燒寫。 本課題采用第三種方法。通過JTAG接口燒寫的優(yōu)點是操作簡單,但是燒寫速度較慢,總體來說是一種非常經(jīng)濟實用的方法。具體操作如下:(1)連接好開發(fā)板和PC主機,主機安裝并口設(shè)備驅(qū)動程序。 (2)將 u-boot.bin 拷貝至 sjf2410 目錄下,用以下命令運行 sjf2410: sjf2410 /f:u-boot.bin(3)sjf2410程序啟動后,會有三個選項,依次為: (a)選擇Flash芯片型號,(b)選擇程序類型,(c)選擇燒寫起始地址。 本課題全部選擇“0”即可。 (4)燒寫完畢后選擇“2”退出sjf2410。 燒寫完成后,斷開JTAG線,PC機運行DNW串口調(diào)試軟件。重啟開發(fā)板后,DNW中會輸出以下信息,表明U-boot可以正常啟動: 其中,“LJD2410 >”即系統(tǒng)提示符,在此可以輸入 U-boot 的命令并執(zhí)行。U-boot 提供了幾十個常用的命令,通過這些命令,可以對開發(fā)板進(jìn)行調(diào)試,可以引導(dǎo)Linux內(nèi)核,還可以擦寫 Flash 完成系統(tǒng)部署等功能。 輸入“help”命令,可以看到U-boot 當(dāng)前的所有命令列表,如表3-2所示,每一條命令后面是簡單的說明。 表4-2 U-boot中幾個常用命令及其說明 4.6 設(shè)置U-boot環(huán)境變量 U-boot的環(huán)境變量存儲在NAND Flash中U-boot程序映像后面的128Kb字節(jié)中,這部分被稱為“變量區(qū)”。 本課題中,設(shè)置U-boot 環(huán)境變量共有兩種方法:(1)在板級頭文件LJD2410.h中定義有相關(guān)的環(huán)境變量宏。 這類的宏名稱中以“CONFIG_”開頭,區(qū)別于以“CFG_”開頭的內(nèi)部變量宏。以開發(fā)板的IP地址為例,LJD2410.h中有如下代碼: #define CONFIG_IPADDR 192.168.0.10 這種方法定義簡便,但是每次更改環(huán)境變量必須重新編譯、燒寫U-boot程序,操作復(fù)雜,不方便調(diào)試。(2)使用命令設(shè)置環(huán)境變量。 這種方法得益于先前所做的移植工作,優(yōu)點是操作簡便,可以在線設(shè)置,重啟開發(fā)板即可生效。還是以設(shè)置開發(fā)板 IP 地址為例,U-boot 提示符下輸入以下命令: LJD2410 > setenv ipaddr 192.168.0.10 LJD2410 > saveenv 系統(tǒng)顯示: Saving Environment to NAND...Erasing Nand...Writing to Nand...done 表明新設(shè)置的環(huán)境變量已保存至Flash中的變量區(qū)。5 Linux 內(nèi)核的移植 Linux 內(nèi)核的結(jié)構(gòu) 在對Linux內(nèi)核移植之前,首先要明確內(nèi)核源碼的基本組織情況,只有了解了各目錄級代碼的功能才能準(zhǔn)確找到需要修改和改進(jìn)的地方。 Linux 內(nèi)核主要由 5 個子系統(tǒng)組成:進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系 統(tǒng)、網(wǎng)絡(luò)接口、進(jìn)程間通信。 Linux內(nèi)核源碼中幾個主要的目錄說明如下: (1)/arch包含了所有硬件結(jié)構(gòu)特定的內(nèi)核代碼。 Linux 系統(tǒng)能支持如此多平臺的部分原因是因為內(nèi)核把原程序代碼清晰的劃分為體系結(jié)構(gòu)無關(guān)部分和體系結(jié)構(gòu)相關(guān)部分。對于任何平臺,都必須包含以下幾個目錄: (a)boot:包括啟動內(nèi)核所使用的部分或全部平臺特有代碼。 (b)kernel:存放支持體系結(jié)構(gòu)特有的(如信號處理和SMP)特征的實現(xiàn)。 (c) lib:存放高速體系結(jié)構(gòu)特有的(如strlen和 memcpy)通用函數(shù)的實現(xiàn)。 (d)mm:存放體系結(jié)構(gòu)特有的內(nèi)存管理程序的實現(xiàn)。 (e)math-emu:模擬 FPU 的代碼。對于 ARM 處理器來說,此目錄用mach-xxx代替。 (2)/drivers包含了內(nèi)核中所有的設(shè)備驅(qū)動程序。 (3)/fs包含了所有的文件系統(tǒng)的代碼。 (4)/include包含了建立內(nèi)核代碼時所需的大部分庫文件。 該目錄也包含了不同平臺需要的庫文件。比如,asm-arm是 arm平臺需要的庫文件。 (5)/init 包含了內(nèi)核的初始化代碼,內(nèi)核從此處工作。這是研究核心如何工作的好起點。 (6)/ipc包含了進(jìn)程間通信代碼。 (7)/kernel包含了主內(nèi)核代碼。 (8)/mm包含了所有內(nèi)存管理代碼。 (9)/net 包含了和網(wǎng)絡(luò)相關(guān)的代碼。 (10)/documents包含了內(nèi)核源碼各個部分的說明文件。 通常,在每個目錄下,都有一個 Kconfig 文件和一個Makefile文件,這兩個文件都是編譯時使用的輔助文件,仔細(xì)閱讀這兩個文件對弄清各個文件之間的聯(lián)系和依托關(guān)系很有幫助;而且在有的目錄下還有 Readme 文件,它是對該目錄下的文件的一些說明,同樣有利于我們對內(nèi)核源碼的理解。 顯然,移植工作的重點就是移植arch目錄下的文件。Linux 啟動過程簡析 Linux 內(nèi)核啟動就是引導(dǎo)內(nèi)核映像啟動的過程。典型的內(nèi)核映像是zImage,包含自引導(dǎo)程序和壓縮的vmlinux兩部分。 啟動過程從內(nèi)核映像入口開始執(zhí)行,解壓 vmlinux并轉(zhuǎn)到虛擬地址空間;再調(diào)用統(tǒng)一的內(nèi)核啟動函數(shù) start_kernel(),完成一系列基本初始化;隨后啟動一個叫做 init 的內(nèi)核線程,完成掛載文件系統(tǒng)、初始化設(shè)備驅(qū)動和啟動用戶空間 init 進(jìn)程等工作。 Linux內(nèi)核的移植過程 5.3.1 選擇參考板 內(nèi)核的移植工作主要是修改跟硬件平臺相關(guān)的代碼,一般不涉及 Linux內(nèi)核通用程序。移植的難度也取決于兩種硬件平臺的差異。Linux 對于特定硬件平臺的軟件叫做BSP(Board Support Package).Linux 內(nèi)核已經(jīng)支持了各種體系的多種開發(fā)板,我們很容易從中找到與本課題類似的目標(biāo)板,參考該目標(biāo)板并做一定的修改,即可完成移植工作。選擇參考板的原則如下: (1)參考板與開發(fā)板具有相同的處理器,至少類似的處理器; (2)參考板與開發(fā)板具有相同的外圍接口電路,至少基本接口相同; (3)Linux內(nèi)核已經(jīng)支持參考板,至少有非官方的補丁或者BSP; (4)參考板Linux設(shè)備驅(qū)動工作正常,至少已經(jīng)驅(qū)動基本接口。 根據(jù)以上原則,本課題選擇SMDK2410作為參考板。修改頂層Makefile文件,指定體系結(jié)構(gòu)和編譯器地址: ARCH := arm CROSS_COMPILE := /usr/local/arm/3.4.1/bin/arm-linux- 5.3.2 修改 NAND Flash 分區(qū)信息 本課題中,NAND Flash應(yīng)按照功能分為 4個分區(qū),如圖4-1所示: 圖5-1 NAND Flash分區(qū)示意圖 Linux 內(nèi)核對于 Flash分區(qū)由 arch/arm/plat-s3c24xx/common-smdk.c 文件中的 mtd_partition smdk_default_nand_part 結(jié)構(gòu)體定義,默認(rèn)已經(jīng)分為了8個區(qū)。按照圖4-1的分區(qū)信息,修改該結(jié)構(gòu)體為: static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = “U-boot”,.size = 0x00100000,.offset = 0x0,},[1] = { .name = “Kernel”,.offset = 0x00100000,.size = 0x00300000,},[2] = { .name = “RootFS”,.offset = 0x00400000,.size = 0x02800000,},[3] = { .name = “User”,.offset = 0x02d00000,.size = 0x00f00000,},同時還應(yīng)根據(jù)CPU手冊修改NAND Flash的讀寫時序: static struct s3c2410_platform_nand smdk_nand_info = { .tacls = 0,.twrph0 = 30,.twrph1 = 0,};5.3.3 關(guān)閉 ECC 校驗 本設(shè)計中,內(nèi)核都是通過 U-boot 寫到 Nand Flash 的,U-boot 通過的軟件ECC算法產(chǎn)生ECC校驗碼,這與內(nèi)核校驗的ECC碼不一樣,而內(nèi)核中的 ECC 碼是由 S3C2410 中 Nand Flash 控制器產(chǎn)生的。所以,我們在這里選擇禁止內(nèi)核 ECC 校驗.,具體操作如下: 文件drivers/mtd/nand/s3c2410.c中,找到s3c2410_nand_init_chip()函數(shù),將最后一行的 chip-->eccmode = NAND_ECC_SOFT 改為: chip-->eccmode = NAND_ECC_NONE 5.4 CS8900a網(wǎng)卡的移植過程 本課題中使用的LJD2410開發(fā)板帶有 CS8900A網(wǎng)卡芯片,并提供RJ-45網(wǎng)絡(luò)接口。Linux內(nèi)核中并沒有為 ARM體系配置CS8900A的網(wǎng)卡驅(qū)動,需要自己添加。CS8900A的驅(qū)動文件有兩個:CS8900A.h 和CS8900A.c,這兩個文件可以由網(wǎng)絡(luò)獲得,將其拷貝至 drivers/net/arm 文件夾下,但這樣并不能使驅(qū)動程序正常工作,還應(yīng)對內(nèi)核源文件做些修改。 5.4.1 修改硬件地址映射 (1)在/arch/arm/mach-s2410文件夾里建立文件smdk2410.h,添加如下代碼: #define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000) #define vSMDK2410_ETH_IO 0xE0000000 #define SMDK2410_EHT_IRQ IRQ_EINT9 這三個宏分別定義了網(wǎng)卡的物理地址、虛擬地址和占用的中斷號。 (2)修改/arch/arm/mach-s2410/mach-smdk2410.c,添加如下代碼: #include (3)在 map_desc smdk2410_iodesc[]結(jié)構(gòu)題中添加CS8900A對于的 io 空間映射: static struct map_desc smdk2410_iodesc[] __initdata = { { vSMDK2410_ETH_IO , pSMDK2410_ETH_IO, SZ_, MT_DEVICE }, }; 5.4.2 添加 CS8900A 內(nèi)核編譯項 Kconfig 文件是 Linux2.6 內(nèi)核引入的配置文件,是內(nèi)核配置選項的源文件。只有在這個文件里加入相應(yīng)代碼,才能在編譯選項中出現(xiàn)菜單項。 在/drivers/net/arm/Kconfig中增加CS8900A的編譯項代碼: config ARM_CS8900 tristate “CS8900 support” depends on NET_ETHERNET && ARM && ARCH_SMDK2410 help … 最后應(yīng)在/drivers/net/arm/Makefile 中添加: obj-$(CONFIG_ARM_CS8900) += cs8900.o 以上工作完成后,新移植的CS8900A驅(qū)動就可以編譯進(jìn)內(nèi)核里了。 5.5 Linux 內(nèi)核的剪裁配置 配置內(nèi)核選項是整個移植過程中很重要的一步,本設(shè)計使用SMDK2410作為參考開發(fā)板,所以可以參考內(nèi)核中 SMDK2410 開發(fā)板的配置文件,通過以下命令將其復(fù)制到內(nèi)核根文件夾下: $ cp arch/arm/config/smdk2410_defconfig.config 在此基礎(chǔ)上,根據(jù)本課題的實際需求進(jìn)行配置增減。 5.5.1 使用配置菜單 配置內(nèi)核可以選擇不同的配置界面,圖形界面或者光標(biāo)界面。由于光標(biāo)菜單運行時不依賴于X11圖形軟件環(huán)境,可以運行在字符終端上,所以光標(biāo)菜單界面比較通用。圖4-2所示就是執(zhí)行 make menuconfig出現(xiàn)的配置菜單。 在各級子菜單中,選擇相應(yīng)的配置時,有 3種選擇,它們代表的含義分別如下: Y—將該功能編譯進(jìn)內(nèi)核。 N—不將該功能編譯進(jìn)內(nèi)核。 M—將該功能編譯成可以在需要時動態(tài)插入到內(nèi)核中的模塊。 圖5-2 內(nèi)核配置主菜單 內(nèi)核配置原則是:將與內(nèi)核其他部分關(guān)系較遠(yuǎn)且不經(jīng)常且不經(jīng)常使用的部分功能代碼編譯成可加載模塊,有利于減少內(nèi)核長度,減小內(nèi)核消耗的內(nèi)存,簡化該功能相應(yīng)的環(huán)境改變時對內(nèi)核的影響;不需要的功能就不選;與內(nèi)核關(guān)系緊密而且經(jīng)常使用的部分功能代碼直接編譯到內(nèi)核中。 5.5.2 基本配置選項 Linux內(nèi)核的各個版本配置餐單各不相同,下面以本課題使用的2.6.24.4版為例,結(jié)合本課題的實際需求,簡介下內(nèi)核的基本配置選項。 (1)General setup:包含通用的一些配置選項,保持默認(rèn)即可。 (2)Enable loadable module supple:包含支持動態(tài)模塊的配置選項,保持默認(rèn)。 (3)System Type:包含系統(tǒng)平臺列表及其相關(guān)的配置,去掉SMDK2410以外所有開發(fā)板的支持、開啟s3c2410 DMA支持。 (4)Bus support:包含各種總線配置選項,全部去掉。 (5)Kernel Features:包含內(nèi)核特性相關(guān)選項,保持默認(rèn)。 (6)Boot options:包含內(nèi)核啟動相關(guān)選項,其中內(nèi)核啟動參數(shù)設(shè)置為: “noinitrd console=ttySAC0,115200 root=/dev/nfs init=linuxrc nfsroot=192.168.0.2:/home/arm/FS/myrootfs mem=64M ip=192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:LJD2410:eth0:off”,支持NFS文件系統(tǒng)。 (7)Floating point emulation:包含浮點數(shù)運算仿真功能,需要開啟“NWFPE”選項。 (8)Userapace binary formats:包含支持的應(yīng)用程序格式,僅保留“ELF”格式支持,去掉其它。 (9)Power management options:包含電源管理功能,保持默認(rèn)。 (10)Networking:包含網(wǎng)絡(luò)功能:需要開啟基本功能選項。 (11)Device Drivers:包含設(shè)備驅(qū)動選項,下一小節(jié)將詳細(xì)介紹。 (12)File systems:包含各種文件系統(tǒng)的支持選項,去掉“EX2”等選項,僅保留 ROM 文件系統(tǒng)支持,在“Miscellaneous filesystems”子菜單中近保留“cramfs”文件系統(tǒng)支持,并且開啟NFS文件系統(tǒng)支持,去掉其它選項。 (13)Kernel hacking:包含各種內(nèi)核調(diào)試選項,保持默認(rèn)。 (14)Security options:包含安全性有關(guān)選項,保持默認(rèn)。 (15)Cryptographic API:包含加密算法,保持默認(rèn)。 (16)Library routines:包含幾種壓縮和校驗函數(shù),保持默認(rèn)。5.5.3 驅(qū)動程序配置選項 幾乎所有Linux的設(shè)備驅(qū)動都在“Device Drivers”菜單下,它對設(shè)備驅(qū)動程序加以歸類,放在子菜單下。本課題對于設(shè)備驅(qū)動的裁剪較多,具體如下: (1)MTD support:MTD設(shè)備驅(qū)動,應(yīng)添選NAND Flash驅(qū)動支持。 (2)Network debice support:網(wǎng)絡(luò)設(shè)備支持,在子菜單“Ethernet(10 or 100Mbits)”中可以看到CS8900A網(wǎng)卡的配置項,這正是4.4節(jié)工作的結(jié)果。 (3)Real Time Clock:時鐘驅(qū)動選項,應(yīng)選上“Samsung S3C series SoC RTC”,這樣系統(tǒng)時鐘才能正常運行。 (4)由于嵌入式導(dǎo)航計算機只使用串口作為輸入輸出接口,所以應(yīng)該剪裁掉那些無用的驅(qū)動,包括:并口、ATA及SATA驅(qū)動、RAID驅(qū)動、ISDN支持、輸入設(shè)備驅(qū)動、多媒體設(shè)備支持、USB 支持以及MMC/SD卡支持。(5)其它驅(qū)動支持保持默認(rèn)即可。 5.5.4 保存配置文件 內(nèi)核配置主菜單中選擇“Save an Alternate Configuration File”即可將目前的配置狀態(tài)保存成文件。程序默認(rèn)保存為“.config”,此文件位于內(nèi)核根目錄內(nèi),可以直接修改。 5.5.5 編譯 Linux 內(nèi)核 正式編譯Linux內(nèi)核之前,應(yīng)當(dāng)清理一下內(nèi)核樹,命令如下: $ make mrproper 此命令會清除掉.config 文件,所以應(yīng)當(dāng)在配置內(nèi)核之前做。 Linux 2.6 版本的編譯已經(jīng)簡化,使用一個 make 命令就可以完成諸如建 立文件依賴、生成zImage、編譯模塊、安裝模塊等一系列功能。內(nèi)核編譯完 成后,將在/arch/arm/boot 目錄中生成 image 和 zIamge 兩個內(nèi)核映像文件,其中 image 為正常大小的映像文件,而 zImage 為壓縮后的映像文件。此時 編譯好的可加載模塊也被安裝到預(yù)定位置,默認(rèn)為/lib/modules。5.6 內(nèi)核的下載及啟動 5.6.1 將引導(dǎo)信息加入內(nèi)核映像 U-boot 引導(dǎo)內(nèi)核時需要檢查一個 64byte 的頭信息,其中包含了入口地址、映像類型等基本信息。這個引導(dǎo)頭可以用 U-boot 附帶的 mkimage 工具生成,命令如下: $ mkimage-n 'linux-2.6.24'-A arm-O linux-T kernel-C none-a 0x30008000-e 0x30008040-d zImage zImage.img 各個參數(shù)的含義: -n:設(shè)置映像名 -A:設(shè)置體系信息 -O:設(shè)置操作系統(tǒng)信息 -T:設(shè)置映像類型 -c:壓縮類型 -a:讀入地址 -e:入口地址 -d:源映像文件 該命令生成的zImage.img文件就可以下載到開發(fā)板運行了。 5.6.2 內(nèi)核映像的下載及運行 將上一小節(jié)中生成的zImage.img文件拷貝到主機tftpboot 文件夾內(nèi)。啟動開發(fā)板,進(jìn)入U-boot 提示符。使用tftp命令將內(nèi)核映像下載到開發(fā)板內(nèi)存中: LJD2410> tftp 0x30008000 zImage.img TFTP from server 192.168.0.2;our IP is 192.168.0.10 Filename ‘zImage.img’ Load address : 0x30008000 Loading: #### Done 其中 0x30008000 為指定的下載到內(nèi)存的地址,zImge.img 就是帶有引導(dǎo)頭的內(nèi)核映像。當(dāng)內(nèi)核下載完成后,可以通過bootm命令啟動內(nèi)核: LJD2410> bootm 0x30008000 6 建立根文件系統(tǒng) 6.1 根文件系統(tǒng)概述 6.1.1 根文件系統(tǒng)簡介 對于嵌入式操作系統(tǒng)而言,僅包含內(nèi)核是不夠的,還必須有文件系統(tǒng)的支持。跟文件系統(tǒng)(root filesystem)是 Linux系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及無偶有用來為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件,并作為存儲數(shù)據(jù)讀寫結(jié)果的區(qū)域。在Linux系統(tǒng)啟動時,首先完成內(nèi)核安裝及環(huán)境初始化,最后會尋找一個文件系統(tǒng)作為根文件系統(tǒng)被加載。Linux系統(tǒng)中使用“/”來唯一表示根文件系統(tǒng)的安裝路徑。嵌入式系統(tǒng)中通常可以選擇的根文件系統(tǒng)有:Romfs, CRAMFS, RAMFS,JFFS2, EXT2等,甚至還可以使用NFS(網(wǎng)絡(luò)文件系統(tǒng))作為根文件系統(tǒng)。 6.1.2 NFS 文件系統(tǒng)與Cramfs文件系統(tǒng) NFS(Network File System)是由SUN公司發(fā)展,并于1984年推出的一種文件系統(tǒng)。它可以讓開發(fā)者通過網(wǎng)絡(luò)連接,使開發(fā)板可以直接掛載主機的某一個指定文件夾作為根文件系統(tǒng)。在嵌入式開發(fā)過程中,通常使用這種文件系統(tǒng)搭建交叉編譯環(huán)境。 cramfs(Compressed ROM File System)是Linux創(chuàng)始人Linus Torvalds開發(fā)的一個適用于嵌入式系統(tǒng)的文件系統(tǒng)。cramfs是一個只讀文件系統(tǒng),采用了zlib壓縮,壓縮比一般可以達(dá)到1:2,但仍可以做到高效的隨機讀取。Linux系統(tǒng)中,通常把不需要經(jīng)常修改的目錄壓縮存放,并在系統(tǒng)引導(dǎo)的時候再將壓縮文件解開。因為 cramfs 不會影響系統(tǒng)讀取文件的速度,而且是一個高度壓縮的文件系統(tǒng),因此本課題最終選用cramfs作為根文件系統(tǒng)部署到開發(fā)板。 6.2 建立Linux根文件系統(tǒng)目錄 嵌入式Linux根文件系統(tǒng)必須包含一些必須的目錄,比如設(shè)備目錄/dev、命令目錄/bin、庫目錄/lib等等。 本課題構(gòu)建根文件系統(tǒng)的工作目錄是 myrootfs,通過下列命令可以在myrootfs中創(chuàng)建所需的子目錄: $ mkdir bin dev etc lib proc sbin sys usr $ mkdir usr/bin usr/lib usr/sbin lib/modules $ mkdir mnt tmp var $ chmod 1777 tmp $ mkdir var/lib var/lock var/log var/run var/tmp $ chmod 1777 var/tmp $ mkdir home root boot 這樣,一個基本的根文件系統(tǒng)就建立起來了,但是各個目錄都是空的,缺少各種程序和命令工具,需要進(jìn)一步完善。心得體會 本課題的目標(biāo)是為基于ARM9處理器的導(dǎo)航計算機移植Linux操作系統(tǒng)。研究過程中,使用了 LJD2410 型開發(fā)板,此開發(fā)板的處理器是基于 ARM920T的 Samsung S3c2410,能夠滿足嵌入式導(dǎo)航計算機的硬件需求。本課題所做的工作簡要總結(jié)如下: 首先,本文對嵌入式系統(tǒng)、嵌入式Linux操作系統(tǒng)和ARM體系處理器做了簡單介紹,并且分析了嵌入式導(dǎo)航計算機的操作系統(tǒng)需求。 其次,介紹了交叉開發(fā)環(huán)境的建立。本課題兩臺主機連接開發(fā)板的方法,主機分別安裝不同的操作系統(tǒng),在開發(fā)過程中完成不同的工作。通過 TFTP和NFS等網(wǎng)絡(luò)服務(wù),實現(xiàn)高效連接,有利于提高開發(fā)效率。這部分是整個課題的基礎(chǔ),之后的所有工作都是在這個基礎(chǔ)上完成的。 第三,本文重點介紹了 Linux 系統(tǒng)的移植過程。Linux 系統(tǒng)移植包括三個方面:啟動加載程序(Bootloader)的移植,Linux 內(nèi)核的移植和根文件系統(tǒng)的建立。本課題選用功能強大的 U-boot 作為啟動加載程序,通過對其源代碼進(jìn)行修改,使其可以正常運行于開發(fā)板,并且實現(xiàn)下載、燒寫等功能。內(nèi)核則采用了2008年 4月發(fā)布的2.6.24.4版本,移植了網(wǎng)卡驅(qū)動,并針對課題需求,進(jìn)行了修改和裁剪,使得內(nèi)核加載更快,運行更穩(wěn)定。根文件系統(tǒng)選用了Cramfs文件系統(tǒng),這種文件系統(tǒng)采用壓縮格式,存儲空間需求小,但是不影響讀取速度,非常適合與嵌入式Linux系統(tǒng)。這三個方面的工作有前后繼承關(guān)系,但是又有一定獨立性,移植過程中應(yīng)多調(diào)試,多實驗。 最后,簡單介紹了系統(tǒng)部署的方法。將Linux 內(nèi)核和根文件系統(tǒng)部署到開發(fā)板后,開發(fā)板就可以脫離交叉開發(fā)環(huán)境而獨立運行,最終達(dá)到設(shè)計需求。 本課題充分利用前人積累的經(jīng)驗,結(jié)合最新的軟件版本進(jìn)行移植工作。在移植過程中遇到了許多困難和問題,主要靠查閱文獻(xiàn)和自己的試探性試驗來研究問題,通過多次的實踐,最終得到明確的解決方法。雖然移植后的Linux系統(tǒng)可以正常運行在開發(fā)板上,能滿足設(shè)計需求。但由于時間倉促,許多問題沒有深入研究,難免會出現(xiàn)一定的疏漏和瑕疵,需要我在今后的學(xué)習(xí)中不斷努力,加以改進(jìn)。第四篇:嵌入式系統(tǒng)的主要應(yīng)用
第五篇:基于嵌入式系統(tǒng)的圖形界面應(yīng)用設(shè)計范文