新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM Linux啟動(dòng)過(guò)程分析

ARM Linux啟動(dòng)過(guò)程分析

作者: 時(shí)間:2012-08-17 來(lái)源:網(wǎng)絡(luò) 收藏

1. 引 言

最初是由瑞典赫爾辛基大學(xué)的學(xué)生 Linus Torvalds在1991 年開發(fā)出來(lái)的,之后在 GNU的支持下, 獲得了巨大的發(fā)展。雖然 在桌面 PC 機(jī)上的普及程度遠(yuǎn)不及微軟的 Windows 操作系統(tǒng),但它的發(fā)展速度之快、用戶數(shù)量的日益增多,也是微軟所不能輕視的。而近些年來(lái) Linux 在嵌入式領(lǐng)域的迅猛發(fā)展,更是給 Linux 注入了新的活力。

一個(gè)嵌入式 Linux 系統(tǒng)從軟件角度看可以分為四個(gè)部分[1]:引導(dǎo)加載程序(),

Linux 內(nèi)核,文件系統(tǒng),應(yīng)用程序。

其中 是系統(tǒng)啟動(dòng)或復(fù)位以后執(zhí)行的第一段代碼,它主要用來(lái)初始化處理器及外設(shè),然后調(diào)用 Linux 內(nèi)核。Linux 內(nèi)核在完成系統(tǒng)的初始化之后需要掛載某個(gè)文件系統(tǒng)做為根文件系統(tǒng)(Root Filesystem)。根文件系統(tǒng)是 Linux 系統(tǒng)的核心組成部分,它可以做為L(zhǎng)inux 系統(tǒng)中文件和數(shù)據(jù)的存儲(chǔ)區(qū)域,通常它還包括系統(tǒng)配置文件和運(yùn)行應(yīng)用軟件所需要的庫(kù)。應(yīng)用程序可以說(shuō)是嵌入式系統(tǒng)的“靈魂”,它所實(shí)現(xiàn)的功能通常就是設(shè)計(jì)該嵌入式系統(tǒng)所要達(dá)到的目標(biāo)。如果沒有應(yīng)用程序的支持,任何硬件上設(shè)計(jì)精良的嵌入式系統(tǒng)都沒有實(shí)用意義。

從以上分析我們可以看出 和 Linux 內(nèi)核在嵌入式系統(tǒng)中的關(guān)系和作用。Bootloader在運(yùn)行過(guò)程中雖然具有初始化系統(tǒng)和執(zhí)行用戶輸入的命令等作用,但它最根本的功能就是為了啟動(dòng) Linux 內(nèi)核。在嵌入式系統(tǒng)開發(fā)的過(guò)程中,很大一部分精力都是花在bootloader 和 Linux 內(nèi)核的開發(fā)或移植上。如果能清楚的了解 bootloader 執(zhí)行流程和 Linux的,將有助于明確開發(fā)過(guò)程中所需的工作,從而加速嵌入式系統(tǒng)的開發(fā)過(guò)程。而這正是本文的所要研究的內(nèi)容。

2. Bootloader

2.1 Bootloader的概念和作用Bootloader是嵌入式系統(tǒng)的引導(dǎo)加載程序,它是系統(tǒng)上電后運(yùn)行的第一段程序,其作用類似于 PC 機(jī)上的 BIOS。在完成對(duì)系統(tǒng)的初始化任務(wù)之后,它會(huì)將非易失性存儲(chǔ)器(通常是 Flash或 DOC 等)中的Linux 內(nèi)核拷貝到 RAM 中去,然后跳轉(zhuǎn)到內(nèi)核的第一條指令處繼續(xù)執(zhí)行,從而啟動(dòng) Linux 內(nèi)核。由此可見,bootloader 和 Linux 內(nèi)核有著密不可分的聯(lián)系,要想清楚的了解 Linux內(nèi)核的,我們必須先得認(rèn)識(shí) bootloader的執(zhí)行過(guò)程,這樣才能對(duì)嵌入式系統(tǒng)的整個(gè)啟過(guò)程有清晰的掌握。

2.2 Bootloader的執(zhí)行過(guò)程不同的處理器上電或復(fù)位后執(zhí)行的第一條指令地址并不相同,對(duì)于 處理器來(lái)說(shuō),該地址為 0x00000000。對(duì)于一般的嵌入式系統(tǒng),通常把 Flash 等非易失性存儲(chǔ)器映射到這個(gè)地址處,而 bootloader就位于該存儲(chǔ)器的最前端,所以系統(tǒng)上電或復(fù)位后執(zhí)行的第一段程序便是 bootloader。而因?yàn)榇鎯?chǔ) bootloader的存儲(chǔ)器不同,bootloader的執(zhí)行過(guò)程也并不相同,下面將具體分析。

嵌入式系統(tǒng)中廣泛采用的非易失性存儲(chǔ)器通常是 Flash,而 Flash 又分為 Nor Flash 和Nand Flash 兩種。 它們之間的不同在于: Nor Flash 支持芯片內(nèi)執(zhí)行(XIP, eXecute In Place),這樣代碼可以在Flash上直接執(zhí)行而不必拷貝到RAM中去執(zhí)行。而Nand Flash并不支持XIP,所以要想執(zhí)行 Nand Flash 上的代碼,必須先將其拷貝到 RAM中去,然后跳到 RAM 中去執(zhí)行。實(shí)際應(yīng)用中的 bootloader根據(jù)所需功能的不同可以設(shè)計(jì)得很復(fù)雜,除完成基本的初始化系統(tǒng)和調(diào)用 Linux 內(nèi)核等基本任務(wù)外,還可以執(zhí)行很多用戶輸入的命令,比如設(shè)置 Linux 啟動(dòng)參數(shù),給 Flash 分區(qū)等;也可以設(shè)計(jì)得很簡(jiǎn)單,只完成最基本的功能。但為了能達(dá)到啟動(dòng)Linux 內(nèi)核的目的,所有的 bootloader都必須具備以下功能[2] :

1) 初始化 RAM

因?yàn)?Linux 內(nèi)核一般都會(huì)在 RAM 中運(yùn)行,所以在調(diào)用 Linux 內(nèi)核之前 bootloader 必須設(shè)置和初始化 RAM,為調(diào)用 Linux內(nèi)核做好準(zhǔn)備。初始化 RAM 的任務(wù)包括設(shè)置 CPU 的控制寄存器參數(shù),以便能正常使用 RAM 以及檢測(cè)RAM 大小等。

2) 初始化串口串口在 Linux 的中有著非常重要的作用,它是 Linux內(nèi)核和用戶交互的方式之一。Linux 在啟動(dòng)過(guò)程中可以將信息通過(guò)串口輸出,這樣便可清楚的了解 Linux 的啟動(dòng)過(guò)程。雖然它并不是 bootloader 必須要完成的工作,但是通過(guò)串口輸出信息是調(diào)試 bootloader 和Linux 內(nèi)核的強(qiáng)有力的工具,所以一般的 bootloader 都會(huì)在執(zhí)行過(guò)程中初始化一個(gè)串口做為調(diào)試端口。

3) 檢測(cè)處理器類型

Bootloader在調(diào)用 Linux內(nèi)核前必須檢測(cè)系統(tǒng)的處理器類型,并將其保存到某個(gè)常量中提供給 Linux 內(nèi)核。Linux 內(nèi)核在啟動(dòng)過(guò)程中會(huì)根據(jù)該處理器類型調(diào)用相應(yīng)的初始化程序。

4) 設(shè)置 Linux啟動(dòng)參數(shù)

Bootloader在執(zhí)行過(guò)程中必須設(shè)置和初始化 Linux 的內(nèi)核啟動(dòng)參數(shù)。目前傳遞啟動(dòng)參數(shù)主要采用兩種方式:即通過(guò) struct param_struct 和struct tag(標(biāo)記列表,tagged list)兩種結(jié)構(gòu)傳遞。struct param_struct 是一種比較老的參數(shù)傳遞方式,在 2.4 版本以前的內(nèi)核中使用較

多。從 2.4 版本以后 Linux 內(nèi)核基本上采用標(biāo)記列表的方式。但為了保持和以前版本的兼容性,它仍支持 struct param_struct 參數(shù)傳遞方式,只不過(guò)在內(nèi)核啟動(dòng)過(guò)程中它將被轉(zhuǎn)換成標(biāo)記列表方式。

標(biāo)記列表方式是種比較新的參數(shù)傳遞方式,它必須以 ATAG_CORE 開始,并以ATAG_NONE 結(jié)尾。中間可以根據(jù)需要加入其他列表。Linux內(nèi)核在啟動(dòng)過(guò)程中會(huì)根據(jù)該啟動(dòng)參數(shù)進(jìn)行相應(yīng)的初始化工作。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉