1.引言
linux最初是由瑞典赫爾辛基大學的學生linus torvalds在2023年開發出來的,之後在gnu的支援下,linux獲得了巨大的發展。雖然linux在桌面pc機上的普及程度遠不及微軟的windows作業系統,但它的發展速度之快、使用者數量的日益增多,也是微軟所不能輕視的。而近些年來linux在嵌入式領域的迅猛發展,更是給linux注入了新的活力。
乙個嵌入式linux系統從軟體角度看可以分為四個部分:引導引導程式(bootloader),linux核心,檔案系統,應用程式。
其中bootloader是系統啟動或復位以後執行的第一段**,它主要用來初始化處理器及外設,然後呼叫linux核心。linux核心在完成系統的初始化之後需要掛載某個檔案系統做為根檔案系統(root filesystem)。根檔案系統是linux系統的核心組成部分,它可以做為linux系統中檔案和資料的儲存區域,通常它還包括系統配置檔案和執行應用軟體所需要的庫。應用程式可以說是嵌入式系統的「靈魂」,它所實現的功能通常就是設計該嵌入式系統所要達到的目標。如果沒有應用程式的支援,任何硬體上設計精良的嵌入式系統都沒有實用意義。
從以上分析我們可以看出bootloader和linux核心在嵌入式系統中的關係和作用。bootloader在執行過程中雖然具有初始化系統和執行使用者輸入的命令等作用,但它最根本的功能就是為了啟動linux核心。在嵌入式系統開發的過程中,很大一部分精力都是花在bootloader和linux核心的開發或移植上。如果能清楚的了解bootloader執行流程和linux的啟動過程,將有助於明確開發過程中所需的工作,從而加速嵌入式系統的開發過程。而這正是本文的所要研究的內容。
2.bootloader
2.1 bootloader的概念和作用
bootloader是嵌入式系統的引導引導程式,它是系統上電後執行的第一段程式,其作用類似於pc機上的bios。在完成對系統的初始化任務之後,它會將非易失性儲存器(通常是flash或doc等)中的linux核心拷貝到ram中去,然後跳轉到核心的第一條指令處繼續執行,從而啟動linux核心。由此可見,bootloader和linux核心有著密不可分的聯絡,要想清楚的了解linux核心的啟動過程,我們必須先得認識bootloader的執行過程,這樣才能對嵌入式系統的整個啟過程有清晰的掌握。
2.2 bootloader的執行過程
不同的處理器上電或復位後執行的第一條指令位址並不相同,對於arm處理器來說,該位址為0x00000000。對於一般的嵌入式系統,通常把flash等非易失性儲存器對映到這個位址處,而bootloader就位於該儲存器的最前端,所以系統上電或復位後執行的第一段程式便是bootloader。而因為儲存bootloader的儲存器不同,bootloader的執行過程也並不相同,下面將具體分析。
嵌入式系統中廣泛採用的非易失性儲存器通常是flash,而flash又分為nor flash和nand flash兩種。它們之間的不同在於:nor flash支援晶元內執行(xip,execute in place),這樣**可以在flash上直接執行而不必拷貝到ram中去執行。而nand flash並不支援xip,所以要想執行nand flash上的**,必須先將其拷貝到ram中去,然後跳到ram中去執行。實際應用中的bootloader根據所需功能的不同可以設計得很複雜,除完成基本的初始化系統和呼叫linux核心等基本任務外,還可以執行很多使用者輸入的命令,比如設定linux啟動引數,給flash分割槽等;也可以設計得很簡單,只完成最基本的功能。但為了能達到啟動linux核心的目的,所有的bootloader都必須具備以下功能:
1)初始化ram
因為linux核心一般都會在ram中執行,所以在呼叫linux核心之前bootloader必須設定和初始化ram,為呼叫linux核心做好準備。初始化ram的任務包括設定cpu的控制暫存器引數,以便能正常使用ram以及檢測ram大小等。
2)初始化串列埠串列埠
在linux的啟動過程中有著非常重要的作用,它是linux核心和使用者互動的方式之一。linux在啟動過程中可以將資訊通過串列埠輸出,這樣便可清楚的了解linux的啟動過程。雖然它並不是bootloader必須要完成的工作,但是通過串列埠輸出資訊是除錯bootloader和linux核心的強有力的工具,所以一般的bootloader都會在執行過程中初始化乙個串列埠做為除錯埠。
3)檢測處理器型別
bootloader在呼叫linux核心前必須檢測系統的處理器型別,並將其儲存到某個常量中提供給linux核心。linux核心在啟動過程中會根據該處理器型別呼叫相應的初始化程式。
4)設定linux啟動引數
bootloader在執行過程中必須設定和初始化linux的核心啟動引數。目前傳遞啟動引數主要採用兩種方式:即通過struct param_struct和struct tag(標記列表,tagged list)兩種結構傳遞。struct param_struct是一種比較老的引數傳遞方式,在2.4版本以前的核心中使用較多。從2.4版本以後linux核心基本上採用標記列表的方式。但為了保持和以前版本的相容性,它仍支援struct param_struct引數傳遞方式,只不過在核心啟動過程中它將被轉換成標記列表方式。
標記列表方式是種比較新的引數傳遞方式,它必須以atag_core開始,並以atag_none結尾。中間可以根據需要加入其他列表。linux核心在啟動過程中會根據該啟動引數進行相應的初始化工作。
5)呼叫linux核心映像
bootloader完成的最後一項工作便是呼叫linux核心。如果linux核心存放在flash中,並且可直接在上面執行(這裡的flash指nor flash),那麼可直接跳轉到核心中去執行。但由於在flash中執行**會有種種限制,而且速度也遠不及ram快,所以一般的嵌入式系統都是將linux核心拷貝到ram中,然後跳轉到ram中去執行。不論哪種情況,在跳到linux核心執行之前cup的暫存器必須滿足以下條件:r0=0,r1=處理器型別,r2=標記列表在ram中的位址。
最近乙個project 開關機壓力測試過不了,可能是r0=0 這個沒有做!!!
嵌入式Linux啟動過程 2
3 linux核心的啟動過程 在 bootloader將 linux 核心映像拷貝到 ram 以後,可以通過下例 啟動 linux 核心 call linux 0,machine type,kernel params base 其中,machine tpye 是 bootloader檢測出來的處理器...
嵌入式Linux啟動過程 2
3 linux核心的啟動過程 在bootloader將linux核心映像拷貝到ram以後,可以通過下例 啟動linux核心 call linux 0,machine type,kernel params base 其中,machine tpye是bootloader檢測出來的處理器型別,kernel...
嵌入式Linux系統啟動過程
乙個嵌入式 linux 系統從軟體角度看可以分為四個部分 引導引導程式 bootloader linux 核心,檔案系統,應用程式。當系統首次引導時,或系統被重置時,處理器會執行乙個位於flash rom中的已知位置處的 bootloader就是這第一段 它主要用來初始化處理器及外設,然後呼叫 li...