uclinux內核配置與裁減
uclinux表示micro-control linux.即“微控制器領(lǐng)域中的Linux系統”,是Lineo公司的主打產(chǎn)品,同時(shí)也是開(kāi)放源碼的嵌入式Linux的典范之作。uCLinux主要是針對目標處理器沒(méi)有存儲管理單元MMU(Memory Management Unit)的嵌入式系統而設計的。它已經(jīng)被成功地移植到了很多平臺上。由于沒(méi)有MMU,其多任務(wù)的實(shí)現需要一定技巧。
本文引用地址:http://dyxdggzs.com/article/201808/388125.htmuClinux是嵌入式Linux領(lǐng)域非常重要的分支,已成功應用于路由器、機頂盒、PDA等領(lǐng)域,與標準Linux在內存管理方面有著(zhù)本質(zhì)的區別。
Uclinux的配置和裁減也是利用的華恒科技提供的源碼包(用于hhbf531學(xué)習板)。我們使用的開(kāi)發(fā)板信息如下:
CPU:BF533
FLASH:S29AL004D-512KB
SDRAM:HY57V281620-16MB
這里我不敢說(shuō)“uclinux的移植”,而只是以“配置與裁減”代之,是因為我覺(jué)得自己的工作真的談不上什么移植?,F成的源碼包,所有的底層驅動(dòng)都已經(jīng)完成,我們所要做的只是選擇自己需要的驅動(dòng)、配置一下內核、做一些裁減工作而已。每每聽(tīng)到其他人提到“最近又完成了TImes;TImes;TImes;平臺的linux移植”,我都會(huì )有點(diǎn)擔心:國內有多少工程師能真正從最初始的工作開(kāi)始,完成一個(gè)平臺的系統移植——應該很少吧。
下面,我分以下步驟簡(jiǎn)單介紹一下我的配置過(guò)程。
一,配置并在RAM中運行內核(不帶根文件系統):
由于我們的flash空間有限,在沒(méi)有裁減之前,就算不帶根文件系統,也無(wú)法燒寫(xiě)到flash內保存;所以先嘗試下載到RAM中運行。另外,我們目前的開(kāi)發(fā)板上沒(méi)有網(wǎng)絡(luò )功能,只能通過(guò)串口下載,所以在這里配置內核的過(guò)程中,做一些簡(jiǎn)單裁減,以便節約下載時(shí)間。
解壓源碼包后,進(jìn)入uclinux目錄:
#cd uClinux-dist
設定交叉工具鏈:
#PATH=”/usr/local/bin/gcc-bfin-3.4-uclinux/bin/:$PATH”
進(jìn)入配置:
#make menuconfig
運行后,進(jìn)入“MainMenu”配置頁(yè),可以在此選擇Vender/Product和Kernel/Library/Defaults等內容。根據我們使用的平臺,我們選擇:Vender-AnalogDevices,Product-HHBF533(或者HHBF531),Libc-uClibc;如果要配置內核和應用程序還要分別選中“Customize Kernel SetTIngs”、“Customize Vender/User Settings”。退出保存后,將依次進(jìn)入配置內核和配置應用程序頁(yè)。
如果想單獨配置內核,可以進(jìn)入目錄linux-2.6.x/內運行“make menuconfig”。配置應用程序在這個(gè)源碼包里好像沒(méi)有單獨的config選項。這些關(guān)于內核源碼包結構的基本知識,需要大家提前了解。
下面,我們來(lái)配置內核。
配置一個(gè)可以在我們的SDRAM中運行的內核很簡(jiǎn)單,因為底層工作都已經(jīng)完成。我們只需要配置一下處理器相關(guān)內容即可。處理器選項位于內核配置頁(yè)的“Blackfin Processer Options”。進(jìn)入該配置頁(yè),進(jìn)行如下配置:
CPU - BF533
System type - BF533-HHBF
Board Customizations - 根據你的開(kāi)發(fā)板時(shí)鐘、SDRAM信息配置,其他不用修改。
Clock Settings - 取消“Re-programClocks while Kernel boots”,默認為u-boot的時(shí)鐘配置。
其他選項不用修改,各項配置功能介紹見(jiàn)文檔《附.Linux 2.6.19.x內核編譯配置選項簡(jiǎn)介》。
以上配置正確后,下載到你的開(kāi)發(fā)板上,應該就可以運行了。但通過(guò)串口下載速度太慢,我們先去掉一些不需要的驅動(dòng)。由于我們沒(méi)有網(wǎng)絡(luò )功能,所以把網(wǎng)絡(luò )及其驅動(dòng)全部取消,可以裁減150KB左右的空間;我們也不需要音視頻功能,所以把音視頻驅動(dòng)也取消,又可以減小很大空間。如此配置后,我們可以嘗試下載到SDRAM中運行了。
現在,我們還不想裁減根文件系統,所以,我們想得到一個(gè)不帶根文件系統的壓縮內核鏡像。由于華恒提供的源碼包,編譯后不能得到壓縮的不帶根文件系統的鏡像,所以我們要通過(guò)修改Makefile得到我們需要的編譯結果。
需要修改的Makefile位于uClinux-dist目錄下,打開(kāi)該Makefile,在“.PHONY:linux”項的”ln –f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux;”語(yǔ)句后,添加以下內容。

這樣在uClinux-dist目錄下執行“make linux”就可以生成壓縮的不帶根文件系統的內核鏡像了,該鏡像文件為uImage.bin,位于linux-2.6.x目錄內?,F在,可以將得到的內核下載到SDRAM中運行了。因為是壓縮內核,所以運行時(shí)要使用u-boot的bootm命令。至于u-boot命令的使用方法,自行學(xué)習。
Makefile也是編譯內核的基礎知識,需要大家逐步掌握。
這樣,該步的工作就可以告一段落了。
下載到SDRAM中,如果解壓后無(wú)法運行,先檢查一下上述配置操作是否有誤。如果確定無(wú)誤,就需要分析內核的執行過(guò)程,仔細分析問(wèn)題了。接下來(lái)簡(jiǎn)單介紹一下內核執行流程。
二,內核執行流程:
承接上篇《u-boot引導uclinux過(guò)程分析》,介紹內核啟動(dòng)流程。
A,內核vmlinux入口
u-boot執行“(*appl)(cmdline);”語(yǔ)句后,控制權就移交給linux內核,appl變量指向的地址就是linux內核的首地址。
Linux內核執行的第一個(gè)文件是/linux-2.6.x/arch/blackfin/mach-bf533/head.S。經(jīng)過(guò)一系列的初始化,跳轉到start_kernel()函數,即進(jìn)入linux系統初始化階段。
B, Linux系統初始化
Start_kernel()函數位于文件/linux-2.6.x/init/main.c中,是linux內核通用的初始化函數。無(wú)論對于什么體系結構的linux,都要執行這個(gè)函數。

Start_kernel()函數負責初始化內核各子系統,最后調用rest_init(),啟動(dòng)一個(gè)叫作init的內核線(xiàn)程,繼續初始化。
評論