構(gòu)建嵌入式Linux開發(fā)環(huán)境_第1頁
構(gòu)建嵌入式Linux開發(fā)環(huán)境_第2頁
構(gòu)建嵌入式Linux開發(fā)環(huán)境_第3頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、目 錄構(gòu)建嵌入式Linux系統(tǒng)1.取本實(shí)驗(yàn)相關(guān)的軟件包到ftp下載以下軟件包: 文件名備注binutils-2.16.1.tar.bz2 gcc-4.0.2.tar.bz2 glibc-2.3.6.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2 linux-.tar.bz2 linux-libc-headers-.tar.bz2 制作交叉編譯工具鏈所需的源碼包 crosstool-0.43.tar.gz制作交叉編譯工具鏈的腳本和補(bǔ)丁 crosstool.tar.bz2已制作好的交叉編譯工具鏈,需要解包到/opt目錄使用 linu

2、x-2.6.27.tar.bz2內(nèi)核2.6.27 patch-2.6.27-aka針對2440開發(fā)板制作的內(nèi)核patch zImage已編譯好的內(nèi)核,可直接下載到開發(fā)板 rootfs-basic.tar基本根文件系統(tǒng)打包,由于有設(shè)備文件,所以解包需要root權(quán)限 rootfs-basic.cramfs采用cramfs文件系統(tǒng)格式的基本根文件系統(tǒng)映像,可直接下載到開發(fā)板 busybox-1.9.1.tar.bz2busybox源碼包,嵌入式根文件系統(tǒng)基本命令集 sqlite-3.4.0.tar.gzsqlite源碼包,嵌入式數(shù)據(jù)庫 libcgi-1.0.tar.gzlibcgi源碼包,用于編寫C

3、GI程序的C函數(shù)庫 qtopia-core-opensource-src-4.2.2.tar.gzQtopia Core源碼包,Qt的嵌入式版本 2.交叉編譯工具鏈要做嵌入式Linux開發(fā),首先需要有交叉編譯工具鏈(cross compiling toolchain),也就是在主機(jī)(x86 PC)上可編譯生成目標(biāo)板可執(zhí)行文件(ARM指令)的編譯工具。和普通的編譯工具鏈一樣,交叉編譯工具鏈也包括編譯、鏈接、修改目標(biāo)文件的各種程序,如gcc、glibc、ld、gas、objdump、readelf等等。交叉編譯工具鏈本身也是需要編譯生成的,要得到一套完整的交叉編譯工具鏈需要編譯以下源碼包: 

4、67; binutils § gcc § glibc § linux(內(nèi)核) § linux-libc-headers § glibc-linuxthreads 這些源碼包具有非常強(qiáng)的版本依賴關(guān)系,如果源碼包的版本不匹配,在編譯過程中會出現(xiàn)各種各樣的問題,有些問題需要對源碼做些修改或者打補(bǔ)丁,有些問題則是沒有解決辦法的,只能更換匹配較好的版本。編譯的步驟也是比較復(fù)雜的,主要有以下幾步: 0. 根據(jù)目標(biāo)平臺配置內(nèi)核源代碼,生成內(nèi)核頭文件 1. 編譯binutils 2. 編譯器的自舉(bootstrap),也就是先編譯出gcc的部分功能(沒有g(shù)l

5、ibc支持,只有C編譯器沒有C+編譯器) 3. 編譯glibc 4. 編譯完整的gcc 幸運(yùn)的是,已經(jīng)有人寫出了制作交叉編譯器的腳本( ),該腳本中提供了一系列源碼包版本的匹配方案,使用者需要選擇目標(biāo)平臺和源碼包的版本匹配方案,執(zhí)行該腳本會自動從官方網(wǎng)站( / 和 / )下載源代碼,自動打補(bǔ)丁,然后自動完成所有的編譯步驟。 首先從 下載crosstool-0.43.tar.gz,在主目錄下解包 $ tar xf crosstool-0.43.tar.gz; cd crosstool-0.43現(xiàn)在選擇一種源碼包的版本組合,

6、各種版本組合的兼容性可以參考 ,在此我們選擇在arm平臺上glibc版本較高,兼容性較好的一個組合: § gcc-4.0.2 § cgcc-4.0.2 § glibc-2.3.6 § binutils-2.16.1 § linux- § hdrs- 修改crosstool-0.43目錄下的腳本demo-arm.sh,取消這一行開頭的#號注釋符: #eval cat arm.dat gcc-4.0.2-glibc-2.3.6.dat sh all.sh -notest同時將原本沒有注釋的這一行注釋掉(前面

7、加#號): eval cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat sh all.sh -notest注意該腳本開頭有 TARBALLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstool這說明,該腳本運(yùn)行時,自動從 / 和 / 下載相關(guān)的源碼包到主目錄的downloads目錄下,如果你已經(jīng)下載過這些源碼包,將它們拷到downloads目錄下就可以不必再次下載了。對應(yīng)于我們選擇的版本組合,downloads目錄下的源碼包有: § bin

8、utils-2.16.1.tar.bz2 § gcc-4.0.2.tar.bz2 § glibc-2.3.6.tar.bz2 § glibc-linuxthreads-2.3.6.tar.bz2 § linux-.tar.bz2 § linux-libc-headers-.tar.bz2 整個編譯結(jié)束后,交叉編譯工具鏈將放在/opt/crosstool目錄下,因此腳本需要在/opt下建子目錄,如果不希望使用root權(quán)限運(yùn)行該腳本,則需要事先給/opt目錄設(shè)置寫權(quán)限: $ sudo chmod a+w /opt然后

9、修改arm.dat,其中有 TARGET=arm-unknown-linux-gnu這是按標(biāo)準(zhǔn)的命名規(guī)則為工具鏈命名的,但是通常我們都采用更簡單的命名,很多軟件的Makefile中交叉編譯器默認(rèn)也都采用簡單的命名,為此我們把它改為TARGET=arm-linux。 由于編譯過程需要用到patch、bison、flex,確認(rèn)你的系統(tǒng)中安裝了這些軟件包。 在編譯過程中可能還會遇到腳本的兼容性問題,如果你的Linux發(fā)行版將sh指向dash(例如Ubuntu),應(yīng)將其改指向bash: $ cd /bin$ sudo ln -sf bash sh雖然用dash執(zhí)行腳本時非常高效并且其實(shí)現(xiàn)完全遵守POS

10、IX標(biāo)準(zhǔn),然而現(xiàn)存的很多腳本(比如glibc中的腳本)有不符合POSIX標(biāo)準(zhǔn)的用法,所以仍需改用bash執(zhí)行。 準(zhǔn)備就緒后,在crosstool-0.43目錄下運(yùn)行demo-arm.sh腳本開始編譯。編譯完成后,交叉編譯工具鏈的可執(zhí)行文件位于/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin目錄,我們可以把這個路徑添加到PATH環(huán)境變量中,例如將以下命令添加到/.bashrc啟動腳本: export PATH=$PATH:/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin此外,網(wǎng)上也可下載到已編

11、譯好的交叉編譯工具鏈,比如 /snapgear/downloads.html ,但是使用別人編譯好的交叉編譯工具鏈有很多限制,不能按自己的特殊需要對其定制,比如有些項(xiàng)目需要特定版本的gcc和glibc,再比如需要soft-float的編譯器(生成指令模擬浮點(diǎn)數(shù)運(yùn)算)。 以上編譯步驟需要很長時間,也可以直接從ftp下載已制作好的交叉編譯工具鏈安裝到主機(jī): $ sudo chmod a+w /opt$ tar xf crosstool.tar.bz2 -C /opt然后在/.bashrc啟動腳本中修改PATH環(huán)境變量。 3.熟悉開發(fā)環(huán)境3.1 U-boo

12、t的基本使用方法連接好開發(fā)板的網(wǎng)線和串口線,啟動minicom(配置成115200 8N1,無Flow Control)。按下開發(fā)板電源,立刻按除回車以外的任意鍵,進(jìn)入bootloader提示符AKAE2440#。如果沒來及按鍵就已經(jīng)啟動了內(nèi)核,可以按開發(fā)板上的RESET鍵重來。 注意:u-boot的終端不能處理控制字符,不要用移動光標(biāo)鍵或翻頁鍵等,退格鍵可以用。按了產(chǎn)生控制字符的鍵再輸入命令就會產(chǎn)生錯亂,這時可以按下回車輸入當(dāng)前這條已經(jīng)錯亂的命令,然后在新的提示符下重新鍵入命令。 輸入printenv命令顯示bootloader的參數(shù)。 更改參數(shù)使用命令set或者setenv,如下圖所示:上

13、圖中,setenv ipaddr 2表示設(shè)置開發(fā)板的IP地址為2。setenv netmask 表示設(shè)置子網(wǎng)掩碼為。setenv serverip 1表示設(shè)置與開發(fā)板相連的PC機(jī)IP是1??梢愿鶕?jù)你的情況重新設(shè)置。為了統(tǒng)一起見,在后面的實(shí)驗(yàn)中,我們統(tǒng)一設(shè)置為: AKAE2440 # set ipaddr 00AKAE2440 # set serverip 1 (這一項(xiàng)應(yīng)該和你的主機(jī)IP一致)AKAE2440 #

14、set netmask AKAE2440 # set gateway 1 (網(wǎng)關(guān)ip設(shè)置成什么無所謂,一般都設(shè)為主機(jī)ip)AKAE2440 # savesave將這些設(shè)定寫入flash中,下次開發(fā)板上電時仍然有效。如果不save則僅改變內(nèi)存中的參數(shù)值,reset后會恢復(fù)flash中原來的參數(shù)值。 設(shè)置完成后在開發(fā)板上ping 主機(jī)的ip地址,檢查網(wǎng)絡(luò)是否正常,如下所示:AKAE2440 # ping 1host 1 is alive這表示主機(jī)能ping通,網(wǎng)絡(luò)正常。如果顯示如下:AKAE2440 # p

15、ing 1ping failed; host 1 is not alive.這就表示主機(jī)不能ping通,網(wǎng)絡(luò)異常,需要檢查你的網(wǎng)絡(luò)。還有一些常見的參數(shù):AKAE2440 # set bootdelay 3Bootdelay設(shè)為3,表示開發(fā)板上電后等待3秒再啟動,這3秒時間內(nèi)按任意鍵會進(jìn)入u-boot命令行狀態(tài),如下圖所示:另外,還有:AKAE2440 # set bootmode nfs或者AKAE2440 # set bootmode nandBootmode 可以設(shè)為nfs或者nand兩者之一,這個參數(shù)表明了u-boot啟動時,根文件系統(tǒng)在哪里尋

16、找,如果是nand表示根文件系統(tǒng)保存在開發(fā)板本身的flash某個分區(qū)中,要到flash上去找;如果是nfs則表示u-boot要去你的PC機(jī)的nfs服務(wù)的目錄(PC機(jī)硬盤上)去找。在開發(fā)板bootloader輸入以下命令查看64M flash是如何分區(qū)的。 AKAE2440 # mtdpartsDevice nand0 <akae2440-nand>. # parts = 4#: name size offset mask_flags0: u-boot 0x00100000 0x00020000 01: kernel  0x00200000 0x00100000 02: e

17、xt2   0x01000000 0x00300000 03: temp   0x02d00000 0x01300000 0u-boot分區(qū)保存bootloader程序,Linux內(nèi)核保存在kernel分區(qū),根文件系統(tǒng)會保存到ext2分區(qū), temp分區(qū)本實(shí)驗(yàn)中沒有用到。 如果mtdparts命令未顯示上述圖樣,可能是flash未作分區(qū)操作,可以使用mtdparts default命令來創(chuàng)建上述那樣的默認(rèn)分區(qū)。如下圖所示: 如果要保存新的分區(qū)表,使用命令save保存到flash中,否則reset后將恢復(fù)flash中原來的分區(qū)表。 下載文件到開發(fā)板內(nèi)存中,需要通過tftp協(xié)議

18、。開發(fā)板是tftp客戶端,主機(jī)是tftp服務(wù)器。在配置好主機(jī)的tftp服務(wù)之后,主機(jī)上會有一個tftp服務(wù)的主目錄/tftproot,我們把要下載到開發(fā)板上的文件都先拷貝到這個目錄中,之后才能下載。tftp命令的格式為 tftp <內(nèi)存地址> 文件名。注意我們都是把內(nèi)核zImage文件下載到0x30008000地址上,把根文件系統(tǒng)img文件下載到0x30800000地址上。當(dāng)我們用命令tftp 0x30008000 zImage把內(nèi)核zImage下載到內(nèi)存地址0x30008000上之后,先使用nand erase kernel命令擦除掉flash的kernel分區(qū)上的數(shù)據(jù)(否則在讀

19、出flash數(shù)據(jù)時會報(bào)失敗),然后可以用nand write 0x30008000 kernel 0x200000命令把內(nèi)存中的內(nèi)核文件燒寫到flash的對應(yīng)kernel分區(qū)中去,如下圖所示: 同理,當(dāng)我們用命令tftp 0x30800000 rootfs.cramfs把根文件系統(tǒng)rootfs.cramfs映像文件下載到內(nèi)存地址0x30800000上之后,用nand write 0x30800000 ext2 0x1000000命令把它燒寫到flash的ext2分區(qū)中去,當(dāng)然,在燒寫之前也要先使用 nand erase ext2擦除掉flash的ext2分區(qū),否則燒寫后讀出數(shù)據(jù)會失敗。如下圖所

20、示:注意:如果發(fā)現(xiàn)tftp服務(wù)配置是正確的,但是有些文件不能夠下載,則很有可能是文件權(quán)限的問題。可以使用sudo chmod 777 zImage rootfs.cramfs這樣的命令來更改文件訪問權(quán)限?,F(xiàn)在,內(nèi)核和cramfs根文件系統(tǒng)都燒寫到flash上去了,只要設(shè)置好正確的內(nèi)核啟動參數(shù)就可以啟動開發(fā)板了。AKAE2440 # set bootcmd nand read 0x30008000 kernel 0x200000; myboot 0x30008000AKAE2440 # set bootargs noinitrd console=ttySAC0,115200AKAE2440 #

21、set bootmode nandAKAE2440 # set init /linuxrc AKAE2440 # set root /dev/mtdblock2AKAE2440 # savebootcmd參數(shù)表示u-boot上電后會自動執(zhí)行的命令,第一條nand read 0x30008000 kernel 0x200000表示從flash上kernel分區(qū)去讀取Linux內(nèi)核到開發(fā)板內(nèi)存地址0x30008000處,大小為0x200000字節(jié);第二條命令是myboot 0x30008000表示跳轉(zhuǎn)到地址0x30008000去啟動Linux內(nèi)核。這兩條命令要用分號“;”隔開,但是設(shè)置bootcm

22、d參數(shù)時設(shè)置給它的是一個字符串,所以分號要用轉(zhuǎn)義字符“;”代替。bootargs就是我們常說的Linux內(nèi)核的啟動命令行參數(shù)(Linux_cmd_line)。U-boot通過這個參數(shù)告知內(nèi)核一些關(guān)鍵的啟動參數(shù)。實(shí)際上,在Uboot中,最后的完整的啟動命令行參數(shù)是由前面設(shè)置那些一個一個的小項(xiàng)組合而成的。真正完整的命令行參數(shù)是:noinitrd console=ttySAC0,115200 init=/linuxrc cs89x0_media=rj45 root=/dev/mtdblock2 mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2

23、),45M(temp) ip=00:1:1::eth0:off noinitrd表示內(nèi)核啟動時不需要初始化一個內(nèi)存磁盤ramdisk;而root=/dev/mtdblock2表示根文件系統(tǒng)在flash的編號為2的分區(qū)上(從0開始編號的,所以是第三個分區(qū),回憶前面的u-boot的分區(qū)信息,flash上分區(qū)依次是u-boot,kernel,ext2,temp,我們的根文件系統(tǒng)就在第三個分區(qū)ext2上);console=ttySAC0, 115200表示打開一個串行終端ttySAC0,它是通過串口1工作的,波

24、特率為115200;init=/linuxrc表示內(nèi)核啟動好后第一個執(zhí)行的應(yīng)用程序是/linuxrc,根目錄下的linuxrc;mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp)表示u-boot傳遞給內(nèi)核的分區(qū)信息。我們在選擇使用nfs根文件系統(tǒng)還是cramfs根文件系統(tǒng)的時候,bootargs、bootcmd和init參數(shù)基本都一樣,不用改變,需要改變的是bootmode參數(shù),由bootmode參數(shù)的設(shè)置決定去選擇root參數(shù)(描述cramfs根文件系統(tǒng)所在位置)還是nfsroot參數(shù)(描述nfs根文件系統(tǒng)所在位置

25、),即bootmode為nand時選擇root參數(shù),bootmode為nfs時選擇nfsroot參數(shù)。在啟動進(jìn)入到Linux系統(tǒng)后,可以通過在命令行終端鍵入如下命令來查看命令行參數(shù):$cat /proc/cmdline現(xiàn)在啟動。 AKAE2440 # reset這時屏幕上出現(xiàn)很多內(nèi)核啟動信息,之后提示登錄,輸入root即可登錄。 (none) login: root現(xiàn)在可以試試各種Linux基本命令。注意cramfs是只讀文件系統(tǒng),在開發(fā)板上運(yùn)行時不能改動里面的文件。 有些時候我們可能會嘗試配置不同的內(nèi)核選項(xiàng),會得到不同的幾個內(nèi)核zImage文件,這樣都燒寫到flash上再reset啟動太浪費(fèi)

26、時間,可以用tftp把內(nèi)核zImage加載到內(nèi)存0x30008000地址上,不燒寫,直接用myboot 0x30008000去啟動內(nèi)存上的內(nèi)核。如下圖示:3.2 將自己定制的根文件系統(tǒng)下載到開發(fā)板運(yùn)行“根文件系統(tǒng)”是一種不嚴(yán)格的說法,其實(shí)是指文件系統(tǒng)中的文件和目錄,這些文件和目錄構(gòu)成了一個Linux系統(tǒng)運(yùn)行所需的基本框架。ftp上的rootfs-basic.tar是根文件系統(tǒng)的打包,由于包含設(shè)備文件,需要root權(quán)限才能解包: $ sudo tar xf rootfs-basic.tar解包后可以根據(jù)自己的需要修改其中的目錄和文件,然后將根文件系統(tǒng)目錄制作成cramfs映像再下到開發(fā)板運(yùn)行,這

27、樣就達(dá)到了修改根文件系統(tǒng)中的目的。 首先確認(rèn)你的主機(jī)上安裝了軟件包c(diǎn)ramfsprogs,然后制作cramfs文件系統(tǒng)映像: $ mkcramfs /rootfs rootfs.cramfs然后按照前面的步驟把rootfs.cramfs下載到開發(fā)板的ext2分區(qū),運(yùn)行一下試試。 3.3 設(shè)置開發(fā)板的啟動方式為NFS Root基本思想是:在主機(jī)上開NFS服務(wù)器,把主機(jī)上的/rootfs目錄導(dǎo)出為NFS服務(wù)目錄,使開發(fā)板一啟動就自動加載主機(jī)的/rootfs目錄為根文件系統(tǒng),省去了下載和燒寫映像的麻煩,在主機(jī)上修改根文件系統(tǒng)中的文件立刻在開發(fā)板的系統(tǒng)上生效,在開發(fā)過程中十分便利。 首先在主機(jī)上安裝和

28、配置NFS服務(wù),確認(rèn)你的主機(jī)安裝了nfs-kernel-server軟件包。然后修改配置文件/etc/exports,添加下面一行(注意*號后面緊跟左括號,無空格,每個逗號后面也不能有空格): /home/akaedu/rootfs *(rw,sync,no_root_squash)這表示我們把上一節(jié)中通過解壓rootfs-basic.tar得到的/home/akaedu/rootfs/目錄設(shè)置為nfs服務(wù)目錄。更改配置后需要重啟NFS服務(wù): $ sudo /etc/init.d/nfs-kernel-server restart用rpcinfo -p命令看一下portmapper和nfs服務(wù)

29、是否正常啟動了,用exportfs命令看一下導(dǎo)出目錄的設(shè)置是否正確。 進(jìn)入開發(fā)板的bootloader,修改內(nèi)核啟動參數(shù): AKAE2440 # set bootcmd nand read 0x30008000 kernel 0x200000; myboot 0x30008000AKAE2440 # set bootargs noinitrd console=ttySAC0,115200AKAE2440 # set init /linuxrc AKAE2440 # set nfsroot /home/akaedu/rootfsAKAE2440 # set bootmode nfsAKAE244

30、0 # saveAKAE2440 # reset真正完整的內(nèi)核啟動命令行參數(shù)是:noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/nfs nfsroot=1:/home/akaedu/rootfs mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp) ip=00:1:1::eth0:off 注意,如果某一項(xiàng)參數(shù)很長,而minicom提供的終端卻不

31、能自動換行,一行寫不下的部分只好盲打了,注意不要打錯。如果是圖形界面的console,可以把字體調(diào)小使得一行可以容得下這么長的參數(shù),或者在gedit寫字板程序中寫好后直接粘貼到console窗口(我們推薦采用這種方法,把經(jīng)常用到的啟動參數(shù)都集中寫好,以后可以選擇對應(yīng)的參數(shù)直接粘貼就好了,非常方便)。關(guān)于NFS根文件系統(tǒng)的內(nèi)核啟動參數(shù)參考內(nèi)核源代碼的Documentation/nfsroot.txt文檔。 現(xiàn)在可以自己交叉編譯一些小程序,然后拷貝到主機(jī)的/rootfs目錄,我們可以立刻在開發(fā)板上運(yùn)行該程序,而不需要重新下載和燒寫了。 3.4 配置YAFFS文件系統(tǒng)cramfs是只讀文件系統(tǒng),在F

32、lash上壓縮存儲,解壓并加載到RAM運(yùn)行。由于只讀因而功能上很受限制,但可以保護(hù)系統(tǒng)文件不被意外的寫操作損壞。實(shí)際產(chǎn)品往往配置兩個Flash分區(qū),一個只讀分區(qū)用于存放系統(tǒng)文件(程序文件和庫文件),另一個可寫分區(qū),采用JFFS或YAFFS文件系統(tǒng),用于存放應(yīng)用程序數(shù)據(jù),為了簡便起見,我們只分一個區(qū),使用可寫的YAFFS文件系統(tǒng)。注意,完成這個實(shí)驗(yàn)之前先要完成上一節(jié)內(nèi)容,能啟動到nfs根文件系統(tǒng)。 首先用NFS方式啟動系統(tǒng)。YAFFS文件系統(tǒng)和我們熟悉的ext2不同,不需要格式化,只需要全部擦除就可以用了。用根文件系統(tǒng)中的flash_eraseall命令擦除root分區(qū)并mount上來。以下命令

33、在開發(fā)板上執(zhí)行 # flash_eraseall /dev/mtd2Erasing 16 Kibyte 6b8000 - 10 % complete.Skipping bad block at 0x006bc000Erasing 16 Kibyte 3dfc000 - 99 % complete.# mount -t yaffs /dev/mtdblock2 /mntyaffs: dev is 32505859 name is "mtdblock2"yaffs: Attempting MTD mount on 31.3, "mtdblock2"block

34、 432 is bad# ls /mntlost+foundflash_eraseall命令是從mtd項(xiàng)目( / )的源代碼中交叉編譯得來的。 現(xiàn)在可以把根文件系統(tǒng)中的所有文件拷貝到Flash分區(qū)。以下命令在開發(fā)板上執(zhí)行: # cp -a bin etc lib linuxrc opt sbin srv tmp usr /mnt/# mkdir -p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt/var/run# mknod /mnt/dev/console -m 600 c 5 1# mk

35、nod /mnt/dev/null -m 666 c 1 3# umount mnt# reboot注意:像/proc、/sys這樣正mount著特殊文件系統(tǒng)的目錄和/dev目錄下的設(shè)備文件一定不可以用cp命令拷貝。/mnt目錄顯然也不能拷貝。這些目錄和設(shè)備文件需要手動創(chuàng)建。 重啟目標(biāo)系統(tǒng)之后進(jìn)入U-boot,修改內(nèi)核啟動參數(shù)使之從ext2分區(qū)啟動即可(如果下次還用NFS啟動,這里就不save了): AKAE2440 # set bootmode nandAKAE2440 # set root /dev/mtdblock2AKAE2440 # set bootargs noinitrd roo

36、tfstype=yaffs rw console=ttySAC0,115200AKAE2440 # saveAKAE2440 # reset現(xiàn)在試試能不能修改Flash根文件系統(tǒng)中的文件。 4.編譯內(nèi)核將內(nèi)核釋放到/linux-2.6.27目錄下 $ tar xf linux-2.6.27.tar.bz2進(jìn)入內(nèi)核目錄: $ cd linux-2.6.27(本開發(fā)板不用修改makefile,打補(bǔ)丁時就會自動修改)首先修改Makefile,找到 ARCH  ?= $(SUBARCH)CROSS_COMPILE  ?=改為 ARCH  ?= armCROSS_COMPI

37、LE  ?= arm-linux-注意ARCH ?=arm后面不能有空格,要確??崭褚褎h除干凈,并且不要漏了arm-linux-末尾的“-”。下面對內(nèi)核打patch(注意打patch不要重復(fù)打): /linux-2.6.27$ patch -p1 < ./patch-2.6.27-aka然后以內(nèi)核源代碼自帶的smdk2440基本配置文件為基礎(chǔ),使用menuconfig定制內(nèi)核(確認(rèn)你的主機(jī)安裝了libncurses-dev軟件包)。 /linux-2.6.27$ cp arch/arm/configs/akae2440_defconfig .config/linux-2.6.2

38、7$ make menuconfig查看配置菜單中的如下選項(xiàng)(有些已經(jīng)默認(rèn)選中): 1、在Floating point emulation中選擇NWFPE math emulation。由于ARM920T沒有浮點(diǎn)協(xié)處理器,浮點(diǎn)數(shù)指令需要用其它指令仿真實(shí)現(xiàn)。 有兩種方法可以仿真浮點(diǎn)指令:一種方法如先前所說的,使交叉編譯器支持soft-float,也就是一遇到C代碼里的浮點(diǎn)運(yùn)算就自動生成仿真指令,另一種方法是交叉編譯器仍然生成浮點(diǎn)運(yùn)算指令(對于ARM平臺是指協(xié)處理器指令),然而ARM920T沒有浮點(diǎn)協(xié)處理器,無法識別浮點(diǎn)指令,因而產(chǎn)生undefined異常,這個Floating point emu

39、lation內(nèi)核選項(xiàng)就是在undefined異常的處理函數(shù)中仿真實(shí)現(xiàn)浮點(diǎn)運(yùn)算。也就是說,這里我們使用非soft-float的交叉編譯器并在內(nèi)核中實(shí)現(xiàn)浮點(diǎn)仿真。這樣的運(yùn)行效率比使用soft-float編譯要低,因?yàn)槊看胃↑c(diǎn)運(yùn)算都需要處理異常和進(jìn)入內(nèi)核,但是兼容性好,便于我們利用別人已編譯好的程序。 2、選中File systems -> Pseudo filesystems -> /proc file system support; Sysctl support (/proc/sys); sysfs file system support 和Virtual memory file s

40、ystem support (former shm fs); Tmpfs POSIX Access control Lists。 /proc file system(或者叫procfs)是內(nèi)核提供給用戶程序的接口,很多Linux程序都需要在procfs中讀寫數(shù)據(jù),比如busybox,因此這個選項(xiàng)一般是不能少的。Virtual memory file system(或者叫tmpfs)用于內(nèi)存虛擬磁盤,后面我們在做根文件系統(tǒng)時要mount一個tmpfs到/dev目錄下。 3、不需要改變Boot options -> Default kernel command string,因?yàn)閎ootlo

41、ader中的內(nèi)核啟動參數(shù)會取代這里的設(shè)置。 4、選中Device Drivers -> Network device support -> Ethernet (10 or 100Mbit) -> CS8900A support,添加對網(wǎng)卡芯片的支持。在File systems -> Network File Systems菜單中選上NFS client support;NFS client support for NFS version3;NFS client support for the NFSv3 ACL protocol extension和Root file

42、system on NFS。 5、選中Device Drivers -> Memory Technology Devices (MTD) -> MTD partitioning support,在Device Drivers -> Memory Technology Devices (MTD),選中NAND Device Support和它下面的NAND Flash support for S3C2410/S3C2440 SoC; S3C2410 NAND driver debug,不要選擇S3C2410 NAND Hardware ECC,因?yàn)镾3C2410硬件生成ECC碼

43、的算法和我們所需要的不一致。 6、在File systems -> Miscellaneous filesystems中選中YAFFS2 file system support; Auto select yaffs2 format; cache short names in RAM, 再選上Compressed ROM file system support (cramfs)。 7、在Device Drivers -> Graphics support中選中Support for frame buffer devices, 再選中它下面的Enable firmware EDID;

44、Enable video Mode Handling Helpers; S3C2410 LCD framebuffer support,不選擇Virtual Frame Buffer support因?yàn)樗且粋€用于調(diào)試的虛擬設(shè)備驅(qū)動而不是實(shí)際硬件的驅(qū)動。如果還選中了Bootup Logo,那么在內(nèi)核啟動過程中初始化framebuffer時會在屏幕上看到Linux的企鵝logo,這是測試framebuffer驅(qū)動是否正常工作最直接的方法。Bootup Logo有三種規(guī)格,我們的開發(fā)板支持VGA輸出,可以選擇224色的漂亮logo。 8、在 Device Drivers -> USB sup

45、port中選中Support for Host-side USB,然后選擇OHCI HCD support,在Device Drivers -> Input device support中選中Mouse interface,設(shè)置屏幕分辨率Horizontal screen resolution和Vertical screen resolution為1024和768。 9、選中Device Drivers ->Real time clock -> Set system time from RTC on startup and resume; /sys/class/rtc/rtc

46、N (sysfs); /proc/driver/rtc (procfs for rtc0); /dev/rtcN (character devices); Test driver/device.10、如果不希望在/dev目錄下生成大量偽終端設(shè)備文件,可以取消選擇Device Drivers -> Character devices -> Legacy (BSD) PTY support。 配置完成后用make命令編譯內(nèi)核,這個過程需要較長時間,編譯好的內(nèi)核位于/linux-2.6.27/arch/arm/boot/zImage。現(xiàn)在將自己編譯的內(nèi)核下載到開發(fā)板,看系統(tǒng)能不能正常啟動

47、。 5.制作根文件系統(tǒng)5.1 根文件系統(tǒng)框架和busybox首先用mkdir手動創(chuàng)建如下的基本目錄結(jié)構(gòu): $ tree rootfs/rootfs/|- bin|- dev|- etc| |- init.d| - network| |- if-down.d| |- if-post-down.d| |- if-pre-up.d| - if-up.d|- lib|- mnt|- opt|- proc|- sbin|- srv|- sys|- tmp|- usr| |- bin| |- lib| - sbin- var - run/bin /sbin /usr/bin /usr/sbin系統(tǒng)的基本命

48、令,系統(tǒng)關(guān)鍵組件的可執(zhí)行文件位于/bin和/sbin,其它應(yīng)用程序的可執(zhí)行文件位于/usr/bin和/usr/sbin,bin和sbin的區(qū)別在于,bin目錄下的可執(zhí)行文件用于日常操作,例如ls、cp,sbin目錄下的可執(zhí)行文件用于管理操作,例如ifconfig,執(zhí)行管理操作通常需要root權(quán)限 /lib /usr/lib共享庫,也是分為系統(tǒng)關(guān)鍵組件的共享庫和其它應(yīng)用程序的共享庫 /procproc文件系統(tǒng)的掛載點(diǎn) /syssys文件系統(tǒng)的掛載點(diǎn) /dev設(shè)備文件 /etc配置文件、啟動腳本 /var運(yùn)行時產(chǎn)生的記錄文件、鎖文件、日志文件 /tmp運(yùn)行時產(chǎn)生的臨時文件 /mnt一般用作掛載點(diǎn)

49、/opt一般存放第三方軟件 /srv一般用作Web服務(wù)、ftp服務(wù)的服務(wù)目錄 接下來安裝busybox到根文件系統(tǒng)中。busybox是專為嵌入式Linux設(shè)計(jì)的,它把大多數(shù)常用命令(如ls、cp、tar等等)的常用選項(xiàng)剪裁出來拼在一起。在根文件系統(tǒng)中只有一個可執(zhí)行文件就是/bin/busybox,而其它的命令都創(chuàng)建為/bin/busybox的鏈接文件,busybox 通過命令行第0個參數(shù)(也就是命令名)判斷應(yīng)該執(zhí)行哪個命令。這樣使得嵌入式Linux系統(tǒng)有完整的命令集卻占用很小的存儲空間。 首先從官方網(wǎng)站 下載源碼包busybox-1.9.1.tar.bz2并解包到主目錄下。 $ tar xf

50、busybox-1.9.1.tar.bz2; cd busybox-1.9.1/busybox的配置系統(tǒng)和內(nèi)核源代碼很相似,因此配置方法也和內(nèi)核相似,首先修改Makefile,找到 ARCH  ?= $(SUBARCH)CROSS_COMPILE  ?=改為 ARCH  ?= armCROSS_COMPILE  ?= arm-linux-然后我們以一個缺省配置為起點(diǎn)來做進(jìn)一步的配置: /busybox-1.9.1$ make defconfig/busybox-1.9.1$ make menuconfig在菜單中做如下配置: § 選擇BusyB

51、ox Settings -> Installation Options -> BusyBox installation prefix,設(shè)置為/home/akaedu/rootfs,編譯后將安裝到這個目錄下。 § 根據(jù)需要裁剪各命令。但是Shells -> Choose your default shell選項(xiàng)一定要保留一個默認(rèn)shell(例如ash),如果沒有默認(rèn)shell,將不會創(chuàng)建/bin/sh這個鏈接,而一般的shell腳本都是以#!/bin/sh開頭的,如果找不到/bin/sh就不能執(zhí)行。 然后編譯和安裝busybox: /busybox-1.9.1$ ma

52、ke/busybox-1.9.1$ make installbusybox文件和一系列的鏈接文件將安裝到/home/akaedu/rootfs下。busybox文件位于根文件系統(tǒng)的/bin目錄,其它鏈接文件位于/bin、/sbin、/usr/bin、/usr/sbin目錄,有一個鏈接文件linuxrc位于根文件系統(tǒng)的根目錄/,它是系統(tǒng)的啟動程序,bootloader中內(nèi)核的啟動參數(shù)有init=/linuxrc,也就是說內(nèi)核啟動后首先執(zhí)行/linuxrc(也是busybox的一個符號鏈接)。linuxrc負(fù)責(zé)完成系統(tǒng)的初始化工作: 0. 設(shè)置信號處理程序 1. 初始化console 2. 解析/

53、etc/inittab文件 3. 執(zhí)行系統(tǒng)初始化腳本,缺省的是/etc/init.d/rcS 4. 執(zhí)行inittab中類型為wait的程序 5. 執(zhí)行inittab中類型為once的程序 上述步驟完成后系統(tǒng)啟動完成,此后init程序?qū)⒀h(huán)執(zhí)行以下步驟: 0. 執(zhí)行inittab中類型為respawn的程序,如果所執(zhí)行的程序終止,則再次執(zhí)行它 1. 如果收到用戶請求,則執(zhí)行inittab中類型為askfirst的程序 linuxrc需要讀取設(shè)備文件/dev/console和/dev/null,我們手動創(chuàng)建這些設(shè)備文件: $ cd rootfs/dev; sudo mknod -m 600 co

54、nsole c 5 1; sudo mknod -m 666 null c 1 3注意,創(chuàng)建設(shè)備文件需要root權(quán)限,常見設(shè)備文件的設(shè)備號可以從內(nèi)核代碼的Documentation/devices.txt文件中查到。 然后創(chuàng)建一個啟動配置文件/rootfs/etc/inittab: :sysinit:/etc/init.d/rcS:respawn:/sbin/getty 115200 s3c2410_serial0:restart:/sbin/init:shutdown:/bin/umount -a -r啟動的過程中首先執(zhí)行rcS啟動腳本,我們創(chuàng)建這個腳本/rootfs/etc/init.d/

55、rcS: #!/bin/shmount -a注意這個腳本需要加可執(zhí)行權(quán)限:chmod +x rcS。這個腳本做了一件事情,根據(jù)/etc/fstab配置文件提供的信息mount一些文件系統(tǒng),我們創(chuàng)建這個配置文件/rootfs/etc/fstab: # <file name> <mount point> <type> <options> <dump> <pass>proc /proc proc defaults 0 0sys /sys sysfs defaults 0 0/proc和/sys都是pseudo文件系統(tǒng),它們并不在

56、磁盤或flash上存儲任何數(shù)據(jù),雖然看起來/proc和/sys目錄下有很多文件,但這些文件都是內(nèi)核導(dǎo)出的接口,對這些文件進(jìn)行讀寫會讀寫到內(nèi)核中的一些運(yùn)行時參數(shù),而不會讀寫到磁盤。/proc文件系統(tǒng)是busybox中的許多程序所需要的接口,/sys文件系統(tǒng)則是后面要講的mdev所需要的接口。 mount完文件系統(tǒng)后,rcS執(zhí)行結(jié)束。下面將執(zhí)行inittab文件中類型為respawn的命令,也就是 /sbin/getty 115200 s3c2410_serial0我們的PC在啟動時執(zhí)行g(shù)etty打開幾個虛終端,例如/dev/tty1/dev/tty6,嵌入式開發(fā)板也是用getty打開虛終端,這個虛終端對應(yīng)的是串口,因此需要訪問串口的設(shè)備文件/dev/s3c2410_serial0,以上命令還指定了波特率為115200?,F(xiàn)在我們創(chuàng)建這個設(shè)備文件: $ cd rootfs/dev; sudo mknod -m 600 s3c2410_serial0 c 204 64這個設(shè)備號在內(nèi)核代碼的Documentation/arm/Samsung-S3C24XX/Overview.txt中可以查到,在內(nèi)核

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論