當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式Linux: uClinux操作系統(tǒng)移植

1.uClinux簡(jiǎn)介

uClinux這個(gè)英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,所以u(píng)Clinux就是Micro-Control-Linux,字面上的理解就是"針對(duì)微控制領(lǐng)域而設(shè)計(jì)的Linux系統(tǒng)".

uclinux是一個(gè)源碼開放的操作系統(tǒng),面向沒有MMU(MemoryManagementUnit)的硬件平臺(tái)。它是linux的一個(gè)變種,主要的區(qū)別在于兩者的內(nèi)存管理機(jī)制和進(jìn)程調(diào)度管理機(jī)制,同時(shí)為了適應(yīng)嵌入式應(yīng)用的需求,它的采用了romfs文件系統(tǒng),并對(duì)linux上的c語言庫glibc做了簡(jiǎn)化。

2.硬件體系結(jié)構(gòu)簡(jiǎn)介

運(yùn)行uClinux的硬件平臺(tái)主要包括如下幾個(gè)部分:cpu(ARMv4指令集兼容)、uart、memorycontroller、定時(shí)器、flash存儲(chǔ)器,sdram存儲(chǔ)器,中斷控制器和DMA.

3.編譯環(huán)境和編譯工具

uclinux操作系統(tǒng)源碼絕大部分是用c語言開發(fā)的,有一些與硬件直接相關(guān)的代碼則用特定于某一CPU體系結(jié)構(gòu)的匯編來實(shí)現(xiàn)。這些源碼只能用GNU的gcc編譯工具來進(jìn)行編譯、鏈接。

GNUgcc可以運(yùn)行于Linux/Unix操作系統(tǒng)上。如果要在Windows平臺(tái)上運(yùn)行g(shù)cc,則必須安裝Cygwin.Cygwin可以在Windows中安裝一個(gè)linux的運(yùn)行環(huán)境,這樣就可以在windows下運(yùn)行原本只能在linux下運(yùn)行的程序。

為了在PC上編譯得到運(yùn)行于目標(biāo)CPU上的操作系統(tǒng)內(nèi)核,還必須安裝一個(gè)合適的交叉編譯器。Gcc提供了現(xiàn)成的針對(duì)MIPS、ARM、M68K、Sharc、PowerPC的交叉編譯器。如果沒有現(xiàn)成的交叉編譯器,則需要自行設(shè)計(jì)。GNU網(wǎng)站提供了一些如何開發(fā)新的交叉編譯器的文章。開發(fā)一個(gè)新的編譯器,一般需要如下幾個(gè)步驟:

(1)、編寫機(jī)器描述腳本。采用gcc的RTL(RegisterTansferLanguage)語言描述針對(duì)某一CPU體系結(jié)構(gòu)的機(jī)器指令與尋址方式、CPU浮點(diǎn)處理方式、endianess、c語言中各種數(shù)據(jù)類型的位寬、寄存器的個(gè)數(shù)和使用規(guī)則、堆棧和函數(shù)調(diào)用規(guī)則等體系結(jié)構(gòu)的細(xì)節(jié)。

(2)、設(shè)計(jì)代碼生成器。Gcc在對(duì)c語言源文件進(jìn)行了詞法和語法分析后,將產(chǎn)生一種中間格式文件(intermediaterepresentation)。為了把這種中間格式文件轉(zhuǎn)化為針對(duì)具體CPU體系結(jié)構(gòu)的機(jī)器碼,需要自行設(shè)計(jì)一個(gè)代碼生成器。

(3)、設(shè)計(jì)匯編器

(4)、設(shè)計(jì)鏈接器

4.uClinux啟動(dòng)過程

uClinux系統(tǒng)的啟動(dòng)可以分為兩個(gè)步驟:

(1)。運(yùn)行bootloader初始化程序

SRAM、SDRAM等存儲(chǔ)設(shè)備屬于揮發(fā)性的存儲(chǔ)器,掉電以后其中的內(nèi)容就會(huì)全部丟失,所以必須把操作系統(tǒng)的內(nèi)核鏡像存放在Flash等不揮發(fā)性存儲(chǔ)介質(zhì)上。但是操作系統(tǒng)在運(yùn)行時(shí),需要?jiǎng)討B(tài)的創(chuàng)建一些如數(shù)據(jù)段、堆棧、頁表(針對(duì)使用虛擬地址的操作系統(tǒng))等內(nèi)容,所以需要在RAM中運(yùn)行操作系統(tǒng)。因此,就需要一個(gè)引導(dǎo)程序把操作系統(tǒng)的內(nèi)核鏡像從Flash存儲(chǔ)器拷貝到RAM中,然后再?gòu)腞AM中執(zhí)行操作系統(tǒng)的內(nèi)核。Bootloader就是可以完成這樣一種功能的程序。

從本質(zhì)上來講,bootloader不屬于操作系統(tǒng)內(nèi)核。它采用匯編語言編寫,因此針對(duì)不同的cpu體系結(jié)構(gòu),這一部分代碼不具有可移植性。在移植操作系統(tǒng)時(shí),這部分代碼必須加以改寫。

具體來講,bootloader在系統(tǒng)啟動(dòng)時(shí)主要完成以下幾項(xiàng)工作:

。將操作系統(tǒng)內(nèi)核從flash拷貝到sdram中,如果是壓縮格式的內(nèi)核,還要將之解壓縮。

。改寫系統(tǒng)的memorymap,原先flash起始地址映射為0地址,這時(shí)需要將RAM的起始地址映射為0.

。設(shè)置堆棧指針并將bss段清零。將來執(zhí)行c語言程序和調(diào)用子函數(shù)時(shí)要用到。

。改變pc值,使得cpu開始執(zhí)行真正的操作系統(tǒng)內(nèi)核。

(2)運(yùn)行操作系統(tǒng)內(nèi)核

bootloader程序執(zhí)行完上述的各項(xiàng)工作后,通過一條跳轉(zhuǎn)指令,轉(zhuǎn)而執(zhí)行ini目錄下c語言源文件main.c中的函數(shù)start_kernel()。因?yàn)樵诖酥癰ootloader已經(jīng)創(chuàng)建好一個(gè)初始化環(huán)境,

c函數(shù)可以開始執(zhí)行了。整個(gè)操作系統(tǒng)內(nèi)核的初始化工作從這里才算是真正開始。這個(gè)函數(shù)的長(zhǎng)度比較短,代碼如下:asmlinkagevoid__initstart_kernel(void)

{

char*command_line;

unsignedlongmempages;

externcharsaved_command_line[];

/*

*Interruptsarestilldisabled.Donecessarysetups,then

*enablethem

*/

lock_kernel();

printk(linux_banner);

setup_arch(&command_line);

printk("Kernelcommandline:%sn",saved_command_line);

parse_options(command_line);

trap_init();

init_IRQ();

sched_init();

softirq_init();

time_init();

/*

*HACKALERT!Thisisearly.We'reenablingtheconsolebefore

*we'vedonePCIsetupsetc,andconsole_init()mustbeawareof

*this.Butwedowantoutputearly,incasesomethinggoeswrong.

*/

console_init();

#ifdefCONFIG_MODULES

init_modules();

#endif

if(prof_shift){

unsignedintsize;

/*onlytextisprofiled*/

prof_len=(unsignedlong)&_etext-(unsignedlong)&_stext;

prof_len>>=prof_shift;

size=prof_len*sizeof(unsignedint)+PAGE_SIZE-1;

prof_buffer=(unsignedint*)alloc_bootmem(size);

}

kmem_cache_init();

sti();

calibrate_delay();

#ifdefCONFIG_BLK_DEV_INITRD

if(initrd_start&&!initrd_below_start_ok&&

initrd_start

printk(KERN_CRIT"initrdoverwritten(0x%08lx<0x%08lx)-"

"disablingit.n",initrd_start,min_low_pfn<

initrd_start=0;

}

#endif

mem_init();

kmem_cache_sizes_init();

pgtable_cache_init();

mempages=num_physpages;

[!--empirenews.page--]

fork_init(mempages);

proc_caches_init();

vfs_caches_init(mempages);

buffer_init(mempages);

page_cache_init(mempages);

#ifdefined(CONFIG_ARCH_S390)

ccwcache_init();

#endif

signals_init();

#ifdefCONFIG_PROC_FS

proc_root_init();

#endif

#ifdefined(CONFIG_SYSVIPC)

ipc_init();

#endif

check_bugs();

printk("POSIXconformancetestingbyUNIFIXn");

/*

*Wecountontheinitialthreadgoingok

*Likeidlersinitisanunlockedkernelthread,whichwill

*makesyscalls(andthusbelocked)。

*/

smp_init();

rest_init();

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

5.系統(tǒng)源碼的修改

移植一個(gè)操作系統(tǒng)到新的硬件平臺(tái),比較好的辦法是尋找一個(gè)架構(gòu)相近并且已經(jīng)做好操作系統(tǒng)移植的硬件平臺(tái)。然后,對(duì)原先的操作系統(tǒng)做一定修改。系統(tǒng)源碼修改的工作量取決于自行設(shè)計(jì)的硬件平臺(tái)與現(xiàn)有的硬件平臺(tái)之間差異程度。此設(shè)計(jì)中的硬件平臺(tái)與三星4510芯片較為接近,并且也可以下載到針對(duì)4510b的uclinux系統(tǒng)源碼。所以可以從此源碼入手,根據(jù)我們的硬件平臺(tái)與4510b的不同之處,在源碼中找到相應(yīng)的文件并加以修改。下面介紹如何修改系統(tǒng)源碼。

需要修改的系統(tǒng)源碼主要有如下幾處:

(1)bootloader相關(guān)代碼。此代碼位于uClinuxlinux-2.4.xarcharmnommubootcompressed目錄下名為head.s的文件中。此處程序用匯編語言實(shí)現(xiàn),需要修改的地方主要是設(shè)置memorymap的代碼,與memorycontroller的硬件實(shí)現(xiàn)相關(guān)。

(2)UART相關(guān)代碼。UART相關(guān)代碼位于uClinuxlinux-2.4.xdriverschar目錄下的serial.c

(3)定時(shí)器相關(guān)代碼。uClinux中有如下函數(shù)調(diào)用star_kernel()->time_init()->setup_timer(),需要修改setup_timer()函數(shù)中的相關(guān)代碼。

(4)中斷控制器相關(guān)。uClinuxlinux-2.4.xarcharmnommuirq.c

除了上述的代碼,還有其他多處需要修改。在修改源代碼時(shí),可按照uclinux啟動(dòng)和執(zhí)行順序依次修改整個(gè)平臺(tái)。熟悉linux內(nèi)核源碼結(jié)構(gòu)對(duì)操作系統(tǒng)移植有很大幫助。

本站聲明: 本文章由作者或相關(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日 /美通社/ -- 英國(guó)汽車技術(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中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

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

8月28日消息,在2024中國(guó)國(guó)際大數(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íng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

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

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(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年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

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