嵌入式uCLinux核心啟動過程分析與設計(ZT)

來源:互聯網
上載者:User
 

摘要:本文介紹了ARM+uCLinux嵌入式系統的結構,重點分析了uCLinux作業系統啟動引導過程,給出了基於一種實際應用系統如何設計uCLinux啟動代碼。該方法已成功應用於實際系統中。
關鍵詞:ARM  uCLinux  啟動引導

0 引言
    32位ARM嵌入式處理器具有高效能、低功耗、高性價比的特性,已被廣泛應用於消費電子產品、無線通訊、控制和網路通訊等領域。uCLinux是專門為無MMU處理器設計的嵌入式作業系統,已支援ARM、Motorola等微處理器。目前採用ARM+uCLinux作為嵌入式系統的一種開發模式非常普遍。
    一個基於uCLinux的完整的嵌入式系統由三個部分組成,即系統引導程式Bootloader、uCLinux作業系統核心和檔案系統。嵌入式系統的啟動引導技術是嵌入式系統開發的一個痛點,系統啟動引導的成功與否決定了應用程式的運行環境是否能正確建立,系統啟動成功是應用正確啟動並執行前提。而uCLinux核心的啟動過程也是其中重要一環,分析uCLinux的啟動過程,可以加快系統啟動速度、正確建立應用環境。本文要研究的就是uCLinux作業系統核心的啟動過程。

1 系統簡介
    本系統採用SamSung公司的Arm7TDMI核心的S3C4510B處理器,主要利用其強大的網路功能,與PC機進行網路通訊。該系統的主要功能是利用串口監測一種智能電錶,將獲得的資料通過Internet傳給PC機,由PC機再做進一步的處理,將最終結果呈現給使用者。
    硬體平台包括一個以ARM為核心的處理器、儲存空間使用2MB的Flash和16MB的SDRAM,外部介面除了通訊的串口,還外接了一個乙太網路介面,以支援S3C4510B的網路功能。軟體平台由以下部分組成:系統引導程式Bootloader、嵌入式作業系統核心、檔案系統。
    根據核心是否壓縮以及核心是否在本地執行,uCLinux通常有兩種啟動方式:flash本地執行方式和壓縮核心載入方式。本系統採用第二種啟動方案,即核心的壓縮映象固化到flash上,系統啟動時在記憶體中解壓,然後在記憶體中執行,這種啟動方式相比第一種方式運行速度更快。

2 uCLinux核心啟動過程的實現
    可將ARM+uCLinux系統的啟動過程總結為以下幾個階段:(1)PC指向複位地址入口處,即0x0H處的Bootloader代碼。Bootloader完成一些基本的初始化,將系統的軟硬體環境帶到一個合適的狀態;(2)Bootloader將控制權交給作業系統核心的引導程式後,開始uCLinux核心的載入;(3)uCLinux核心載入引導完成,啟動init進程,完成系統的引導過程。
    本系統的啟動方案採用uCLinux內建的引導程式載入核心。在核心啟動過程中主要調用這幾個檔案:head.S(在/linux-2.4.x/arch/armnommu/boot/compressed/目錄下)、main.c(在/linux-2.4.x/init/init/目錄下)、simpleinit.c(在/user/init/目錄下)[1]。實際應用中應根據硬體平台和系統功能,修改相關檔案,以正確地引導系統。
    當Bootloader將控制權交給核心的引導程式時,第一個執行的程式就是head.S,它完成了載入核心的大部分工作;misc.c則提供載入核心所需要的子程式,其中解壓核心的子程式是head.S調用的重要程式,另外核心的載入還須知道系統的硬體資訊,該硬體資訊在hardware.h中定義並被head.S所引用。本系統中核心的啟動流程1所示。


    本系統中,head.S首先配置S3C4510B的系統寄存器SYSCFG、初始化系統的Flash、SDRAM以及匯流排控制寄存器,將Flash和SDRAM的位址範圍分別設定為0x0-0x1fffff和0x1000000-0x1ffffff;根據本系統的功能特點,重新定義了中斷優先順序以及I/O口的配置;為了提高核心的運行速度,將2M的核心映像檔案從Flash拷貝到SDRAM;通過操作一些系統寄存器,進行系統的儲存空間重新對應,將Flash和SDRAM的地址區間分別重新對應為0x1000000-0x11fffff和0x0-0xffffff;然後初始化系統堆棧;接著調用misc.c中的函數decompress_kernel,對拷貝到SDRAM的核心映像檔案進行解壓縮;最後跳轉到執行調用核心功能call_kernel,調用call_kernel函數實際上是執行main.c中的start_kernel函數,該函數完成的功能包括處理器結構的初始化、中斷的初始化、定時器的初始化、進程相關的初始化以及記憶體初始化等初始化工作;最後核心建立一個init線程,在該線程中調用init進程,完成系統的啟動[1][2]。
    值得再次注意的是,在核心啟動過程中,調用了在檔案hardware.h中定義的與硬體有關的資訊。基於Linux的嵌入式系統的啟動是嚴重依賴於硬體平台的,在核心啟動引導前,必鬚根據硬體平台和系統功能,修改必要的檔案[2]。本系統中就修改了hardware.h中的flash、SDRAM的控制寄存器ROMCON0、DRAMCON0和SYSCFG等。
    uCLinux啟動時,運行一個叫做init的程式,它是由作業系統啟動的使用者級進程,由它來啟動後面的任務,包括多使用者環境、網路等。init進程的行為是在函數simpleinit.c中定義的,所以可根據系統的功能定製init進程的行為,如在本系統中加入了串口控製程序,還可以利用printk函數列印出必要的調試資訊。當init進程啟動時,它讀取一個運行控制檔案rc和一個設定檔inittab。在嵌入式應用中,一般需要在作業系統運行起來後立刻運行使用者的特定程式,為此可考慮修改這兩個檔案。本系統中就是恰當地修改了inittab檔案和rc檔案,以使系統啟動後即運行一些特定進程。在程式inittab.c中修改inittab檔案,然後通過向init進程發送SIGHUP訊號,即kill(1,SIGHUP),使init進程重新讀取設定檔inittab[3]。
inittab.c檔案中的部分代碼如下:
FILE *pFile;
if((pFile=fopen("/etc/inittab","w"))!=NULL){
    fprintf(pFile,"pollmeter:unknown:/bin/pollmeter/r/n");
    fprintf(pFile,"netcomm:unknown:/bin/netcomm/r/n");
……
}
......
kill(1,SIGHUP);  //init進程的ID等於1
……
    在啟動過程中還有一個重要的連結指令檔,在該檔案中指明了核心的入口地址。
    總之,uCLinux的啟動過程也較複雜,其中要調用許多檔案,要能正確的啟動uCLinux作業系統,就必鬚根據硬體平台和系統功能,修改相關的原始碼檔案。

3 結束語
本文分析了核心的啟動引導過程,並根據應用系統的特點修改了啟動代碼以及必要的相關檔案,完成了uCLinux核心的正確引導。實際應用表明,本系統的啟動設計正確可靠。本文的分析設計方法對嵌入式Linux的開發有很大的借鑒價值,相信Linux在嵌入式系統中的應用一定會越來越廣[4]。

參考文獻:
[1] uCLinux核心原始碼包20040408,核心版本2.4.18
[2]《ARM應用系統開發詳解:基於S3C4510B的系統設計》李駒光 清華大學出版社
[3]《unix處理序間通訊》[美] John Shapley Gray 著 張寧 等譯 電子工業出版社
[4]《基於Linux嵌入式系統的研究與實現》電腦系統應用 2004.8
[5]《基於Linux的嵌入式系統的啟動設計》電子科技2004.6

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.