Linux和uClinux
1991年8月,芬蘭的一個學生在comp.os.minix新聞組貼上了以下這段話:
你好所有使用minix的人-我正在為386(486)AT做一個免費的作業系統(只是為了愛好,不會象gnu那樣很大很專業.
這名學生就是Linus Torvalds, 而他所說的'愛好'就變成我們今天知道的Linux。
由於Linux的源代碼公佈在互聯網上,可以免費得到,因此從一開始就吸引了世界各地的UNIX 行家為Linux編寫了大量的驅動程式和應用軟體,在短短幾年時間裏,Linux就發展成為一個相當完善的作業系統,而且Linux支援的硬體平臺是所有作業系統中最多的,目前Linux支援硬體平臺:Intel的IA64、Compaq的Alpha、Sun的Sparc/Sparc64、SGI的Mips、IBM的S396、ARM、PowerPC等。Linux更大的影響在於它正逐漸地應用於嵌入式設備,uClinux正是在這種氛圍下產生的。
uClinux就是Micro-Control-Linux,它也是一個開放源碼的項目,uClinux的源代碼和開發工具可以免費從http://www.uclinux.org上下載得到。uClinux是專為那些沒有MMU(記憶體管理單元)的嵌入式處理器開發的,和主流的Linux相比,uClinux有以下的特點:
1.簡化了內核載入方式,uClinux的內核可以在Flash上直接運行:就是把uClinux的內核的可執行映象燒寫到flash上,系統啟動時從Flash的某個位址開始逐句執行;也可以載入到記憶體中運行:把內核的壓縮檔存放在Flash上,系統啟動時讀取壓縮檔在記憶體裏解壓,然後開始執行。
2.採用了romfs檔系統作為root檔系統:這種檔系統相對於一般的ext2檔系統要求更少的空間,首先內核支援
romfs檔系統比支援ext2檔系統需要更少的代碼,其次romfs檔系統相對簡單,建立檔系統superblock需要更少的存儲空間。Romfs檔系統不支援動態擦寫,對於系統需要動態保存的資料採用RAM-disk的方法處理,RAM-disk採用ext2檔系統。
3.使用了Flat可執行檔格式:elf格式有很大的檔頭,flat檔對檔頭和一些段資訊做了簡化。
4.重寫了應用程式庫:uClibc對libc做了精簡,uClinux對用戶程式採用靜態連接的形式。uClinux的開發環境www.uclinux.org為uClinux提供了GNU的交叉編譯器,包括以下元件:Gcc交叉編譯器,即在主要機器上開發編譯目標上可運行的二進位檔;Binutils輔助工具,包括objdump、as、ld等;Gdb調試器。
以在ARM7上開發uClinux為例:
1.獲得uClinux-dist的源碼包,www.uclinux.org上定期為新推出的Linux內核推出相應的源碼包,最新的版本為Kernel-2.4.21,可以從
http: //www.uclinux.org/pub/uClinux/dist/上免費下載得到。這個源碼包裏包含了uCLinux-2.4.21、uClibc和已經移植到uClinux下的用戶應用程式。下載完後,會得到一個 uClinux-dist-20030522.tar.gz的檔,把它保存到/home目錄下,然後執行:tar zxvf uClinux-dist-20030522.tar.gz,當tar程式運行完畢後,在/home目錄下會有一個/home/uClinux-dist的新目錄,這個目錄就是uClinux的源碼根目錄,裏面有進行uClinux開發的所有的源代碼。
2.獲得ARM開發工具,www.uclinux.org提供uClinux源碼的同時還提供相應的交叉編譯工具。要在開發主機上為ARM7目標系統編譯uClinux,還需要從 http://www.uclinux.org/pub/uClinux/arm-elf-tools/ 上下載ARM交叉編譯器:
arm-elf-tools-20030314.sh。得到這個檔以後,執行以下命令:
sh arm-elf-tools-20030314.sh, 這個命令會在開發主機上自動建立一個uClinux-ARM的交叉編譯環境。鍵入arm-elf- gcc,如果能看到下面的輸出資訊:
Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc
version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patchesfrom
http://www.snapgear.com/)
表示uClinux-ARM的交叉編譯環境已經建立起來了。
現在開發主機裏已經有了uClinux的源代碼和編譯這些源代碼的工具,也可以用make menuconfig,make等命令來編譯uClinux和用戶程式,為ARM目標板編譯了一個內核映射檔,接下來要做得是需要一塊ARM7的開發板來運行這個映射檔(關於如何編譯uClinux和用戶程式請參考www.uClinux.org 上得相關文檔)。
構建ARM7-uClinux開發板 uClinux只需要極少的硬體資源就可運行起來,以ARM7TDMI為例,只需要以下硬體:
1. CPU ? Samsung S3C4510B
2. SDRAM 8M以上
3. 一個簡易的串口
4. 2M Flash
5.一個乙太網介面(可選)
目前各嵌入式微處理器的廠商在推出每款處理器的同時都會提供一個Demo板,供用戶來測試微處理器的性能。Samsung公司對S3C4510B處理器提供了一款SNDS100的Demo板。Demo板的原理圖可以從Samsung公司的網站上免費下載,對這個原理圖作一些修改,只保留上面列出的5個部分,去掉其他多餘的部分。修改以後的原理圖就是一個能夠運行uClinux的ARM7目標板原理圖,然後根據這個原理圖去加工幾張PCB板,焊上相應的元件,一塊能運行uClinux的ARM7開發板就做成了(這款開發板相應得原理圖、PCB圖可以從http://www.dailzh.net上免費下載得到)。慢著,雖然這塊開發板已經焊接完成,但目前它只是一堆電子零件的簡單組合,要在它上面跑uClinux,還需要相應的軟體來管理這些硬體。前面提到uClinux可以從Flash中直接運行,就是說可以將uClinux的映射檔直接燒寫到Flash中,然後上電,uClinux會從Flash中啟動嗎?
是的,確實如此。現在要做的就是如何將uClinux的內核映射燒寫到Flash中。用寫入器將uClinux內核映射寫入到Flash中,然後將Flash焊接到pcb板上或插到開發板的flash的插座上可以嗎?當然可以,如果你有寫入器的話。不過,很少有人手裏能有這種寫入器。我們需要的是一個廉價的Flash寫入方案。用JTAG,S3C4510B上集成了一個JTAG,通過JTAG我們可以控制S3C4510B上所有管腳,這樣可以通過向JTAG介面輸入相應的指令和資料,用軟體的方法在S3C4510B的資料、位址和控制匯流排上產生出Flash器件的讀寫操作時序,將uClinux的內核映射檔燒寫到Flash中(關於S3C4510B的JTAG介面電纜的製作和下載燒寫uClinux映射檔到Flash中的程式可執行檔和源代碼請參閱http://www.dailzh.net上相關內容)。
終於將uClinux的映射檔燒寫到Flash中了,用一根串口電纜將ARM7開發板和開發主機的Com1口連接起來,從網上下載一個tip程式,執行這個命令:
tip ?l /dev/ttyS0 ?s 19200
等螢幕上顯示 connected.以後,將ARM7開發板的電源接通。如果夠幸運的話,你應該看到下面的資訊:
>>Linux version 2.4.20-uc0(root@dailzh) (gcc version 2.95.3>>20010315 (release)
(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)
>>(uClinux XIP and shared lib patches from http://www.snapgear.com/))
一 5月19 23:44:11 CST 2003
>>Processor: Samsung S3C4510B revision 6
>>Architecture: SNDS100
>>On node 0 totalpages: 4096
>>zone(0):0 pages.
>>zone(1): 4096 pages.
>>zone(2): 0 pages.
>>Kernel command line:root=/dev/rom0
>>Calibrating delay loop... 49.76 BogoMIPS…
>>Command: cat /etc/motd
>>Welcome to uClinux.org
>>For further information check:http://www.uclinux.org/
>>
\>
uClinux在ARM7目標板上已經運行起來了,鍵入熟悉的ls命令,看有什麼輸出。
通過JTAG介面燒寫uClinux映射檔到Flash中速度太慢,調試uClinux內核非常不方便,有沒有其他的方法?有,uClinux除了可以從Flash中直接運行外,還可以載入到記憶體中運行。我們來為ARM7開發板寫一個Bootloader,Bootloader的作用是初始化ARM7開發板,然後通過乙太網介面將uClinux映射下載到記憶體中,然後從記憶體中運行uClinux。
這種方法下載uClinux內核映射只需要10幾秒,適合於開發階段經常修改uClinux內核時使用(Bootloader for ARM7的源代碼可以從
http://www.dailzh.net上下載得到)。調試完uClinux的內核以後,可以再通過JTAG介面燒寫uClinux映射檔到Flash中,這樣又可以直接從Flash中運行偵錯好的uClinux了。
uClinux下用戶程式的開發和偵錯現在ARM7開發板可以運行uClinux了,如何開發uClinux下的應用程式呢?和在普通電腦上開發Linux程式一樣,首先編寫應用程式的源代碼,只不過編譯的時候不能用gcc編譯,需要用arm-elf-gcc 編譯。編譯以後的可執行檔必須下載到ARM7開發板上才能運行,下載程式到目標板上可以通過在uClinux中啟用tftpd程式,在開發主機端用tftpcmd程式來下載,然後在uClinux的控制臺視窗鍵入可執行檔案名的方法來運行。如果想要應用程式在uClinux啟動時自動運行,可以修改uClinux系統中/etc/rc檔的內容來來實現。如果要用gdb來偵錯用戶程式,可以參考www.uclinux.org上的相關文檔。
- Apr 02 Fri 2004 18:29
自己動手打造嵌入式Linux軟硬體開發環境
close
自己動手打造嵌入式Linux軟硬體開發環境
全站熱搜
留言列表
禁止留言