按常規(guī)編譯完成后應(yīng)該生成image.bin linux linux.data linux.text romfs.img這5個(gè)文件,不過(guò)我只有l(wèi)inux/boot.rom(=romfs.img),今天上網(wǎng)查了查它們的定義。 romfs.img:這個(gè)文件是通過(guò)tools/romfs-inst.sh腳本,生成romfs目錄及其下面的文 件,然后通過(guò)genromfs程序打包成一個(gè)文件romfs.img。romfs.img既可以放在Flash中,也可以放在RAM中,但需要在編譯內(nèi)核 時(shí)在driver/block/blkmem.c里指定地址,以便內(nèi)核找到。 linux.text:編譯后的內(nèi)核中text段,一般放在Flash中,只讀。 linux.data:編譯后的內(nèi)核中data、init段,一般放在SDRAM中,讀寫(xiě)。 image.rom:通常image.rom的文件大小要比image.ram小很多,這是因?yàn)閕mage.rom是 一個(gè)壓縮過(guò)的內(nèi)核,前面加上一個(gè)小的解壓程序負(fù)責(zé)把內(nèi)核解壓后搬到指定位置。這個(gè)文件可以直接燒進(jìn)Flash中,當(dāng)然也可以在RAM中運(yùn)行。這個(gè)文件實(shí)際 上就是通常Linux生成的zImage文件。 image.ram:這個(gè)內(nèi)核沒(méi)有壓縮過(guò),而且必須在RAM里運(yùn)行。所以需要通過(guò)板子上的Bootloader將它下 載到指定位置后開(kāi)始執(zhí)行。相對(duì)image.rom而言,從RAM里啟動(dòng)內(nèi)核,則代碼段和數(shù)據(jù)段都在RAM里面。這個(gè)文件是編譯生成的ELF格式的 Linux內(nèi)核,通過(guò)arm-elf-objcopy工具生成的二進(jìn)制映像文件。可以這樣形象的說(shuō):image.rom = gunzipprogram + gzipped(image.ram)。 boot.rom:其實(shí)就是uClinux編譯完成后的文件images/romfs.img,可以看一下它就是一個(gè)連接。 image.bin:上面三個(gè)文件順序連接而生成的,image.bin = linux.text + linux.data + romfs.img。 1.創(chuàng)建開(kāi)發(fā)環(huán)境 首先需要編譯的環(huán)境。建議最好使用Linux 作為開(kāi)發(fā)平臺(tái),因?yàn)長(zhǎng)inux 以及uClinux 的開(kāi)發(fā)者們基本都是在Linux 下完成的開(kāi)發(fā)。為了能夠編譯uClinux,我們需要下載uClinux 的編譯器。這個(gè)文件可以在uClinux 的官方網(wǎng)站得到,也可以在論壇的客服中心下載。 官方的下載地址是: http://www.uclinux.org/pub/uClinux/arm-elf-tools/arm-elf-tools-20040427.sh 雖然同為gcc 和binutils 工具,但是必須使用uClinux 發(fā)布的版本,因?yàn)檫@個(gè)gcc 和binutils 都是為了能夠編譯FLAT 格式的文件而訂制的,另外也加入了ARM 對(duì)PIC(Position Independent Code,位置無(wú)關(guān)代碼)的支持。PIC 的支持是用來(lái)編譯動(dòng)態(tài)庫(kù)或者XIP 模式的可執(zhí)行文件。關(guān)于XIP 的介紹有一篇文章:http://www.ucdot.org/article.pl?sid=02/08/28/0434210 大家可以了解一下XIP。但是由于XIP 并不是很穩(wěn)定,所以在我們發(fā)布的uClinux 版本中并沒(méi)有使用這個(gè)技術(shù)。然后,將下載得到的文件,是一個(gè)sh 文件。這是一個(gè)自解壓的文件(就好比Windows下面的自解壓zip 或者rar 一樣)。為了能夠運(yùn)行,我們需要: ./arm-elf-tools-20040427.sh 這樣如果不能運(yùn)行的話,那應(yīng)該使用下面的命令: chmod u+x arm-elf-tools-20040427.sh(使之可執(zhí)行) ./arm-elf-tools-20040427.sh 得到了編譯環(huán)境,就可以編譯源代碼了。當(dāng)然,首先要把代碼解壓縮到你的目錄下面: tar xjvf uClinux-dist-20060803.tar.bz2 它會(huì)把全部的文件解壓縮到uClinux-dist 的目錄下。然后進(jìn)入目錄 cd uClinux-dist 2.編譯uClinux 對(duì)uClinux 進(jìn)行配置。那是通過(guò)make menuconfig 或者make xconfig 來(lái)實(shí)現(xiàn)的。對(duì)于編譯uClinux,不能簡(jiǎn)單地通過(guò)make 來(lái)實(shí)現(xiàn)。我們需要有一些特定的步驟才能保證編譯的正確。這是因?yàn)閡Clinux 所需要支持的硬件平臺(tái)太多了,不能考慮的很周到。為了編譯最后得到的鏡像文件,我們需要linux 的內(nèi)核以及romfs。對(duì)于GDB/ARMulator的移植來(lái)說(shuō),romfs 是被編譯到內(nèi)核里面去的。因此,在編譯內(nèi)核前需要一個(gè)romfs。為了得到romfs 的image,我們又需要編譯用戶的應(yīng)用程序。而為了編譯用戶的應(yīng)用程序,我們又需要編譯C 運(yùn)行庫(kù),這里我們用的C 運(yùn)行庫(kù)是uClibc。根據(jù)上面的分析,我們編譯uClinux 的步驟如下:make dep 這個(gè)僅僅是在第一次編譯的時(shí)候需要,以后就不用了,為的是在編譯的時(shí)候知道文件之間的依賴關(guān)系,在進(jìn)行了多次得編譯后,make 會(huì)根據(jù)這個(gè)依賴關(guān)系來(lái)確定哪些文件需要重新編譯、哪些文件可以跳過(guò))。 make lib_only 編譯uClibc。以后我們編譯用戶程序的時(shí)候需要這個(gè)運(yùn)行庫(kù),在運(yùn)行這步時(shí),采用uC-libc出錯(cuò),但發(fā)現(xiàn)有些人卻用的是這個(gè),沒(méi)問(wèn)題,不知為何。 make user_only 編譯用戶的應(yīng)用程序,包括初始化進(jìn)程init,和用戶交互的bash,以及集成了很多程序的busybox(這樣對(duì)一個(gè)嵌入式系統(tǒng)來(lái)說(shuō)可以減少存放的空間,因?yàn)椴煌某绦蚬灿昧艘惶證 運(yùn)行庫(kù)),還有一些服務(wù),如boa(一個(gè)在嵌入式領(lǐng)域用的很多的Web 服務(wù)器)和telnetd(telnet 服務(wù)器,我們可以通過(guò)網(wǎng)絡(luò)來(lái)登錄我們的uClinux 而不一定使用串口)。 make romfs(容易出錯(cuò),見(jiàn)UC移植) 在用戶程序編譯結(jié)束后,因?yàn)槲覀冇玫降氖莚omfs(一種輕量的、只讀的文件系統(tǒng))作為uClinux 的根文件系統(tǒng),所以首先需要把上一步編譯的很多應(yīng)用程序以u(píng)Clinux 所需要的目錄格式存放起來(lái)。原來(lái)的程序是分散在user 目錄下,現(xiàn)在例如可執(zhí)行文件需要放到bin目錄、配置文件放在etc 目錄下..這些事就是make romfs 所做的。它會(huì)在uClinux 的目錄下生成一個(gè)romfs 目錄并且把user 目錄下的文件、以及vendors 目錄下特定系統(tǒng)所需要的文件(我們的vendors 目錄是vendors/ARMlator/ARMulator組織起來(lái),以便下面生成romfs 的單個(gè)鏡像所用。 make image(容易出錯(cuò)) 它的作用有2 個(gè),一個(gè)是生成romfs 的鏡像文件,另一個(gè)是生成Linux 的鏡像。因?yàn)樵瓉?lái)的Linux 編譯出來(lái)是elf 格式的,不能直接用于下載或者編譯(不過(guò)那個(gè)文件也是需要的,因?yàn)槿绻阈枰?,那個(gè)elf 格式的內(nèi)核文件里面可以包含調(diào)試的信息)。因此在這個(gè)時(shí)候由于還沒(méi)有編譯過(guò)Linux,因此在執(zhí)行這一步的時(shí)候會(huì)報(bào)錯(cuò)。但是沒(méi)有關(guān)系,因?yàn)槲覀冊(cè)谶@里需要的僅僅是romfs 的鏡像,以便在下面編譯Linxu 內(nèi)核的時(shí)候使用。 make linux (可能會(huì)出現(xiàn)error:cannot open romfs.o,其實(shí)這個(gè)文件已經(jīng)有了,在linux-2.4.x/romfs/下,copy到uC下就可以了) 有了romfs 的鏡像我們就可以編譯Linux 了。因?yàn)槲覀兊膔omfs 是嵌入到linux 內(nèi)核中去了,所以在編譯Linux 內(nèi)核的時(shí)候就要一個(gè)romfs.o 文件。這個(gè)文件是由上面的make image生成的。 make image (可能images/下只有一個(gè)boot.rom,我就是,其實(shí)這個(gè)文件就是romfs.img啦,鏈接一下,ln -s boot.rom romfs.img) 這里再一次make image 就是為了得到uClinux 的可執(zhí)行文件的鏡像了。執(zhí)行了這一步之后,就會(huì)在images 目錄下找到3 個(gè)文件:image.ram,image.rom,romfs.img。其中,image.ram和image.rom 就是我們需要的鏡像文件。這個(gè)在下面“使用uClinux”會(huì)提到。為了方便起見(jiàn),在uClinux-dist 目錄下有兩個(gè)文件:build_first.sh 和build_final.sh 先執(zhí)行build_first.sh 再執(zhí)行build_final.sh 就可以得到所需的鏡像文件。之所以沒(méi)有把兩個(gè)合并,是因?yàn)榈谝淮问褂胢ake image 會(huì)出錯(cuò)。 3.使用uClinux 上面我們提到了兩個(gè)文件:image.ram 和image.rom。其中,image.ram 是直接下載到RAM 執(zhí)行的文件。如果你還處于調(diào)試階段,那么就沒(méi)有必要把文件燒寫(xiě)到FLASH 里面。這個(gè)時(shí)候我們可以使用image.ram。在開(kāi)發(fā)板運(yùn)行BIOS 的情況下,使用: netrun 將文件下載到RAM 并且自動(dòng)執(zhí)行。具體可以參考BIOS 的教程。 對(duì)于image.rom 來(lái)說(shuō),它是一個(gè)zImage 文件,也就是自解壓的內(nèi)核。由于它使用了gzip將內(nèi)核壓縮過(guò),所以可以減小文件的大小。這個(gè)image 應(yīng)該燒寫(xiě)到FLASH 的0x10000 的位置,而不能直接下載到RAM 并執(zhí)行。在開(kāi)發(fā)板運(yùn)行了uClinux 之后,我們可以通過(guò)串口看到很多輸出,但是最后可以看到 Welcome to ____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_| Execution Finished, Exiting Sash command shell (version 1.1.1) /> 這樣就表明你的uClinux 正常啟動(dòng)了。這時(shí)候可以輸入一些命令,例如: /> ls -l drwxr-xr-x 1 0 0 32 Jan 1 00:00 bin drwxr-xr-x 1 0 0 32 Jan 1 00:00 dev drwxr-xr-x 1 0 0 32 Jan 1 00:00 etc drwxr-xr-x 1 0 0 32 Jan 1 00:00 home drwxr-xr-x 1 0 0 32 Jan 1 00:00 lib drwxr-xr-x 1 0 0 32 Jan 1 00:00 mnt dr-xr-xr-x 16 0 0 0 Jan 1 00:00 proc lrwxrwxrwx 1 0 0 97 Jan 1 00:00 sbin -> /bin lrwxrwxrwx 1 0 0 105 Jan 1 00:00 tmp -> /var/tmp drwxr-xr-x 1 0 0 32 Jan 1 00:00 usr drwxr-xr-x 8 0 0 1024 Jan 1 00:00 var /> ls 命令可以列出當(dāng)前目錄下的文件,-l 參數(shù)可以列出更詳細(xì)的信息。 /> cat /proc/meminfo total: used: free: shared: buffers: cached: Mem: 14630912 2199552 12431360 0 499712 507904 Swap: 0 0 0 MemTotal: 14288 kB MemFree: 12140 kB MemShared: 0 kB Buffers: 488 kB Cached: 496 kB SwapCached: 0 kB Active: 744 kB Inactive: 240 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 14288 kB LowFree: 12140 kB SwapTotal: 0 kB SwapFree: 0 kB /> cat 可以將一個(gè)文件顯示出來(lái),這里的/proc/meminfo 表示內(nèi)存的信息。您還可以看看 proc 目錄下有些什么文件并且把他們顯示出來(lái)看看 /> ps PID PORT STAT SIZE SHARED %CPU COMMAND 1 S 134K 0K 0.1 init 2 S 0K 0K 0.0 keventd 3 S 0K 0K 0.0 ksoftirqd_CPU0 4 S 0K 0K 0.0 kswapd 5 S 0K 0K 0.0 bdflush 6 S 0K 0K 0.0 kupdated 15 S0 R 136K 0K 0.0 /bin/sh 16 S 70K 0K 0.0 /bin/inetd 17 S 264K 0K 0.0 /bin/boa /> ps 命令列出當(dāng)前的進(jìn)程的情況 在上面ps 的輸出結(jié)果我們可以但到里面有boa,這就是我們的Web 服務(wù)器。另外,telnetd 是通過(guò)inetd 來(lái)啟動(dòng)的。 先來(lái)看一下boa。我們?cè)谥鳈C(jī)的瀏覽器輸入http://192.168.111.100 就應(yīng)該看見(jiàn)一個(gè)默認(rèn)的頁(yè)面: 然后我們也可以通過(guò)telnet 來(lái)訪問(wèn)我們的uClinux 機(jī)器: 在主機(jī)使用Telnet 工具登錄到uClinux(IP 地址上面有了,是192.168.111.100) 它會(huì)要你登錄,選擇用戶名root,密碼為空,就可以進(jìn)去了。 就如下圖所示: 如果這時(shí)候用ps 查看的話,就會(huì)發(fā)現(xiàn)多出來(lái)了2 個(gè)進(jìn)程: PID PORT STAT SIZE SHARED %CPU COMMAND 1 S 134K 0K 0.0 init 2 S 0K 0K 0.0 keventd 3 S 0K 0K 0.0 ksoftirqd_CPU0 4 S 0K 0K 0.0 kswapd 5 S 0K 0K 0.0 bdflush 6 S 0K 0K 0.0 kupdated 15 S0 R 140K 0K 0.0 /bin/sh 16 S 70K 0K 0.0 /bin/inetd 17 S 268K 0K 0.0 /bin/boa 19 S 74K 0K 0.0 /bin/telnetd 20 p0 S 134K 0K 0.0 sh 下面的第19、20 號(hào)進(jìn)程就是新的。也就是和telnet 有關(guān)的兩個(gè)進(jìn)程 |
聯(lián)系客服