




已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ARM Linux啟動(dòng)過程分析趙楠 本章學(xué)習(xí)目標(biāo): l 了解Linux結(jié)構(gòu)及平臺(tái)屬性l 了解 bootloader的相關(guān)知識(shí) l 熟悉并掌握啟動(dòng)過程摘 要: 從嵌入式系統(tǒng)到超級(jí)服務(wù)站,嵌入式 Linux 的可移植性使得我們可以在各種電子產(chǎn)品上看到它的身影。Linux 是一個(gè)完整通用的Unix 類分布式操作系統(tǒng),它的結(jié)構(gòu)緊湊、功能強(qiáng)、效率高、可移植性好且在Internet 上可自由取用。對(duì)于不同體系結(jié)構(gòu)的處理器來說Linux的啟動(dòng)過程也有所不同。本文以S3C2410 ARM處理器為例,詳細(xì)分析了系統(tǒng)上電后 bootloader的執(zhí)行流程及 ARM Linux的啟動(dòng)過程。關(guān)鍵詞:ARM Linux bootloader 啟動(dòng)過程Abstract: from the embedded system to super service station, embedded Linux portability allows us to various electronic products in the form of seeing it. Linux is a complete general Unix class distributed operating system, its structure compact, the function is strong, high efficiency, good portability and in the Internet can be free to take. For different system structure of the processor is the start of the Linux process is also different. Based on the ARM processor S3C2410 as an example, the paper analyses system after the execution flow of electric bootloader and ARM Linux start-up process.Keywords: ARM Linux bootloader start-up process1. 引 言 Linux 最初是由瑞典赫爾辛基大學(xué)的學(xué)生 Linus Torvalds在1991 年開發(fā)出來的,之后在 GNU的支持下,Linux 獲得了巨大的發(fā)展。雖然 Linux 在桌面 PC 機(jī)上的普及程度遠(yuǎn)不及微軟的 Windows 操作系統(tǒng),但它的發(fā)展速度之快、用戶數(shù)量的日益增多,也是微軟所不能輕視的。從嵌入式系統(tǒng)到超級(jí)服務(wù)站,Linux 已獲得廣泛的應(yīng)用。Linux 是一個(gè)完整通用的Unix 類分布式操作系統(tǒng),它的結(jié)構(gòu)緊湊、功能強(qiáng)、效率高、可移植性好且在Internet 上可自由取用。Linux 和Unix 操作系統(tǒng)一樣,操作系統(tǒng)的主要功能集中在內(nèi)核,內(nèi)核中包含進(jìn)程管理、文件管理、設(shè)備管理和網(wǎng)絡(luò)管理等部分。近些年來 Linux 在嵌入式領(lǐng)域的迅猛發(fā)展,更是給 Linux 注入了新的活力。2.1 內(nèi)核結(jié)構(gòu)及平臺(tái)相關(guān)性 本文以分析的內(nèi)核版本為2.6.9。當(dāng)我們使用tar 命令將linux-2.6.9.tar.bz2 解開時(shí),內(nèi)核源代碼被放到了linux-2.6.9/目錄中。Linux 內(nèi)核各功能文件分別存放在linux-2.6.9/ 目錄下的相應(yīng)子目錄中。Linux 操作系統(tǒng)可以工作在多種不同硬件平臺(tái)上,如80x86CPU 系列(80386 以上)、SUN sparc64 和arm26 等。為了讓Linux 體現(xiàn)優(yōu)良的可移植性,Linux 內(nèi)核代碼針對(duì)不同的硬件平臺(tái)包含有對(duì)應(yīng)的啟動(dòng)和初始化程序。這些程序處于arch/子目錄中。用戶完全可以根據(jù)自己的需要,從內(nèi)核代碼中各取所需,即時(shí)編譯和更換系統(tǒng)內(nèi)核,這也是Linux 操作系統(tǒng)獲得世界各地網(wǎng)絡(luò)愛好者普遍支持的主要原因。鑒于絕大部分Linux 應(yīng)用于Intel 80x86 系列平臺(tái),所以本文也僅限對(duì)Linux在80x86 系列平臺(tái)的啟動(dòng)過程進(jìn)行分析。本文所要探討的啟動(dòng)程序位于arch/i386/boot/ 目錄,系統(tǒng)的啟動(dòng)過程主要由bootsect.s、setup.s 和head.s 等3 個(gè)匯編程序完成。其中 bootloader是系統(tǒng)啟動(dòng)或復(fù)位以后執(zhí)行的第一段代碼,它主要用來初始化處理器及外設(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)用程序可以說是嵌入式系統(tǒng)的“靈魂”,它所實(shí)現(xiàn)的功能通常就是設(shè)計(jì)該嵌入式系統(tǒng)所要達(dá)到的目標(biāo)。如果沒有應(yīng)用程序的支持,任何硬件上設(shè)計(jì)精良的嵌入式系統(tǒng)都沒有實(shí)用意義。 從以上分析我們可以看出 bootloader 和 Linux 內(nèi)核在嵌入式系統(tǒng)中的關(guān)系和作用。Bootloader在運(yùn)行過程中雖然具有初始化系統(tǒng)和執(zhí)行用戶輸入的命令等作用,但它最根本的功能就是為了啟動(dòng) Linux 內(nèi)核。在嵌入式系統(tǒng)開發(fā)的過程中,很大一部分精力都是花在bootloader 和 Linux 內(nèi)核的開發(fā)或移植上。如果能清楚的了解 bootloader 執(zhí)行流程和 Linux的啟動(dòng)過程,將有助于明確開發(fā)過程中所需的工作,從而加速嵌入式系統(tǒng)的開發(fā)過程。而這正是本文的所要研究的內(nèi)容。3. Bootloader3.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)核的啟動(dòng)過程,我們必須先得認(rèn)識(shí) bootloader的執(zhí)行過程,這樣才能對(duì)嵌入式系統(tǒng)的整個(gè)啟過程有清晰的掌握。3.2 Bootloader的執(zhí)行過程不同的處理器上電或復(fù)位后執(zhí)行的第一條指令地址并不相同,對(duì)于 ARM 處理器來說,該地址為 0x00000000。對(duì)于一般的嵌入式系統(tǒng),通常把 Flash 等非易失性存儲(chǔ)器映射到這個(gè)地址處,而 bootloader就位于該存儲(chǔ)器的最前端,所以系統(tǒng)上電或復(fù)位后執(zhí)行的第一段程序便是 bootloader。而因?yàn)榇鎯?chǔ) bootloader的存儲(chǔ)器不同,bootloader的執(zhí)行過程也并不相同,下面將具體分析。 嵌入式系統(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都必須具備以下功能 : 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 的啟動(dòng)過程中有著非常重要的作用,它是 Linux內(nèi)核和用戶交互的方式之一。Linux 在啟動(dòng)過程中可以將信息通過串口輸出,這樣便可清楚的了解 Linux 的啟動(dòng)過程。雖然它并不是 bootloader 必須要完成的工作,但是通過串口輸出信息是調(diào)試 bootloader 和Linux 內(nèi)核的強(qiáng)有力的工具,所以一般的 bootloader 都會(huì)在執(zhí)行過程中初始化一個(gè)串口做為調(diào)試端口。 3.檢測(cè)處理器類型 Bootloader在調(diào)用 Linux內(nèi)核前必須檢測(cè)系統(tǒng)的處理器類型,并將其保存到某個(gè)常量中提供給 Linux 內(nèi)核。Linux 內(nèi)核在啟動(dòng)過程中會(huì)根據(jù)該處理器類型調(diào)用相應(yīng)的初始化程序。 4. 設(shè)置 Linux啟動(dòng)參數(shù) Bootloader在執(zhí)行過程中必須設(shè)置和初始化 Linux 的內(nèi)核啟動(dòng)參數(shù)。目前傳遞啟動(dòng)參數(shù)主要采用兩種方式:即通過 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ù)傳遞方式,只不過在內(nèi)核啟動(dòng)過程中它將被轉(zhuǎn)換成標(biāo)記列表方式。標(biāo)記列表方式是種比較新的參數(shù)傳遞方式,它必須以 ATAG_CORE 開始,并以ATAG_NONE 結(jié)尾。中間可以根據(jù)需要加入其他列表。Linux內(nèi)核在啟動(dòng)過程中會(huì)根據(jù)該啟動(dòng)參數(shù)進(jìn)行相應(yīng)的初始化工作。 5.調(diào)用 Linux內(nèi)核映像 Bootloader完成的最后一項(xiàng)工作便是調(diào)用 Linux內(nèi)核。如果 Linux 內(nèi)核存放在 Flash 中,并且可直接在上面運(yùn)行(這里的 Flash 指 Nor Flash),那么可直接跳轉(zhuǎn)到內(nèi)核中去執(zhí)行。但由于在 Flash 中執(zhí)行代碼會(huì)有種種限制,而且速度也遠(yuǎn)不及 RAM 快,所以一般的嵌入式系統(tǒng)都是將 Linux內(nèi)核拷貝到 RAM 中,然后跳轉(zhuǎn)到 RAM 中去執(zhí)行。不論哪種情況,在跳到 Linux 內(nèi)核執(zhí)行之前 CUP的寄存器必須滿足以下條件:r00,r1處理器類型,r2標(biāo)記列表在 RAM中的地址。4. 啟動(dòng)過程分析主要對(duì)bootsect.s、setup.s 和head.s 的工作機(jī)理做了較為詳細(xì)的闡述。4.1 bootsect 模塊分析 bootsect.s 代碼是磁盤引導(dǎo)塊程序,駐留在引導(dǎo)盤的引導(dǎo)扇區(qū)(0 磁道,0 磁頭,第1 扇區(qū))。在PC加電ROM BIOS 自檢后,bootsect.s 由BIOS 自動(dòng)加載到內(nèi)存0x7C00 處,然后將自己移到內(nèi)存0x90000 處。圖2 代碼顯示了bootsect.s 的移動(dòng)過程,其中#BOOTSEG 為0x7C00,#INITSEG 為0x9000。接下來,程序利用BIOS中斷,INT 0x13 將setup 模塊從磁盤第2 個(gè)扇區(qū)開始讀到0x90200 開始處,共讀4 個(gè)扇區(qū)。如果讀出錯(cuò)誤,則CF標(biāo)志置位,程序復(fù)位驅(qū)動(dòng)器,并重試。加載setup 模塊后,程序利用中斷取磁盤驅(qū)動(dòng)器參數(shù),并將中斷返回的每磁道扇區(qū)數(shù)保存在變量sectors 中。然后程序?qū)ystem 模塊加載到內(nèi)存0x10000 處。加載system 模塊期間,顯示“Loading system”信息。為了提高加載速度,只要可能,就每次加載整條磁道的數(shù)據(jù)。從磁盤讀取一次數(shù)據(jù)后,程序就比較當(dāng)前所讀段是否就是系統(tǒng)數(shù)據(jù)末端所處的段(#ENDSEG),如果不是,就跳轉(zhuǎn)至ok1_read 標(biāo)號(hào)處繼續(xù)讀數(shù)據(jù)。最后,程序向軟驅(qū)控制卡的驅(qū)動(dòng)端口0x3f2 寫0,關(guān)閉軟驅(qū)電動(dòng)機(jī)。程序運(yùn)行jmpi 0,SETUPSEG,跳轉(zhuǎn)到0x9020:0000 處,CPU開始執(zhí)行setup 模塊。 圖2 bootsect 移動(dòng)代碼4.2 setup 模塊分析 setup.s首先利用ROMBIOS中斷讀取機(jī)器系統(tǒng)參數(shù)(光標(biāo)位置、擴(kuò)展內(nèi)存數(shù)、硬盤參數(shù)表等),并將這些數(shù)據(jù)保存到內(nèi)存0x90000 開始的位置(覆蓋掉了bootsect 程序)。這些參數(shù)將被內(nèi)核中相關(guān)程序使用,例如設(shè)備驅(qū)動(dòng)程序集中的ttyio.c。隨后系統(tǒng)進(jìn)入保護(hù)模式運(yùn)行。CPU 在實(shí)模式下運(yùn)行,尋址一個(gè)內(nèi)存地址主要是使用段基址和段內(nèi)偏移值,段值被存放在段寄存器中;而在保護(hù)模式運(yùn)行方式下,段寄存器中存放的是一個(gè)描述表中某項(xiàng)的索引值。索引值指定的描述符項(xiàng)中含有需要尋址的內(nèi)存段的基地址、段的最大長(zhǎng)度值和段的訪問級(jí)別等信息。和實(shí)模式下的尋址相比,段寄存器值換成了段描述符項(xiàng)索引。接下來,程序關(guān)閉中斷,將system模塊整體向內(nèi)存低端移動(dòng)0x1000。每次移動(dòng)0x8000 字,循環(huán)執(zhí)行8 次。然后程序執(zhí)行l(wèi)idt idt_48 加載中斷描述符表(idt)寄存器;執(zhí)行l(wèi)gdt gdt_48 加載全局描述符表(gdt)寄存器。此時(shí)中斷描述符表中只有一個(gè)空項(xiàng)(值全為0)。全局描述符表中有3 個(gè)描述符項(xiàng):第1 項(xiàng)無用,但必須存在;第2 項(xiàng)(索引值0x08)是系統(tǒng)代碼段描述符,所定義的段基址為0,段中代碼可被讀和執(zhí)行,段長(zhǎng)為8 M;第3項(xiàng)(索引值0x10) 是系統(tǒng)數(shù)據(jù)段描述符,所定義的段的基址為0,段中數(shù)據(jù)可讀和可寫,段限長(zhǎng)為8M。最后,程序重置協(xié)處理器,對(duì)8259 中斷控制芯片編程,完成進(jìn)入保護(hù)虛地址模式的所有準(zhǔn)備工作。通過設(shè)置機(jī)器狀態(tài)字MSW(第0 號(hào)控制寄存器CR0 的低16 位)中的PE 位使CPU進(jìn)入保護(hù)模式,開始運(yùn)行system模塊中的head.s(指令jmpi 0,8)。注意,CPU 已在保護(hù)模式下運(yùn)行,CS 置8 表示請(qǐng)求特權(quán)級(jí)0,使用全局描述符表中的第1 項(xiàng)(索引值0x08)。圖3 顯示了setup.s 結(jié)束后內(nèi)存分布。 圖3 setup 結(jié)束
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能家居產(chǎn)品分銷渠道拓展及售后服務(wù)保障協(xié)議
- 教育培訓(xùn)廣告視頻后期制作及推廣合同
- 網(wǎng)紅奶茶區(qū)域代理權(quán)合作與品牌營(yíng)銷支持合同
- 工業(yè)級(jí)3D打印耗材倉(cāng)儲(chǔ)租賃及配送服務(wù)合同
- 部編語(yǔ)文八年級(jí)上冊(cè)課外活動(dòng)計(jì)劃
- 防塵設(shè)備采購(gòu)合同
- 會(huì)議紀(jì)念品采購(gòu)合同
- 高壓清洗設(shè)備采購(gòu)協(xié)議
- 酒店托管合同范本
- 汽車保險(xiǎn)維修服務(wù)合同
- (完整版)馬克思主義基本原理概論知識(shí)點(diǎn)
- 良性陣發(fā)性位置性眩暈完整版本課件
- 液壓系統(tǒng)故障診斷分析課件
- “安全月”安全生產(chǎn)知識(shí)競(jìng)賽參賽隊(duì)伍報(bào)名表
- 老化箱點(diǎn)檢表A4版本
- GB∕T 10054.1-2021 貨用施工升降機(jī) 第1部分:運(yùn)載裝置可進(jìn)人的升降機(jī)
- 超高性能混凝土研究進(jìn)展及工程應(yīng)用199頁(yè)P(yáng)PT_ppt
- 視覺心理學(xué)(全套400頁(yè)P(yáng)PT課件)
- 設(shè)計(jì)學(xué)概論設(shè)計(jì)批評(píng)課件
- 員工領(lǐng)用勞保用品表格
- 教你如何填省普通高中學(xué)生檔案
評(píng)論
0/150
提交評(píng)論