當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]uclinux表示micro-control linux.即“微控制器領(lǐng)域中的Linux系統(tǒng)”,是Lineo公司的主打產(chǎn)品,同時(shí)也是開放源碼的嵌入式Linux的典范之作。uCLinux主要是針對(duì)目標(biāo)

uclinux表示micro-control linux.即“微控制器領(lǐng)域中的Linux系統(tǒng)”,是Lineo公司的主打產(chǎn)品,同時(shí)也是開放源碼的嵌入式Linux的典范之作。uCLinux主要是針對(duì)目標(biāo)處理器沒有存儲(chǔ)管理單元MMU(Memory Management Unit)的嵌入式系統(tǒng)而設(shè)計(jì)的。它已經(jīng)被成功地移植到了很多平臺(tái)上。由于沒有MMU,其多任務(wù)的實(shí)現(xiàn)需要一定技巧。

uClinux是嵌入式Linux領(lǐng)域非常重要的分支,已成功應(yīng)用于路由器、機(jī)頂盒、PDA等領(lǐng)域,與標(biāo)準(zhǔn)Linux在內(nèi)存管理方面有著本質(zhì)的區(qū)別。

Uclinux的配置和裁減也是利用的華恒科技提供的源碼包(用于hhbf531學(xué)習(xí)板)。我們使用的開發(fā)板信息如下:

CPU:BF533

FLASH:S29AL004D-512KB

SDRAM:HY57V281620-16MB

這里我不敢說“uclinux的移植”,而只是以“配置與裁減”代之,是因?yàn)槲矣X得自己的工作真的談不上什么移植?,F(xiàn)成的源碼包,所有的底層驅(qū)動(dòng)都已經(jīng)完成,我們所要做的只是選擇自己需要的驅(qū)動(dòng)、配置一下內(nèi)核、做一些裁減工作而已。每每聽到其他人提到“最近又完成了&TImes;&TImes;&TImes;平臺(tái)的linux移植”,我都會(huì)有點(diǎn)擔(dān)心:國內(nèi)有多少工程師能真正從最初始的工作開始,完成一個(gè)平臺(tái)的系統(tǒng)移植——應(yīng)該很少吧。

下面,我分以下步驟簡單介紹一下我的配置過程。

一,配置并在RAM中運(yùn)行內(nèi)核(不帶根文件系統(tǒng)):

由于我們的flash空間有限,在沒有裁減之前,就算不帶根文件系統(tǒng),也無法燒寫到flash內(nèi)保存;所以先嘗試下載到RAM中運(yùn)行。另外,我們目前的開發(fā)板上沒有網(wǎng)絡(luò)功能,只能通過串口下載,所以在這里配置內(nèi)核的過程中,做一些簡單裁減,以便節(jié)約下載時(shí)間。

解壓源碼包后,進(jìn)入uclinux目錄:

#cd uClinux-dist

設(shè)定交叉工具鏈:

#PATH=”/usr/local/bin/gcc-bfin-3.4-uclinux/bin/:$PATH”

進(jìn)入配置:

#make menuconfig

運(yùn)行后,進(jìn)入“MainMenu”配置頁,可以在此選擇Vender/Product和Kernel/Library/Defaults等內(nèi)容。根據(jù)我們使用的平臺(tái),我們選擇:Vender-AnalogDevices,Product-HHBF533(或者HHBF531),Libc-uClibc;如果要配置內(nèi)核和應(yīng)用程序還要分別選中“Customize Kernel SetTIngs”、“Customize Vender/User Settings”。退出保存后,將依次進(jìn)入配置內(nèi)核和配置應(yīng)用程序頁。

如果想單獨(dú)配置內(nèi)核,可以進(jìn)入目錄linux-2.6.x/內(nèi)運(yùn)行“make menuconfig”。配置應(yīng)用程序在這個(gè)源碼包里好像沒有單獨(dú)的config選項(xiàng)。這些關(guān)于內(nèi)核源碼包結(jié)構(gòu)的基本知識(shí),需要大家提前了解。

下面,我們來配置內(nèi)核。

配置一個(gè)可以在我們的SDRAM中運(yùn)行的內(nèi)核很簡單,因?yàn)榈讓庸ぷ鞫家呀?jīng)完成。我們只需要配置一下處理器相關(guān)內(nèi)容即可。處理器選項(xiàng)位于內(nèi)核配置頁的“Blackfin Processer Options”。進(jìn)入該配置頁,進(jìn)行如下配置:

CPU - BF533

System type - BF533-HHBF

Board Customizations - 根據(jù)你的開發(fā)板時(shí)鐘、SDRAM信息配置,其他不用修改。

Clock Settings - 取消“Re-programClocks while Kernel boots”,默認(rèn)為u-boot的時(shí)鐘配置。

其他選項(xiàng)不用修改,各項(xiàng)配置功能介紹見文檔《附.Linux 2.6.19.x內(nèi)核編譯配置選項(xiàng)簡介》。

以上配置正確后,下載到你的開發(fā)板上,應(yīng)該就可以運(yùn)行了。但通過串口下載速度太慢,我們先去掉一些不需要的驅(qū)動(dòng)。由于我們沒有網(wǎng)絡(luò)功能,所以把網(wǎng)絡(luò)及其驅(qū)動(dòng)全部取消,可以裁減150KB左右的空間;我們也不需要音視頻功能,所以把音視頻驅(qū)動(dòng)也取消,又可以減小很大空間。如此配置后,我們可以嘗試下載到SDRAM中運(yùn)行了。

現(xiàn)在,我們還不想裁減根文件系統(tǒng),所以,我們想得到一個(gè)不帶根文件系統(tǒng)的壓縮內(nèi)核鏡像。由于華恒提供的源碼包,編譯后不能得到壓縮的不帶根文件系統(tǒng)的鏡像,所以我們要通過修改Makefile得到我們需要的編譯結(jié)果。

需要修改的Makefile位于uClinux-dist目錄下,打開該Makefile,在“.PHONY:linux”項(xiàng)的”ln –f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux;”語句后,添加以下內(nèi)容。

 


這樣在uClinux-dist目錄下執(zhí)行“make linux”就可以生成壓縮的不帶根文件系統(tǒng)的內(nèi)核鏡像了,該鏡像文件為uImage.bin,位于linux-2.6.x目錄內(nèi)?,F(xiàn)在,可以將得到的內(nèi)核下載到SDRAM中運(yùn)行了。因?yàn)槭菈嚎s內(nèi)核,所以運(yùn)行時(shí)要使用u-boot的bootm命令。至于u-boot命令的使用方法,自行學(xué)習(xí)。

Makefile也是編譯內(nèi)核的基礎(chǔ)知識(shí),需要大家逐步掌握。

這樣,該步的工作就可以告一段落了。

下載到SDRAM中,如果解壓后無法運(yùn)行,先檢查一下上述配置操作是否有誤。如果確定無誤,就需要分析內(nèi)核的執(zhí)行過程,仔細(xì)分析問題了。接下來簡單介紹一下內(nèi)核執(zhí)行流程。

二,內(nèi)核執(zhí)行流程:

承接上篇《u-boot引導(dǎo)uclinux過程分析》,介紹內(nèi)核啟動(dòng)流程。

A,內(nèi)核vmlinux入口

u-boot執(zhí)行“(*appl)(cmdline);”語句后,控制權(quán)就移交給linux內(nèi)核,appl變量指向的地址就是linux內(nèi)核的首地址。

Linux內(nèi)核執(zhí)行的第一個(gè)文件是/linux-2.6.x/arch/blackfin/mach-bf533/head.S。經(jīng)過一系列的初始化,跳轉(zhuǎn)到start_kernel()函數(shù),即進(jìn)入linux系統(tǒng)初始化階段。

B, Linux系統(tǒng)初始化

Start_kernel()函數(shù)位于文件/linux-2.6.x/init/main.c中,是linux內(nèi)核通用的初始化函數(shù)。無論對(duì)于什么體系結(jié)構(gòu)的linux,都要執(zhí)行這個(gè)函數(shù)。

 


Start_kernel()函數(shù)負(fù)責(zé)初始化內(nèi)核各子系統(tǒng),最后調(diào)用rest_init(),啟動(dòng)一個(gè)叫作init的內(nèi)核線程,繼續(xù)初始化。[!--empirenews.page--]

 


起始內(nèi)核線程init的任務(wù)依然是初始化,只不過是一種更高層次的初始化。

 


 

函數(shù)do_basic_setup()是init進(jìn)程中最重要的函數(shù),與嵌入式系統(tǒng)關(guān)系最緊密的是其中的do_initcalls()函數(shù),該函數(shù)與設(shè)備驅(qū)動(dòng)程序加載有關(guān)。

函數(shù)prepare_namespace()函數(shù)主要目的是準(zhǔn)備好系統(tǒng)的命名空間,其中最重要的函數(shù)是mount_root(),其功能是掛載根文件系統(tǒng)。

四個(gè)run_init_process()函數(shù)查找init進(jìn)程程序并嘗試執(zhí)行。如果沒有找到一個(gè)可以執(zhí)行的init程序,則報(bào)告錯(cuò)誤“Noinit found”。

C,初始化設(shè)備驅(qū)動(dòng)

參考B中的do_basic_setup()函數(shù)。

D,掛接根文件系統(tǒng)

參考B中的prepare_namespace()函數(shù)。

E, 啟動(dòng)用戶空間init進(jìn)程

當(dāng)內(nèi)核掛載了根文件系統(tǒng)后,內(nèi)核的啟動(dòng)工作就全部結(jié)束了,但系統(tǒng)還不能正常啟動(dòng)起來,因?yàn)檫€需要通過根文件系統(tǒng)上的init程序來完成一下最后的設(shè)置工作。這個(gè)init程序一般在/sbin、/etc或/bin目錄下。

三,裁減內(nèi)核(不帶根文件系統(tǒng))并燒寫到flash中:

該步承接上步的工作。由于上步已經(jīng)做了一定的裁減,該步只需要在此基礎(chǔ)上進(jìn)一步裁減即可。該步工作相對(duì)叫簡單,只需要將不需要的驅(qū)動(dòng)選項(xiàng)取消即可,當(dāng)然要注意保證內(nèi)核的依賴關(guān)系。

我們的flash容量為512KB,u-boot占有64KB空間,剩下的只有448KB。另外,根文件系統(tǒng)大約還需要100KB空間,所以內(nèi)核大小要控制在350KB以內(nèi)。我們先嘗試將不需要的驅(qū)動(dòng)和選項(xiàng)全部取消,讓內(nèi)核運(yùn)行起來。

在“二,配置并在RAM中運(yùn)行內(nèi)核(不帶根文件系統(tǒng))”的基礎(chǔ)上,我們進(jìn)一步刪除的驅(qū)動(dòng)包括:

l 取消“Loadble module support”支持

l 取消“Block layer”支持

l 取消“Bus options”所有支持

l 取消“Power management options”支持

l 取消“CPU Frequency scaling”支持

l 取消“Profiling Support”支持

l 取消“Security options”支持

l 取消“Cryptographic options”支持

l 取消除了串口和MTD以外的所有硬件驅(qū)動(dòng)支持

l 取消內(nèi)部RTC驅(qū)動(dòng)

l 取消對(duì)ELF格式文件支持

取消以上選項(xiàng)后,內(nèi)核可以控制在350KB以內(nèi)了。所以,不需進(jìn)一步修改Makefile來裁減內(nèi)核了。這樣就可以下載并燒寫到flash內(nèi)保存了。

四,配置應(yīng)用程序和裁減根文件系統(tǒng):

根文件系統(tǒng)掛載到內(nèi)核有兩種基本方式:獨(dú)立于內(nèi)核存放通過MTD分區(qū)識(shí)別并掛載和鏈接到內(nèi)核數(shù)據(jù)段通過ramdisk掛載(兩種方式都是我自己概括的,可能描述上有些不盡合理,僅供參考)。不論那種方式,都需要MTD驅(qū)動(dòng)支持,所以內(nèi)核要支持MTD并配置正確,保持華恒源碼包原MTD配置即可。

HHBF5XX 的Linux BSP 使用ext2 格式的ramdisk 作為根文件系統(tǒng),直接鏈接到內(nèi)核數(shù)據(jù)段,所以這里介紹這種方式。另一種方式這里不作介紹,其相關(guān)資料更豐富。

與根文件系統(tǒng)(ramfs)相關(guān)的鏈接內(nèi)容如下,位于文件/linux-2.6.x/arch/Blackfin/Kernel/vmlinux.lds.S中。

 


內(nèi)核通過__initramfs_start和__initramfs_end找到根文件系統(tǒng)的img,這兩個(gè)變量在文件/linux-2.6.x/init/Initramfs.c中被引用。

介紹完根文件系統(tǒng)的掛載方式,我們來介紹如何配置和裁減應(yīng)用程序。

由于flash容量限制,而且我們也并不需要很多應(yīng)用程序的支持,所以我們可以只保留最簡單的init、sh、ls、cd等應(yīng)用程序,其他應(yīng)用全部裁減掉。注意必須保證要有init和sh,否則內(nèi)核無法運(yùn)行或沒有shell界面。另外,為了進(jìn)一步裁減體積,我們利用busybox制作根文件系統(tǒng),busybox的介紹文檔網(wǎng)上非常多,這里不再介紹。

按照以上分析,我們來配置應(yīng)用程序和busybox。

按照“一,配置并在RAM中運(yùn)行內(nèi)核(不帶根文件系統(tǒng))”中介紹的方法進(jìn)入應(yīng)用程序配置頁。只需選中Busybox內(nèi)的BusyboxSVN,其余選項(xiàng)全部取消,完全用busybox代替。

然后,我們來配置busybox。進(jìn)入busybox目錄,運(yùn)行配置命令:

#cd user/busybox-svn

#make menuconfig

除了按照我們上面介紹的,保留最基本的應(yīng)用程序之外,其他全部取消;還有一點(diǎn)需要特別注意。就是在“Build options”選擇中選中編譯成靜態(tài)庫,而不要編譯成共享庫,這樣在根文件系統(tǒng)掛載時(shí)省去很多麻煩,雖然最后得到的內(nèi)核體積會(huì)稍微增大一下。共享庫的應(yīng)用可以在內(nèi)核運(yùn)行成功后,進(jìn)一步學(xué)習(xí)。

這樣配置得到的根文件系統(tǒng)已經(jīng)裁減了很大體積,但下載到SDRAM中運(yùn)行時(shí)會(huì)發(fā)現(xiàn)根文件系統(tǒng)占有的內(nèi)存空間仍然很大,始終保持12.5MB空間。這是因?yàn)?,根文件系統(tǒng)的運(yùn)行空間是在生成鏡像時(shí)指定的。要裁減占有的內(nèi)存空間,可以如下修改。

#vi vender/HHTech/BF533-HHBF/Makefile

修改第14行的“BLOCKS = 12800”為較小的值,比如說4096等,必須是256的整數(shù)倍,否則內(nèi)核運(yùn)行時(shí)根文件系統(tǒng)報(bào)錯(cuò)。這樣修改后,根文件系統(tǒng)占有的flash和SDRAM空間都會(huì)相應(yīng)減小。

通過以上裁減后,帶有根文件系統(tǒng)的內(nèi)核鏡像完全可以控制在448KB以內(nèi),下載保存到flash后運(yùn)行,你就可以看到可愛的“uClinux”歡迎界面了。[!--empirenews.page--]

如果要進(jìn)一步裁減根文件系統(tǒng),可以修改和刪除vender/HHTech/BF533-HHBF/目錄下的相關(guān)文件,具體操作不再詳述。

uClinux的多進(jìn)程處理

uClinux沒有mmu管理存儲(chǔ)器,在實(shí)現(xiàn)多個(gè)進(jìn)程時(shí)(fork調(diào)用生成子進(jìn)程)需要實(shí)現(xiàn)數(shù)據(jù)保護(hù)。 uClinux的fork和vfork:uClinux的fork等于vfork。實(shí)際上uClinux的多進(jìn)程管理通過vfork來實(shí)現(xiàn)。這意味著 uClinux系統(tǒng)fork調(diào)用完程后,要么子進(jìn)程代替父進(jìn)程執(zhí)行(此時(shí)父進(jìn)程已經(jīng)sleep)直到子進(jìn)程調(diào)用exit退出,要么調(diào)用exec執(zhí)行一個(gè)新的進(jìn)程,這個(gè)時(shí)候?qū)a(chǎn)生可執(zhí)行文件的加載,即使這個(gè)進(jìn)程只是父進(jìn)程的拷貝,這個(gè)過程也不能避免。當(dāng)子進(jìn)程執(zhí)行exit或exec后,子進(jìn)程使用 wakeup把父進(jìn)程喚醒,父進(jìn)程繼續(xù)往下執(zhí)行?! ?uClinux的這種多進(jìn)程實(shí)現(xiàn)機(jī)制同它的內(nèi)存管理緊密相關(guān)。 uClinux針對(duì)nommu處理器開發(fā),所以被迫使用一種flat方式的內(nèi)存管理模式,啟動(dòng)新的應(yīng)用程序時(shí)系統(tǒng)必須為應(yīng)用程序分配存儲(chǔ)空間,并立即把應(yīng)用程序加載到內(nèi)存。缺少了MMU的內(nèi)存重映射機(jī)制,uClinux必須在可執(zhí)行文件加載階段對(duì)可執(zhí)行文件reloc處理,使得程序執(zhí)行時(shí)能夠直接使用物理內(nèi)存。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉