如何構(gòu)建嵌入式Linux系統(tǒng)方案_第1頁(yè)
如何構(gòu)建嵌入式Linux系統(tǒng)方案_第2頁(yè)
如何構(gòu)建嵌入式Linux系統(tǒng)方案_第3頁(yè)
如何構(gòu)建嵌入式Linux系統(tǒng)方案_第4頁(yè)
如何構(gòu)建嵌入式Linux系統(tǒng)方案_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 PAGE23 / NUMPAGES23 HYPERLINK :/ / HYPERLINK :/ /目 錄 TOC TOC 構(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ǔ)丁 cross

2、tool.tar.bz2已制作好的交叉編譯工具鏈,需要解包到/opt目錄使用 linux-2.6.27.tar.bz2核2.6.27 patch-2.6.27-aka針對(duì)2440開(kāi)發(fā)板制作的核patch zImage已編譯好的核,可直接下載到開(kāi)發(fā)板 rootfs-basic.tar基本根文件系統(tǒng)打包,由于有設(shè)備文件,所以解包需要root權(quán)限 rootfs-basic.cramfs采用cramfs文件系統(tǒng)格式的基本根文件系統(tǒng)映像,可直接下載到開(kāi)發(fā)板 busybox-1.9.1.tar.bz2busybox源碼包,嵌入式根文件系統(tǒng)基本命令集 sqlite-3.4.0.tar.gzsqlite源碼包

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

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

5、譯器) 編譯glibc 編譯完整的gcc 首先從 .kegel./crosstool 下載crosstool-0.43.tar.gz,在主目錄下解包 $ tar xf crosstool-0.43.tar.gz; cd crosstool-0.43現(xiàn)在選擇一種源碼包的版本組合,各種版本組合的兼容性可以參考 .kegel./crosstool/crosstool-0.43/buildlogs/ ,在此我們選擇在arm平臺(tái)上glibc版本較高,兼容性較好的一個(gè)組合: gcc-4.0.2 cgcc-4.0.2 glibc-2.3.6 binutils-2.16.1 linux- hdrs- 修改cr

6、osstool-0.43目錄下的腳本demo-arm.sh,取消這一行開(kāi)頭的#號(hào)注釋符: #eval cat arm.dat gcc-4.0.2-glibc-2.3.6.dat sh all.sh -notest同時(shí)將原本沒(méi)有注釋的這一行注釋掉(前面加#號(hào)): eval cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat sh all.sh -notest注意該腳本開(kāi)頭有 TARBALLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstool這說(shuō)明,該腳本運(yùn)行時(shí),自動(dòng)從 ./ 和 ./ 下載相關(guān)的源碼包到主目錄的downloa

7、ds目錄下,如果你已經(jīng)下載過(guò)這些源碼包,將它們拷到downloads目錄下就可以不必再次下載了。對(duì)應(yīng)于我們選擇的版本組合,downloads目錄下的源碼包有: 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 整個(gè)編譯結(jié)束后,交叉編譯工具鏈將放在/opt/crosstool目錄下,因此腳本需要在/opt下建子目錄,如果不希望使用root權(quán)限運(yùn)行該腳本,則需要事先給/opt

8、目錄設(shè)置寫權(quán)限: $ sudo chmod a+w /opt然后修改arm.dat,其中有 TARGET=arm-unknown-linux-gnu這是按標(biāo)準(zhǔn)的命名規(guī)則為工具鏈命名的,但是通常我們都采用更簡(jiǎn)單的命名,很多軟件的Makefile叉編譯器默認(rèn)也都采用簡(jiǎn)單的命名,為此我們把它改為TARGET=arm-linux。 由于編譯過(guò)程需要用到patch、bison、flex,確認(rèn)你的系統(tǒng)中安裝了這些軟件包。 在編譯過(guò)程中可能還會(huì)遇到腳本的兼容性問(wèn)題,如果你的Linux發(fā)行版將sh指向dash(例如Ubuntu),應(yīng)將其改指向bash: $ cd /bin$ sudo ln -sf bash

9、sh雖然用dash執(zhí)行腳本時(shí)非常高效并且其實(shí)現(xiàn)完全遵守POSIX標(biāo)準(zhǔn),然而現(xiàn)存的很多腳本(比如glibc中的腳本)有不符合POSIX標(biāo)準(zhǔn)的用法,所以仍需改用bash執(zhí)行。 準(zhǔn)備就緒后,在crosstool-0.43目錄下運(yùn)行demo-arm.sh腳本開(kāi)始編譯。編譯完成后,交叉編譯工具鏈的可執(zhí)行文件位于/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin目錄,我們可以把這個(gè)路徑添加到PATH環(huán)境變量中,例如將以下命令添加到/.bashrc啟動(dòng)腳本: export PATH=$PATH:/opt/crosstool/gcc-4.0.2-glibc-2

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

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

12、,如下圖所示:上圖中,setenv ipaddr 2表示設(shè)置開(kāi)發(fā)板的IP地址為2。setenv netmask 表示設(shè)置子網(wǎng)掩碼為。setenv serverip 1表示設(shè)置與開(kāi)發(fā)板相連的PC機(jī)IP是1。可以根據(jù)你的情況重新設(shè)置。為了統(tǒng)一起見(jiàn),在后面的實(shí)驗(yàn)中,我們統(tǒng)一設(shè)置為: AKAE2440 # set ipaddr 00AKAE2440 # set serverip 1 (這一項(xiàng)應(yīng)該和你的主機(jī)IP一致)AKAE2440 # set netmask AKAE2440 # set gateway 1 (網(wǎng)關(guān)ip設(shè)置成什么無(wú)所謂,一般都設(shè)為主機(jī)ip)AKAE2440 # savesave將這些設(shè)

13、定寫入flash中,下次開(kāi)發(fā)板上電時(shí)仍然有效。如果不save則僅改變存中的參數(shù)值,reset后會(huì)恢復(fù)flash中原來(lái)的參數(shù)值。 設(shè)置完成后在開(kāi)發(fā)板上ping 主機(jī)的ip地址,檢查網(wǎng)絡(luò)是否正常,如下所示:AKAE2440 # ping 1host 1 is alive這表示主機(jī)能ping通,網(wǎng)絡(luò)正常。如果顯示如下:AKAE2440 # ping 1ping failed; host 1 is not alive.這就表示主機(jī)不能ping通,網(wǎng)絡(luò)異常,需要檢查你的網(wǎng)絡(luò)。還有一些常見(jiàn)的參數(shù):AKAE2440 # set bootdelay 3Bootdelay設(shè)為3,表示開(kāi)發(fā)板上電后等待3秒再啟動(dòng),

14、這3秒時(shí)間按任意鍵會(huì)進(jìn)入u-boot命令行狀態(tài),如下圖所示:另外,還有:AKAE2440 # set bootmode nfs或者AKAE2440 # set bootmode nandBootmode 可以設(shè)為nfs或者nand兩者之一,這個(gè)參數(shù)表明了u-boot啟動(dòng)時(shí),根文件系統(tǒng)在哪里尋找,如果是nand表示根文件系統(tǒng)保存在開(kāi)發(fā)板本身的flash某個(gè)分區(qū)中,要到flash上去找;如果是nfs則表示u-boot要去你的PC機(jī)的nfs服務(wù)的目錄(PC機(jī)硬盤上)去找。在開(kāi)發(fā)板bootloader輸入以下命令查看64M flash是如何分區(qū)的。 AKAE2440 # mtdpartsDevice

15、nand0 . # parts = 4#: name size offset mask_flags0: u-boot 0 x00100000 0 x00020000 01: kernel 0 x00200000 0 x00100000 02: ext2 0 x01000000 0 x00300000 03: temp 0 x02d00000 0 x01300000 0u-boot分區(qū)保存bootloader程序,Linux核保存在kernel分區(qū),根文件系統(tǒng)會(huì)保存到ext2分區(qū), temp分區(qū)本實(shí)驗(yàn)中沒(méi)有用到。 如果mtdparts命令未顯示上述圖樣,可能是flash未作分區(qū)操作,可以使用mt

16、dparts default命令來(lái)創(chuàng)建上述那樣的默認(rèn)分區(qū)。如下圖所示: 如果要保存新的分區(qū)表,使用命令save保存到flash中,否則reset后將恢復(fù)flash中原來(lái)的分區(qū)表。 下載文件到開(kāi)發(fā)板存中,需要通過(guò)tftp協(xié)議。開(kāi)發(fā)板是tftp客戶端,主機(jī)是tftp服務(wù)器。在配置好主機(jī)的tftp服務(wù)之后,主機(jī)上會(huì)有一個(gè)tftp服務(wù)的主目錄/tftproot,我們把要下載到開(kāi)發(fā)板上的文件都先拷貝到這個(gè)目錄中,之后才能下載。tftp命令的格式為 tftp 文件名。注意我們都是把核zImage文件下載到0 x30008000地址上,把根文件系統(tǒng)img文件下載到0 x30800000地址上。當(dāng)我們用命令t

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

18、0 ext2 0 x1000000命令把它燒寫到flash的ext2分區(qū)中去,當(dāng)然,在燒寫之前也要先使用 nand erase ext2擦除掉flash的ext2分區(qū),否則燒寫后讀出數(shù)據(jù)會(huì)失敗。如下圖所示:注意:如果發(fā)現(xiàn)tftp服務(wù)配置是正確的,但是有些文件不能夠下載,則很有可能是文件權(quán)限的問(wèn)題??梢允褂胹udo chmod 777 zImage rootfs.cramfs這樣的命令來(lái)更改文件訪問(wèn)權(quán)限?,F(xiàn)在,核和cramfs根文件系統(tǒng)都燒寫到flash上去了,只要設(shè)置好正確的核啟動(dòng)參數(shù)就可以啟動(dòng)開(kāi)發(fā)板了。AKAE2440 # set bootcmd nand read 0 x30008000

19、kernel 0 x200000; myboot 0 x30008000AKAE2440 # set bootargs noinitrd console=ttySAC0,115200AKAE2440 # set bootmode nandAKAE2440 # set init /linuxrc AKAE2440 # set root /dev/mtdblock2AKAE2440 # savebootcmd參數(shù)表示u-boot上電后會(huì)自動(dòng)執(zhí)行的命令,第一條nand read 0 x30008000 kernel 0 x200000表示從flash上kernel分區(qū)去讀取Linux核到開(kāi)發(fā)板存地址

20、0 x30008000處,大小為0 x200000字節(jié);第二條命令是myboot 0 x30008000表示跳轉(zhuǎn)到地址0 x30008000去啟動(dòng)Linux核。這兩條命令要用分號(hào)“;”隔開(kāi),但是設(shè)置bootcmd參數(shù)時(shí)設(shè)置給它的是一個(gè)字符串,所以分號(hào)要用轉(zhuǎn)義字符“;”代替。bootargs就是我們常說(shuō)的Linux核的啟動(dòng)命令行參數(shù)(Linux_cmd_line)。U-boot通過(guò)這個(gè)參數(shù)告知核一些關(guān)鍵的啟動(dòng)參數(shù)。實(shí)際上,在Uboot中,最后的完整的啟動(dòng)命令行參數(shù)是由前面設(shè)置那些一個(gè)一個(gè)的小項(xiàng)組合而成的。真正完整的命令行參數(shù)是:noinitrd console=ttySAC0,115200 in

21、it=/linuxrc cs89x0_media=rj45 root=/dev/mtdblock2 mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp) ip=00:1:1:eth0:off noinitrd表示核啟動(dòng)時(shí)不需要初始化一個(gè)存磁盤ramdisk;而root=/dev/mtdblock2表示根文件系統(tǒng)在flash的編號(hào)為2的分區(qū)上(從0開(kāi)始編號(hào)的,所以是第三個(gè)分區(qū),回憶前面的u-boot的分區(qū)信息,flash上分區(qū)依次是u-boot,kernel,ext2,temp,我們的根文件系統(tǒng)就在第三個(gè)分區(qū)ext2上)

22、;console=ttySAC0, 115200表示打開(kāi)一個(gè)串行終端ttySAC0,它是通過(guò)串口1工作的,波特率為115200;init=/linuxrc表示核啟動(dòng)好后第一個(gè)執(zhí)行的應(yīng)用程序是/linuxrc,根目錄下的linuxrc;mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp)表示u-boot傳遞給核的分區(qū)信息。我們?cè)谶x擇使用nfs根文件系統(tǒng)還是cramfs根文件系統(tǒng)的時(shí)候,bootargs、bootcmd和init參數(shù)基本都一樣,不用改變,需要改變的是bootmode參數(shù),由bootmode參數(shù)的設(shè)置決定去選

23、擇root參數(shù)(描述cramfs根文件系統(tǒng)所在位置)還是nfsroot參數(shù)(描述nfs根文件系統(tǒng)所在位置),即bootmode為nand時(shí)選擇root參數(shù),bootmode為nfs時(shí)選擇nfsroot參數(shù)。在啟動(dòng)進(jìn)入到Linux系統(tǒng)后,可以通過(guò)在命令行終端鍵入如下命令來(lái)查看命令行參數(shù):$cat /proc/cmdline現(xiàn)在啟動(dòng)。 AKAE2440 # reset這時(shí)屏幕上出現(xiàn)很多核啟動(dòng)信息,之后提示登錄,輸入root即可登錄。 (none) login: root現(xiàn)在可以試試各種Linux基本命令。注意cramfs是只讀文件系統(tǒng),在開(kāi)發(fā)板上運(yùn)行時(shí)不能改動(dòng)里面的文件。 有些時(shí)候我們可能會(huì)嘗試配

24、置不同的核選項(xiàng),會(huì)得到不同的幾個(gè)核zImage文件,這樣都燒寫到flash上再reset啟動(dòng)太浪費(fèi)時(shí)間,可以用tftp把核zImage加載到存0 x30008000地址上,不燒寫,直接用myboot 0 x30008000去啟動(dòng)存上的核。如下圖示:3.2 將自己定制的根文件系統(tǒng)下載到開(kāi)發(fā)板運(yùn)行“根文件系統(tǒng)”是一種不嚴(yán)格的說(shuō)法,其實(shí)是指文件系統(tǒng)中的文件和目錄,這些文件和目錄構(gòu)成了一個(gè)Linux系統(tǒng)運(yùn)行所需的基本框架。ftp上的rootfs-basic.tar是根文件系統(tǒng)的打包,由于包含設(shè)備文件,需要root權(quán)限才能解包: $ sudo tar xf rootfs-basic.tar解包后可以根據(jù)

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

26、機(jī)上修改根文件系統(tǒng)中的文件立刻在開(kāi)發(fā)板的系統(tǒng)上生效,在開(kāi)發(fā)過(guò)程中十分便利。 首先在主機(jī)上安裝和配置NFS服務(wù),確認(rèn)你的主機(jī)安裝了nfs-kernel-server軟件包。然后修改配置文件/etc/exports,添加下面一行(注意*號(hào)后面緊跟左括號(hào),無(wú)空格,每個(gè)逗號(hào)后面也不能有空格): /home/akaedu/rootfs *(rw,sync,no_root_squash)這表示我們把上一節(jié)過(guò)解壓rootfs-basic.tar得到的/home/akaedu/rootfs/目錄設(shè)置為nfs服務(wù)目錄。更改配置后需要重啟NFS服務(wù): $ sudo /etc/init.d/nfs-kernel-s

27、erver restart用rpcinfo -p命令看一下portmapper和nfs服務(wù)是否正常啟動(dòng)了,用exportfs命令看一下導(dǎo)出目錄的設(shè)置是否正確。 進(jìn)入開(kāi)發(fā)板的bootloader,修改核啟動(dòng)參數(shù): AKAE2440 # set bootcmd nand read 0 x30008000 kernel 0 x200000; myboot 0 x30008000AKAE2440 # set bootargs noinitrd console=ttySAC0,115200AKAE2440 # set init /linuxrc AKAE2440 # set nfsroot /home/

28、akaedu/rootfsAKAE2440 # set bootmode nfsAKAE2440 # saveAKAE2440 # reset真正完整的核啟動(dòng)命令行參數(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ù)很長(zhǎng),而minicom提供的終端卻不能自動(dòng)換行,一行寫不下的

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

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

31、_eraseall /dev/mtd2Erasing 16 Kibyte 6b8000 - 10 % complete.Skipping bad block at 0 x006bc000Erasing 16 Kibyte 3dfc000 - 99 % complete.# mount -t yaffs /dev/mtdblock2 /mntyaffs: dev is 32505859 name is mtdblock2yaffs: Attempting MTD mount on 31.3, mtdblock2block 432 is bad# ls /mntlost+foundflash_er

32、aseall命令是從mtd項(xiàng)目( ./ )的源代碼叉編譯得來(lái)的。 現(xiàn)在可以把根文件系統(tǒng)中的所有文件拷貝到Flash分區(qū)。以下命令在開(kāi)發(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# mknod /mnt/dev/null -m 666 c 1 3# umount mnt# reboot注意:像/proc、/sys這樣正mount

33、著特殊文件系統(tǒng)的目錄和/dev目錄下的設(shè)備文件一定不可以用cp命令拷貝。/mnt目錄顯然也不能拷貝。這些目錄和設(shè)備文件需要手動(dòng)創(chuàng)建。 重啟目標(biāo)系統(tǒng)之后進(jìn)入U(xiǎn)-boot,修改核啟動(dòng)參數(shù)使之從ext2分區(qū)啟動(dòng)即可(如果下次還用NFS啟動(dòng),這里就不save了): AKAE2440 # set bootmode nandAKAE2440 # set root /dev/mtdblock2AKAE2440 # set bootargs noinitrd rootfstype=yaffs rw console=ttySAC0,115200AKAE2440 # saveAKAE2440 # reset現(xiàn)在試

34、試能不能修改Flash根文件系統(tǒng)中的文件。 4.編譯核將核釋放到/linux-2.6.27目錄下 $ tar xf linux-2.6.27.tar.bz2進(jìn)入核目錄: $ cd linux-2.6.27(本開(kāi)發(fā)板不用修改makefile,打補(bǔ)丁時(shí)就會(huì)自動(dòng)修改)首先修改Makefile,找到 ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改為 ARCH ?= armCROSS_COMPILE ?= arm-linux-注意ARCH ?=arm后面不能有空格,要確??崭褚褎h除干凈,并且不要漏了arm-linux-末尾的“-”。下面對(duì)核打patch(注意打patch不要重復(fù)打

35、): /linux-2.6.27$ patch -p1 Pseudo filesystems - /proc file system support; Sysctl support (/proc/sys); sysfs file system support 和Virtual memory file system support (former shm fs); Tmpfs POSIX Access control Lists。 /proc file system(或者叫procfs)是核提供給用戶程序的接口,很多Linux程序都需要在procfs中讀寫數(shù)據(jù),比如busybox,因此這個(gè)選項(xiàng)一

36、般是不能少的。Virtual memory file system(或者叫tmpfs)用于存虛擬磁盤,后面我們?cè)谧龈募到y(tǒng)時(shí)要mount一個(gè)tmpfs到/dev目錄下。 3、不需要改變Boot options - Default kernel command string,因?yàn)閎ootloader中的核啟動(dòng)參數(shù)會(huì)取代這里的設(shè)置。 4、選中Device Drivers - Network device support - Ethernet (10 or 100Mbit) - CS8900A support,添加對(duì)網(wǎng)卡芯片的支持。在File systems - Network File Syst

37、ems菜單中選上NFS client support;NFS client support for NFS version3;NFS client support for the NFSv3 ACL protocol extension和Root file system on NFS。 5、選中Device Drivers - Memory Technology Devices (MTD) - MTD partitioning support,在Device Drivers - Memory Technology Devices (MTD),選中NAND Device Support和它下面的

38、NAND Flash support for S3C2410/S3C2440 SoC; S3C2410 NAND driver debug,不要選擇S3C2410 NAND Hardware ECC,因?yàn)镾3C2410硬件生成ECC碼的算法和我們所需要的不一致。 6、在File systems - Miscellaneous filesystems中選中YAFFS2 file system support; Auto select yaffs2 format; cache short names in RAM, 再選上Compressed ROM file system support (cr

39、amfs)。 7、在Device Drivers - Graphics support中選中Support for frame buffer devices, 再選中它下面的Enable firmware EDID; Enable video Mode Handling Helpers; S3C2410 LCD framebuffer support,不選擇Virtual Frame Buffer support因?yàn)樗且粋€(gè)用于調(diào)試的虛擬設(shè)備驅(qū)動(dòng)而不是實(shí)際硬件的驅(qū)動(dòng)。如果還選中了Bootup Logo,那么在核啟動(dòng)過(guò)程中初始化framebuffer時(shí)會(huì)在屏幕上看到Linux的企鵝logo,這是

40、測(cè)試framebuffer驅(qū)動(dòng)是否正常工作最直接的方法。Bootup Logo有三種規(guī)格,我們的開(kāi)發(fā)板支持VGA輸出,可以選擇224色的漂亮logo。 8、在 Device Drivers - USB support中選中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 D

41、rivers -Real time clock - Set system time from RTC on startup and resume; /sys/class/rtc/rtcN (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命令編譯

42、核,這個(gè)過(guò)程需要較長(zhǎng)時(shí)間,編譯好的核位于/linux-2.6.27/arch/arm/boot/zImage?,F(xiàn)在將自己編譯的核下載到開(kāi)發(fā)板,看系統(tǒng)能不能正常啟動(dòng)。 5.制作根文件系統(tǒng)5.1 根文件系統(tǒng)框架和busybox首先用mkdir手動(dòng)創(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|

43、- tmp|- usr| |- bin| |- lib| - sbin- var - run/bin /sbin /usr/bin /usr/sbin系統(tǒng)的基本命令,系統(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共享庫(kù),也是分為系統(tǒng)關(guān)鍵組件的共享庫(kù)和其它應(yīng)用程序的共享庫(kù) /procproc文件系統(tǒng)的掛載點(diǎn) /syssys文件

44、系統(tǒng)的掛載點(diǎn) /dev設(shè)備文件 /etc配置文件、啟動(dòng)腳本 /var運(yùn)行時(shí)產(chǎn)生的記錄文件、鎖文件、日志文件 /tmp運(yùn)行時(shí)產(chǎn)生的臨時(shí)文件 /mnt一般用作掛載點(diǎn) /opt一般存放第三方軟件 /srv一般用作Web服務(wù)、ftp服務(wù)的服務(wù)目錄 接下來(lái)安裝busybox到根文件系統(tǒng)中。busybox是專為嵌入式Linux設(shè)計(jì)的,它把大多數(shù)常用命令(如ls、cp、tar等等)的常用選項(xiàng)剪裁出來(lái)拼在一起。在根文件系統(tǒng)中只有一個(gè)可執(zhí)行文件就是/bin/busybox,而其它的命令都創(chuàng)建為/bin/busybox的文件,busybox 通過(guò)命令行第0個(gè)參數(shù)(也就是命令名)判斷應(yīng)該執(zhí)行哪個(gè)命令。這樣使得嵌入式

45、Linux系統(tǒng)有完整的命令集卻占用很小的存儲(chǔ)空間。 首先從官方 ./ 下載源碼包busybox-1.9.1.tar.bz2并解包到主目錄下。 $ tar xf busybox-1.9.1.tar.bz2; cd busybox-1.9.1/busybox的配置系統(tǒng)和核源代碼很相似,因此配置方法也和核相似,首先修改Makefile,找到 ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改為 ARCH ?= armCROSS_COMPILE ?= arm-linux-然后我們以一個(gè)缺省配置為起點(diǎn)來(lái)做進(jìn)一步的配置: /busybox-1.9.1$ make defconfig/b

46、usybox-1.9.1$ make menuconfig在菜單中做如下配置: 選擇BusyBox Settings - Installation Options - BusyBox installation prefix,設(shè)置為/home/akaedu/rootfs,編譯后將安裝到這個(gè)目錄下。 根據(jù)需要裁剪各命令。但是Shells - Choose your default shell選項(xiàng)一定要保留一個(gè)默認(rèn)shell(例如ash),如果沒(méi)有默認(rèn)shell,將不會(huì)創(chuàng)建/bin/sh這個(gè),而一般的shell腳本都是以#!/bin/sh開(kāi)頭的,如果找不到/bin/sh就不能執(zhí)行。 然后編譯和安裝b

47、usybox: /busybox-1.9.1$ make/busybox-1.9.1$ make installbusybox文件和一系列的文件將安裝到/home/akaedu/rootfs下。busybox文件位于根文件系統(tǒng)的/bin目錄,其它文件位于/bin、/sbin、/usr/bin、/usr/sbin目錄,有一個(gè)文件linuxrc位于根文件系統(tǒng)的根目錄/,它是系統(tǒng)的啟動(dòng)程序,bootloader中核的啟動(dòng)參數(shù)有init=/linuxrc,也就是說(shuō)核啟動(dòng)后首先執(zhí)行/linuxrc(也是busybox的一個(gè)符號(hào))。linuxrc負(fù)責(zé)完成系統(tǒng)的初始化工作: 設(shè)置信號(hào)處理程序 初始化cons

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

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

50、in/shmount -a注意這個(gè)腳本需要加可執(zhí)行權(quán)限:chmod +x rcS。這個(gè)腳本做了一件事情,根據(jù)/etc/fstab配置文件提供的信息mount一些文件系統(tǒng),我們創(chuàng)建這個(gè)配置文件/rootfs/etc/fstab: # proc /proc proc defaults 0 0sys /sys sysfs defaults 0 0/proc和/sys都是pseudo文件系統(tǒng),它們并不在磁盤或flash上存儲(chǔ)任何數(shù)據(jù),雖然看起來(lái)/proc和/sys目錄下有很多文件,但這些文件都是核導(dǎo)出的接口,對(duì)這些文件進(jìn)行讀寫會(huì)讀寫到核中的一些運(yùn)行時(shí)參數(shù),而不會(huì)讀寫到磁盤。/proc文件系統(tǒng)是busy

51、box中的許多程序所需要的接口,/sys文件系統(tǒng)則是后面要講的mdev所需要的接口。 mount完文件系統(tǒng)后,rcS執(zhí)行結(jié)束。下面將執(zhí)行inittab文件中類型為respawn的命令,也就是 /sbin/getty 115200 s3c2410_serial0我們的PC在啟動(dòng)時(shí)執(zhí)行g(shù)etty打開(kāi)幾個(gè)虛終端,例如/dev/tty1/dev/tty6,嵌入式開(kāi)發(fā)板也是用getty打開(kāi)虛終端,這個(gè)虛終端對(duì)應(yīng)的是串口,因此需要訪問(wèn)串口的設(shè)備文件/dev/s3c2410_serial0,以上命令還指定了波特率為115200?,F(xiàn)在我們創(chuàng)建這個(gè)設(shè)備文件: $ cd rootfs/dev; sudo mkno

52、d -m 600 s3c2410_serial0 c 204 64這個(gè)設(shè)備號(hào)在核代碼的Documentation/arm/Samsung-S3C24XX/Overview.txt中可以查到,在核代碼中,S3C2410的第一個(gè)串口表示為ttySAC0,但是后面介紹的mdev程序?qū)⑹褂胹3c2410_serial0這個(gè)名字,因此這里把文件名指定為s3c2410_serial0。 系統(tǒng)啟動(dòng)打開(kāi)虛終端后會(huì)提示輸入用戶名和密碼然后才啟動(dòng)shell,我們需要?jiǎng)?chuàng)建文件passwd和group。/rootfs/etc/passwd文件容為: root:0:0:root:/:/bin/sh/rootfs/etc

53、/group文件容為: root:0:這樣就創(chuàng)建了一個(gè)root,沒(méi)有密碼。如果需要密碼,可以把主機(jī)上的/etc/shadow文件中root的那一行放到開(kāi)發(fā)板的根文件系統(tǒng)中。 5.2 glibc由于busybox需要glibc共享庫(kù)的支持,下面的步驟將在根文件系統(tǒng)中安裝glibc。在此之前首先解釋一下應(yīng)用程序如何找到所需的共享庫(kù)。通過(guò)ld命令的參數(shù)-rpath可以在時(shí)將共享庫(kù)的路徑記在應(yīng)用程序中,但是通常不推薦這樣做,通常應(yīng)用程序中只記錄共享庫(kù)的文件名(稍后提到的soname),啟動(dòng)程序時(shí)由動(dòng)態(tài)器/lib/ld-linux.so根據(jù)以下規(guī)則查找共享庫(kù)(摘自ld.so(8)): 首先在環(huán)境變量LD

54、_LIBRARY_PATH所記錄的路徑中查找 然后從緩存文件/etc/ld.so.cache中查找。將共享庫(kù)的路徑寫進(jìn)/etc/ld.so.conf然后執(zhí)行l(wèi)dconfig命令就可以生成緩存文件/etc/ld.so.cache 如果上述步驟都找不到,則到默認(rèn)的系統(tǒng)路徑中查找,先是/usr/lib然后是/lib 注意,LD_LIBRARY_PATH是不推薦使用的,盡量不要把它設(shè)定為環(huán)境變量,詳細(xì)解釋參見(jiàn)Why LD_LIBRARY_PATH is bad( .visi./barr/ldpath.html )。 每個(gè)共享庫(kù)有三個(gè)文件名:real name、soname、linker name。re

55、al name是庫(kù)文件的名字,包含完整的共享庫(kù)版本號(hào);soname是庫(kù)文件的一個(gè)符號(hào)的名字,只包含主版本號(hào),主版本號(hào)一致即可保證庫(kù)函數(shù)的接口一致,因此應(yīng)用程序只需確認(rèn)soname與所需的共享庫(kù)一致;linker name僅由器使用,有的是庫(kù)文件的一個(gè)符號(hào)的名字,有的是一段腳本的名字。庫(kù)文件的文件頭記錄了soname,因此ldconfig命令可以讀取文件頭生成相應(yīng)的符號(hào)文件。綜上,ldconfig命令讀取ld.so.conf后做兩件事,一是創(chuàng)建適當(dāng)?shù)膕oname,二是生成ld.so.cache,包含共享庫(kù)的軟件包在安裝過(guò)程中都會(huì)執(zhí)行一下ldconfig命令。下面以libc為例說(shuō)明共享庫(kù)的三個(gè)文件

56、名: -rwxr-xr-x 1 akaedu akaedu 1387379 2008-03-16 11:34 libc-2.3.6.solrwxrwxrwx 1 akaedu akaedu 13 2008-03-16 11:06 libc.so.6 - libc-2.3.6.so-rw-r-r- 1 akaedu akaedu 195 2008-03-16 11:10 libc.so$ cat libc.so/* GNU ld script Use the shared library, but some functions are only in the static library, so

57、 try that secondarily. */OUTPUT_FORMAT(elf32-littlearm)GROUP ( libc.so.6 libc_nonshared.a )在我們先前制作交叉編譯工具鏈時(shí)已經(jīng)交叉編譯了glibc,位于/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/arm-linux/lib目錄下,我們把這些共享庫(kù)拷到根文件系統(tǒng)/rootfs/lib目錄下: $ cd /opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/arm-linux/lib; cp -dp * /home/ak

58、aedu/rootfs/lib/然后到/rootfs/lib目錄下刪掉所有靜態(tài)庫(kù)和一些不常用的庫(kù),剩下這些庫(kù)文件: /rootfs/lib$ lsld-2.3.6.so libm.so.6 libpcprofile.sold-linux.so.2 libnsl-2.3.6.so libpthread-0.10.solibanl-2.3.6.so libnsl.so libpthread.solibanl.so libnsl.so.1 libpthread.so.0libanl.so.1 libnss_compat-2.3.6.so libresolv-2.3.6.solibBrokenLoca

59、le-2.3.6.so libnss_compat.so libresolv.solibBrokenLocale.so libnss_compat.so.2 libresolv.so.2libBrokenLocale.so.1 libnss_dns-2.3.6.so librt-2.3.6.solibc-2.3.6.so libnss_dns.so librt.solibcrypt-2.3.6.so libnss_dns.so.2 librt.so.1libcrypt.so libnss_files-2.3.6.so libSegFault.solibcrypt.so.1 libnss_fil

60、es.so libstdc+.solibc.so libnss_files.so.2 libstdc+.so.6libc.so.6 libnss_hesiod-2.3.6.so libstdc+.so.6.0.6libdl-2.3.6.so libnss_hesiod.so libthread_db-1.0.solibdl.so libnss_hesiod.so.2 libthread_db.solibdl.so.2 libnss_nis-2.3.6.so libthread_db.so.1libgcc_s.so libnss_nisplus-2.3.6.so libutil-2.3.6.so

溫馨提示

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

評(píng)論

0/150

提交評(píng)論