




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、1重點回顧重點回顧TCP通信過程通信過程2重點回顧重點回顧UDP通信過程*3第三章第三章 基于基于Linux的嵌入式軟件開發(fā)的嵌入式軟件開發(fā)3.1 嵌入式軟件結(jié)構(gòu)嵌入式軟件結(jié)構(gòu)3.2 嵌入式軟件開發(fā)流程嵌入式軟件開發(fā)流程3.3 嵌入式嵌入式linux開發(fā)環(huán)境開發(fā)環(huán)境3.4 嵌入式系統(tǒng)引導代碼嵌入式系統(tǒng)引導代碼3.5 linux內(nèi)核結(jié)構(gòu)及移植內(nèi)核結(jié)構(gòu)及移植3.6 嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植3.7 linux設備驅(qū)動概述設備驅(qū)動概述 3.8 設備驅(qū)動程序接口設備驅(qū)動程序接口3.9 linux設備驅(qū)動開發(fā)流程設備驅(qū)動開發(fā)流程*43.1 嵌入式軟件結(jié)構(gòu)嵌入式軟件結(jié)構(gòu)3.1.1 嵌入式軟件
2、體系結(jié)構(gòu)嵌入式軟件體系結(jié)構(gòu)3.1.2 基于基于Linux的嵌入式軟件的嵌入式軟件*53.1.1 嵌入式軟件體系結(jié)構(gòu)嵌入式軟件體系結(jié)構(gòu)*61. 設備驅(qū)動層設備驅(qū)動層設備驅(qū)動層是嵌入式系統(tǒng)中必不可少的重設備驅(qū)動層是嵌入式系統(tǒng)中必不可少的重要部分,使用任何外部設備都需要有相應要部分,使用任何外部設備都需要有相應驅(qū)動程序的支持,它為上層軟件提供了設驅(qū)動程序的支持,它為上層軟件提供了設備的操作接口。備的操作接口。上層軟件不用理會設備的具體內(nèi)部操作,上層軟件不用理會設備的具體內(nèi)部操作,只需調(diào)用驅(qū)動層程序提供的接口即可。只需調(diào)用驅(qū)動層程序提供的接口即可。驅(qū)動層一般包括硬件抽象層驅(qū)動層一般包括硬件抽象層HAL
3、、板級支、板級支持包持包BSP和設備驅(qū)動程序。和設備驅(qū)動程序。*72. 實時操作系統(tǒng)實時操作系統(tǒng)RTOS對于使用操作系統(tǒng)的嵌入式系統(tǒng)而言,操作系統(tǒng)一對于使用操作系統(tǒng)的嵌入式系統(tǒng)而言,操作系統(tǒng)一般以內(nèi)核映像的形式下載到目標系統(tǒng)中。般以內(nèi)核映像的形式下載到目標系統(tǒng)中。以以Linux為例,在系統(tǒng)開發(fā)完成之后,將整個操作為例,在系統(tǒng)開發(fā)完成之后,將整個操作系統(tǒng)部分做成內(nèi)核映像文件,與文件系統(tǒng)一起傳送系統(tǒng)部分做成內(nèi)核映像文件,與文件系統(tǒng)一起傳送到目標系統(tǒng)中;然后通過到目標系統(tǒng)中;然后通過BootLoader指定地址運指定地址運行行Linux內(nèi)核,啟動已經(jīng)下載好的嵌入式內(nèi)核,啟動已經(jīng)下載好的嵌入式Linu
4、x系系統(tǒng);再通過操作系統(tǒng)解開文件系統(tǒng),運行應用程序。統(tǒng);再通過操作系統(tǒng)解開文件系統(tǒng),運行應用程序。整個嵌入式系統(tǒng)與通用操作系統(tǒng)類似,功能比不帶整個嵌入式系統(tǒng)與通用操作系統(tǒng)類似,功能比不帶有操作系統(tǒng)的嵌入式系統(tǒng)強大了很多。有操作系統(tǒng)的嵌入式系統(tǒng)強大了很多。*83. 中間件層中間件層中間件(中間件(middleware)是基礎軟件的一大)是基礎軟件的一大類,屬于可復用軟件的范疇。類,屬于可復用軟件的范疇。顧名思義,中間件處于操作系統(tǒng)軟件與用顧名思義,中間件處于操作系統(tǒng)軟件與用戶的應用軟件的中間。戶的應用軟件的中間。中間件在操作系統(tǒng)、網(wǎng)絡和數(shù)據(jù)庫之上,中間件在操作系統(tǒng)、網(wǎng)絡和數(shù)據(jù)庫之上,應用軟件的下
5、層,總的作用是為處于自己應用軟件的下層,總的作用是為處于自己上層的應用軟件提供運行與開發(fā)的環(huán)境,上層的應用軟件提供運行與開發(fā)的環(huán)境,幫助用戶靈活、高效地開發(fā)和集成復雜的幫助用戶靈活、高效地開發(fā)和集成復雜的應用軟件。應用軟件。*94. 應用程序應用程序?qū)嶋H的嵌入式系統(tǒng)應用軟件建立在系統(tǒng)的實際的嵌入式系統(tǒng)應用軟件建立在系統(tǒng)的主任務主任務(Main Task)基礎之上。基礎之上。用戶應用程序主要通過調(diào)用系統(tǒng)的用戶應用程序主要通過調(diào)用系統(tǒng)的API函數(shù)函數(shù)對系統(tǒng)進行操作,完成用戶應用功能開發(fā)。對系統(tǒng)進行操作,完成用戶應用功能開發(fā)。在用戶的應用程序中,也可創(chuàng)建用戶自己在用戶的應用程序中,也可創(chuàng)建用戶自己的
6、任務。任務之間的協(xié)調(diào)主要依賴于系統(tǒng)的任務。任務之間的協(xié)調(diào)主要依賴于系統(tǒng)的消息隊。的消息隊。 *103.1.2 基于基于Linux的嵌入式軟件的嵌入式軟件基于嵌入式基于嵌入式Linux的軟件結(jié)構(gòu)如圖所的軟件結(jié)構(gòu)如圖所示,在硬件之上的示,在硬件之上的是引導程序是引導程序BootLoader,然后,然后是是Linux內(nèi)核,最內(nèi)核,最上層是應用程序。上層是應用程序。 *111. BootLoader引導裝載程序通常是在任何硬件上執(zhí)行的第一段引導裝載程序通常是在任何硬件上執(zhí)行的第一段代碼。代碼。在象臺式機這樣的常規(guī)系統(tǒng)中,通常將引導裝載在象臺式機這樣的常規(guī)系統(tǒng)中,通常將引導裝載程序裝入主引導記錄(程序裝
7、入主引導記錄(Master Boot Record,(MBR))中,或者裝入)中,或者裝入 Linux 駐留的磁盤的第一駐留的磁盤的第一個扇區(qū)中。個扇區(qū)中。通常,在臺式機或其它系統(tǒng)上,通常,在臺式機或其它系統(tǒng)上,BIOS 將控制移將控制移交給引導裝載程序。而在嵌入式系統(tǒng)中,通常并交給引導裝載程序。而在嵌入式系統(tǒng)中,通常并沒有像沒有像BIOS那樣的固件程序,因此整個系統(tǒng)的加那樣的固件程序,因此整個系統(tǒng)的加載啟動任務就完全由載啟動任務就完全由BootLoader來完成。來完成。*121. BootLoader通過這段小程序,我們可以初始化硬件設通過這段小程序,我們可以初始化硬件設備、建立內(nèi)存空間的
8、映射圖,從而將系統(tǒng)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。境。常見的常見的BootLoader有有uboot、vivi等。引等。引導程序的開發(fā)主要是做一些移植工作。導程序的開發(fā)主要是做一些移植工作。 *132. 內(nèi)核內(nèi)核Linux 內(nèi)核的開發(fā)主要包括內(nèi)核的開發(fā)主要包括Linux內(nèi)核的定制、內(nèi)核的定制、裁剪等工作。裁剪等工作。在嵌入式開發(fā)中經(jīng)常要面對設備驅(qū)動程序的開在嵌入式開發(fā)中經(jīng)常要面對設備驅(qū)動程序的開發(fā),嵌入式系統(tǒng)通常有許多設備用于與用戶交發(fā),嵌入式
9、系統(tǒng)通常有許多設備用于與用戶交互,象觸摸屏、小鍵盤、滾動輪、傳感器、互,象觸摸屏、小鍵盤、滾動輪、傳感器、RS232 接口、接口、LCD 等等。等等。除了這些設備外,還有許多其它專用設備,包除了這些設備外,還有許多其它專用設備,包括閃存、括閃存、USB、GSM 等。等。內(nèi)核通過所有這些設備各自的設備驅(qū)動程序來內(nèi)核通過所有這些設備各自的設備驅(qū)動程序來控制它們,包括控制它們,包括 GUI 用戶應用程序也通過訪問用戶應用程序也通過訪問這些驅(qū)動程序來訪問設備。這些驅(qū)動程序來訪問設備。 *143. 應用程序應用程序?qū)τ谇度胧綄τ谇度胧絃inux的應用,大多數(shù)的應用并不需的應用,大多數(shù)的應用并不需要圖形界
10、面,比如交換機、路由器、嵌入式網(wǎng)要圖形界面,比如交換機、路由器、嵌入式網(wǎng)關以及服務器等等。關以及服務器等等。但是,隨著消費類電子的普及,越來越多的嵌但是,隨著消費類電子的普及,越來越多的嵌入式產(chǎn)品如多媒體播放、手機等手持設備需要入式產(chǎn)品如多媒體播放、手機等手持設備需要圖形用戶界面(或稱圖形用戶界面(或稱 GUI)的支持。)的支持。因此基于因此基于GUI的應用程序的開發(fā)越來越重要。的應用程序的開發(fā)越來越重要。目前比較流行的目前比較流行的GUI平臺有平臺有QtEmbedded、緊縮的緊縮的X Windows系統(tǒng)、系統(tǒng)、MicroWindows以及以及MiniGUI系統(tǒng)。系統(tǒng)。*153.2 嵌入式軟
11、件開發(fā)流程嵌入式軟件開發(fā)流程3.2.1 嵌入式嵌入式Linux設計概述設計概述3.2.2 基于開發(fā)板的二次開發(fā)基于開發(fā)板的二次開發(fā) 3.2.3 基于基于linux的嵌入式軟件開發(fā)流程的嵌入式軟件開發(fā)流程 *163.2.1 嵌入式嵌入式Linux設計概述設計概述*173.2.1 嵌入式嵌入式Linux設計概述設計概述嵌入式系統(tǒng)的軟件開發(fā)采用一種交叉編譯嵌入式系統(tǒng)的軟件開發(fā)采用一種交叉編譯調(diào)試的方式。調(diào)試的方式。交叉編譯調(diào)試環(huán)境建立在宿主機(即一臺交叉編譯調(diào)試環(huán)境建立在宿主機(即一臺PC機)上,對應的開發(fā)平臺叫做目標板。機)上,對應的開發(fā)平臺叫做目標板。運行運行 Linux 的的 PC(宿主機宿主
12、機)開發(fā)時使用宿開發(fā)時使用宿主機上的交叉編譯、匯編及連接工具形成主機上的交叉編譯、匯編及連接工具形成可執(zhí)行的二進制代碼,(這種可執(zhí)行代碼可執(zhí)行的二進制代碼,(這種可執(zhí)行代碼并不能在宿主機上執(zhí)行,而只能在目標板并不能在宿主機上執(zhí)行,而只能在目標板上執(zhí)行。)然后把可執(zhí)行文件下載到目標上執(zhí)行。)然后把可執(zhí)行文件下載到目標機上運行。機上運行。 *18宿主機(宿主機(host)是編輯和編譯程序的平臺,)是編輯和編譯程序的平臺,一般是基于一般是基于 X86 的的 PC 機,通常也稱為主機,通常也稱為主機。而目標機(機。而目標機(target)是用戶開發(fā)的系統(tǒng),)是用戶開發(fā)的系統(tǒng),通常都是非通常都是非 X8
13、6 平臺。平臺。Host 編譯得到的可執(zhí)行代碼在目標機編譯得到的可執(zhí)行代碼在目標機target 上運行。上運行。3.2.1 嵌入式嵌入式Linux設計概述設計概述*193.2.2 基于開發(fā)板的二次開發(fā)基于開發(fā)板的二次開發(fā) 所謂二次開發(fā)是利用現(xiàn)成的開發(fā)板進行開發(fā),不同于通用所謂二次開發(fā)是利用現(xiàn)成的開發(fā)板進行開發(fā),不同于通用計算機和工作站上的軟件開發(fā)工程,一個嵌入式軟件的開計算機和工作站上的軟件開發(fā)工程,一個嵌入式軟件的開發(fā)過程具有很多特點和不確定性。其中最重要的一點是軟發(fā)過程具有很多特點和不確定性。其中最重要的一點是軟件跟硬件的緊密耦合特性。件跟硬件的緊密耦合特性。 由于嵌入式系統(tǒng)的靈活性和多樣
14、性,這樣就給軟件設計人由于嵌入式系統(tǒng)的靈活性和多樣性,這樣就給軟件設計人員帶來了極大地困難。第一,在軟件設計過程中過多地考員帶來了極大地困難。第一,在軟件設計過程中過多地考慮硬件,給開發(fā)和調(diào)試都帶來了很多不便;第二,如果所慮硬件,給開發(fā)和調(diào)試都帶來了很多不便;第二,如果所有的軟件工作都需要在硬件平臺就緒之后進行,自然就延有的軟件工作都需要在硬件平臺就緒之后進行,自然就延長了整個的系統(tǒng)開發(fā)周期。這些都是應該從方法上加以改長了整個的系統(tǒng)開發(fā)周期。這些都是應該從方法上加以改進和避免的問題。進和避免的問題。 為了解決這個問題,通常的做法是基于某種開發(fā)板做二次為了解決這個問題,通常的做法是基于某種開發(fā)板
15、做二次開發(fā),從這個角度看,硬件開發(fā)所占的比重不到開發(fā),從這個角度看,硬件開發(fā)所占的比重不到20%,而,而軟件開發(fā)的比重占到了軟件開發(fā)的比重占到了80%。*203.2.3 基于基于linux的嵌入式軟件開發(fā)流程的嵌入式軟件開發(fā)流程1.建立開發(fā)環(huán)境建立開發(fā)環(huán)境 2.配置開發(fā)主機配置開發(fā)主機3.建立引導裝載程序建立引導裝載程序BOOTLOADER 4.移植移植Linux 操作系統(tǒng)操作系統(tǒng) 5.建立根文件系統(tǒng)建立根文件系統(tǒng) 6.建立應用程序的文件系統(tǒng)建立應用程序的文件系統(tǒng) 7.開發(fā)應用程序開發(fā)應用程序 8.燒寫內(nèi)核、根文件系統(tǒng)、應用程序燒寫內(nèi)核、根文件系統(tǒng)、應用程序9.發(fā)布產(chǎn)品發(fā)布產(chǎn)品*213.4 嵌
16、入式系統(tǒng)引導代碼嵌入式系統(tǒng)引導代碼3.4.1 Bootloader簡介簡介3.4.2 常用的常用的Bootloader3.4.3 Bootloader基本原理基本原理3.4.4 Bootloader移植實例一:移植實例一:U_Boot3.4.5 Bootloader移植實例二:移植實例二:vivi*223.4.1 Bootloader簡介簡介1. Bootloader的作用的作用2. Bootloader操作模式操作模式*231. Bootloader的作用的作用Boot Loader 就是在操就是在操作系統(tǒng)內(nèi)核運行之前運作系統(tǒng)內(nèi)核運行之前運行的一段小程序。行的一段小程序。通過這段小程序,我們
17、通過這段小程序,我們可以初始化硬件設備、可以初始化硬件設備、建立內(nèi)存空間的映射圖,建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)統(tǒng)內(nèi)核準備好正確的環(huán)境。境。 *242. Bootloader操作模式操作模式大多數(shù)大多數(shù) Boot Loader 都包含兩種不同的操都包含兩種不同的操作模式:作模式:“啟動加載啟動加載”模式和模式和“下載下載”模模式,這種區(qū)別僅對于開發(fā)人員才有意義。式,這種區(qū)別僅對于開發(fā)人員才有意義。但從最終用戶的角度看,但從最終用戶的角度看,Boot Loade
18、r 的的作用就是用來加載操作系統(tǒng),而并不存在作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載工作模式的區(qū)所謂的啟動加載模式與下載工作模式的區(qū)別。別。 *252. Bootloader操作模式操作模式啟動加載(啟動加載(Boot loading)模式:這種模)模式:這種模式也稱為式也稱為“自主自主”(Autonomous)模式。)模式。也即也即 Boot Loader 從目標機上的某個固態(tài)從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到存儲設備上將操作系統(tǒng)加載到 RAM 中運中運行,整個過程并沒有用戶的介入。行,整個過程并沒有用戶的介入。這種模式是這種模式是 Boot Loader 的
19、正常工作模式,的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時侯,因此在嵌入式產(chǎn)品發(fā)布的時侯,Boot Loader 顯然必須工作在這種模式下。顯然必須工作在這種模式下。 *262. Bootloader操作模式操作模式u下載(下載(Downloading)模式:在這種模式)模式:在這種模式下,目標機上的下,目標機上的 Boot Loader 將通過串口將通過串口連接或網(wǎng)絡連接等通信手段從主機(連接或網(wǎng)絡連接等通信手段從主機(Host)下載文件到目標機的下載文件到目標機的 RAM 中,然后再被中,然后再被 Boot Loader 寫到目標機上的寫到目標機上的FLASH 類類固態(tài)存儲設備中。固態(tài)存儲設備
20、中。u工作于這種模式下的工作于這種模式下的 Boot Loader 通常都通常都會向它的終端用戶提供一個簡單的命令行會向它的終端用戶提供一個簡單的命令行接口。因此產(chǎn)品開發(fā)時通常使用這種模式。接口。因此產(chǎn)品開發(fā)時通常使用這種模式。*273.4.2 常用的常用的Bootloader1. ARMBootARMBoot是一個是一個bootloader,是為基于是為基于ARM或者或者StrongARM CPU的嵌入式系統(tǒng)所設計的。它支的嵌入式系統(tǒng)所設計的。它支持多種類型的持多種類型的Flash;允許映像文件經(jīng)由;允許映像文件經(jīng)由bootp、tftp從網(wǎng)絡傳輸;支持從串口線下載從網(wǎng)絡傳輸;支持從串口線下載
21、S-record或者或者binary文件;允許內(nèi)存的顯示及修文件;允許內(nèi)存的顯示及修改;支持改;支持jffs2文件系統(tǒng)等。文件系統(tǒng)等。ARMBoot源碼公開,可以在源碼公開,可以在http:/ 常用的常用的Bootloader2. PPCBootPPCBoot是德國是德國DENX小組開發(fā)的用于多種嵌入小組開發(fā)的用于多種嵌入式式CPU的的Bootloader引導程序,主要由德國的工引導程序,主要由德國的工程師程師Wolfgang Denk和和Intemet上的一群自由開發(fā)上的一群自由開發(fā)人員對其進行維護和開發(fā)。人員對其進行維護和開發(fā)。支持支持PowerPC、ARM、MIPS、m68K等多種處理等
22、多種處理器平臺,易于裁剪和調(diào)試。器平臺,易于裁剪和調(diào)試。PPCBoot遵循遵循GPL(通通用公共許可用公共許可)公約,完全開放源代碼。公約,完全開放源代碼。PPCBoot源代碼可以在源代碼可以在sourceforge網(wǎng)站的社區(qū)服網(wǎng)站的社區(qū)服務器中獲得,它的項目主頁是務器中獲得,它的項目主頁是http:/ 常用的常用的Bootloader3. U-Boot U-Boot是是sourceforge網(wǎng)站上的一個開放源代碼的項目。網(wǎng)站上的一個開放源代碼的項目。它可對它可對powerpc、MPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、StrongA
23、RM、Xscale)、)、MIPS、X86等處理器提供支等處理器提供支持,支持的嵌入式操作系統(tǒng)有持,支持的嵌入式操作系統(tǒng)有l(wèi)inux、Vx-work、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要等,主要用來開發(fā)嵌入式系統(tǒng)初始化代碼用來開發(fā)嵌入式系統(tǒng)初始化代碼bootloader。軟件的主。軟件的主站點是站點是http:/ U-Boot最初是由最初是由PPCboot發(fā)展而來的,它對發(fā)展而來的,它對PowerPC系系列處理器的支持最完善,對列處理器的支持最完善,對linux操作系統(tǒng)的支持最好。操作系統(tǒng)的支持最好。源代碼開放的源代碼開放的U-Boot軟件項目經(jīng)常更新,是學習硬件
24、底軟件項目經(jīng)常更新,是學習硬件底層代碼開發(fā)的很好樣例。目前已成為層代碼開發(fā)的很好樣例。目前已成為Armboot和和PPCboot的替代品。的替代品。*303.4.2 常用的常用的Bootloader4. RedBootRedBoot是一個專門為嵌入式系統(tǒng)定制的開發(fā)是一個專門為嵌入式系統(tǒng)定制的開發(fā)工具,最初由工具,最初由Redhat開發(fā),是嵌入式操作系統(tǒng)開發(fā),是嵌入式操作系統(tǒng)eCos的一個最小版本,現(xiàn)在交由自由軟件組織的一個最小版本,現(xiàn)在交由自由軟件組織FSF管理,遵循管理,遵循GPL的發(fā)布協(xié)議。的發(fā)布協(xié)議。集集Bootloader、調(diào)試、調(diào)試、Flash燒寫于一體。支持燒寫于一體。支持串口、網(wǎng)
25、絡下載,執(zhí)行嵌入式應用程序。串口、網(wǎng)絡下載,執(zhí)行嵌入式應用程序。既可以用在產(chǎn)品的開發(fā)階段(調(diào)試功能),也既可以用在產(chǎn)品的開發(fā)階段(調(diào)試功能),也可以用在最終的產(chǎn)品上(可以用在最終的產(chǎn)品上(Flash更新、網(wǎng)絡啟更新、網(wǎng)絡啟動)。動)。*313.4.2 常用的常用的Bootloader5.BlobBlob是是Boot Loader Object的縮寫,是一款功能的縮寫,是一款功能強大的強大的Bootloader。它遵循。它遵循GPL,源泉代碼完,源泉代碼完全開放。全開放。Blob既可以用來簡單的調(diào)試,也可以既可以用來簡單的調(diào)試,也可以啟動啟動Linux kernel。Blob最初是最初是Jan-
26、Derk Bakker和和Erik Mouw為一為一塊名為塊名為LART(Linux Advanced Radio Terminal)的板子寫的,該板使用的處理器是的板子寫的,該板使用的處理器是StrongARM SA-1100。現(xiàn)在。現(xiàn)在Blob已經(jīng)被移植到了很多已經(jīng)被移植到了很多CPU上,上,包括包括S3C44B0。*323.4.2 常用的常用的Bootloader6.ViViVivi 是韓國是韓國mizi 公司開發(fā)的公司開發(fā)的bootloader, 適用于適用于ARM9處理器。處理器。 Vivi有兩種工作模式:啟動加有兩種工作模式:啟動加載模式和下載模式。載模式和下載模式。啟動加載模式可
27、以在一段時間后(這個時間可啟動加載模式可以在一段時間后(這個時間可更改)自行啟動更改)自行啟動linux內(nèi)核,這時內(nèi)核,這時vivi的默認模的默認模式。式。在下載模式下,在下載模式下,vivi為用戶提供一個命令行接口,為用戶提供一個命令行接口,通過接口可以使用通過接口可以使用vivi提供的一些命令。提供的一些命令。*333.4.3 Bootloader基本原理基本原理同時裝有同時裝有 Boot Loader、內(nèi)核的啟動參、內(nèi)核的啟動參數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的固態(tài)存數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的固態(tài)存儲設備的典型空間分配結(jié)構(gòu)圖。儲設備的典型空間分配結(jié)構(gòu)圖。 *34在嵌入式世界里建立一個通用
28、的在嵌入式世界里建立一個通用的 Boot Loader 幾幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫跏遣豢赡艿摹1M管如此,我們?nèi)匀豢梢詫?Boot Loader 歸納出一些通用的概念來,以指導用戶特歸納出一些通用的概念來,以指導用戶特定的定的 Boot Loader 設計與實現(xiàn)。設計與實現(xiàn)。大多數(shù)大多數(shù) Boot Loader 都分為都分為 stage1 和和 stage2 兩大兩大部分。依賴于部分。依賴于 CPU 體系結(jié)構(gòu)的代碼,比如設備初體系結(jié)構(gòu)的代碼,比如設備初始化代碼等,通常都放在始化代碼等,通常都放在 stage1 中,而且通常都中,而且通常都用匯編語言來實現(xiàn),以達到短小精悍的目的。
29、而用匯編語言來實現(xiàn),以達到短小精悍的目的。而 stage2 則通常用則通常用C語言來實現(xiàn),這樣可以實現(xiàn)給語言來實現(xiàn),這樣可以實現(xiàn)給復雜的功能,而且代碼會具有更好的可讀性和可復雜的功能,而且代碼會具有更好的可讀性和可移植性。移植性。 3.4.3 Bootloader基本原理基本原理*35BootLoader的啟動流程的啟動流程Boot Loader的第一階段通常包括以下步驟的第一階段通常包括以下步驟(以以執(zhí)行的先后順序執(zhí)行的先后順序):硬件設備初始化。硬件設備初始化。為加載為加載 Boot Loader 的的 stage2 準備準備 RAM 空間。空間。 拷貝拷貝 Boot Loader 的的
30、stage2 到到 RAM 空間中。空間中。 設置好堆棧。設置好堆棧。 跳轉(zhuǎn)到跳轉(zhuǎn)到 stage2 的的 C 入口點。入口點。*36BootLoader的啟動流程的啟動流程Boot Loader的第二階段通常包括以下步驟的第二階段通常包括以下步驟(以以執(zhí)行的先后順序執(zhí)行的先后順序):初始化本階段要使用到的硬件設備。初始化本階段要使用到的硬件設備。檢測系統(tǒng)內(nèi)存映射檢測系統(tǒng)內(nèi)存映射(memory map)。 將將 kernel 映像和根文件系統(tǒng)映像從映像和根文件系統(tǒng)映像從 flash 上讀到上讀到 RAM 空間中。空間中。 為內(nèi)核設置啟動參數(shù)。為內(nèi)核設置啟動參數(shù)。 調(diào)用內(nèi)核。調(diào)用內(nèi)核。 *37第一
31、階段:第一階段:Boot Loader 的的 stage11. 基本的硬件初始化基本的硬件初始化這是這是 Boot Loader 一開始就執(zhí)行的操作,其目一開始就執(zhí)行的操作,其目的是為的是為 stage2 的執(zhí)行以及隨后的的執(zhí)行以及隨后的 kernel 的執(zhí)行的執(zhí)行準備好一些基本的硬件環(huán)境。它通常包括以下準備好一些基本的硬件環(huán)境。它通常包括以下步驟(以執(zhí)行的先后順序):步驟(以執(zhí)行的先后順序): (1)屏蔽所有的中斷。為中斷提供服務通常是屏蔽所有的中斷。為中斷提供服務通常是 OS 設備驅(qū)動程序的責任,因此在設備驅(qū)動程序的責任,因此在 Boot Loader 的執(zhí)的執(zhí)行全過程中可以不必響應任何中
32、斷。中斷屏蔽可行全過程中可以不必響應任何中斷。中斷屏蔽可以通過寫以通過寫 CPU 的中斷屏蔽寄存器或狀態(tài)寄存器的中斷屏蔽寄存器或狀態(tài)寄存器(比如(比如 ARM 的的 CPSR 寄存器)來完成。寄存器)來完成。 *38第一階段:第一階段:Boot Loader 的的 stage1(2)設置設置 CPU 的速度和時鐘頻率。的速度和時鐘頻率。(3)RAM 初始化。包括正確地設置系統(tǒng)的內(nèi)存初始化。包括正確地設置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存控制寄存器控制器的功能寄存器以及各內(nèi)存控制寄存器等。等。 (4)初始化初始化 LED。典型地,通過。典型地,通過 GPIO 來驅(qū)動來驅(qū)動 LED,其目的是表
33、明系統(tǒng)的狀態(tài)是,其目的是表明系統(tǒng)的狀態(tài)是 OK 還是還是 Error。如果板子上沒有。如果板子上沒有 LED,那么也可以,那么也可以通過初始化通過初始化 UART 向串口打印向串口打印 Boot Loader 的的 Logo 字符信息來完成這一點。字符信息來完成這一點。 (5)關閉關閉 CPU 內(nèi)部指令內(nèi)部指令/數(shù)據(jù)數(shù)據(jù) cache。*39第一階段:第一階段:Boot Loader 的的 stage12. 為加載為加載 stage2 準備準備 RAM 空間空間為了后面的敘述方便,這里把所安排的為了后面的敘述方便,這里把所安排的 RAM 空間范圍的大小記為:空間范圍的大小記為:stage2_si
34、ze(字節(jié)字節(jié)),把起,把起始地址和終止地址分別記為:始地址和終止地址分別記為:stage2_start 和和 stage2_end(這兩個地址均以這兩個地址均以 4 字節(jié)邊界對齊字節(jié)邊界對齊)。因此:因此: stage2_endstage2_startstage2_size 另外,還必須確保所安排的地址范圍的的確確另外,還必須確保所安排的地址范圍的的確確是可讀寫的是可讀寫的 RAM 空間,因此,必須對你所安空間,因此,必須對你所安排的地址范圍進行測試。排的地址范圍進行測試。 *40第一階段:第一階段:Boot Loader 的的 stage13. 拷貝拷貝 stage2 到到 RAM 中中
35、拷貝時要確定兩點:拷貝時要確定兩點:(1) stage2 的可執(zhí)行映象在固態(tài)存儲設備的存的可執(zhí)行映象在固態(tài)存儲設備的存放起始地址和終止地址;放起始地址和終止地址;(2) RAM 空間的起始地址。空間的起始地址。 *41第一階段:第一階段:Boot Loader 的的 stage14. 設置堆棧指針設置堆棧指針sp 堆棧指針的設置是為了執(zhí)行堆棧指針的設置是為了執(zhí)行 C 語言代碼語言代碼作好準備。通常我們可以把作好準備。通常我們可以把 sp 的值設置的值設置為為(stage2_end-4),也即在上面所安排的,也即在上面所安排的那個那個 1MB 的的 RAM 空間的最頂端空間的最頂端(堆棧向堆棧向
36、下生長下生長)。 此外,在設置堆棧指針此外,在設置堆棧指針 sp 之前,也可以之前,也可以關閉關閉 led 燈,以提示用戶我們準備跳轉(zhuǎn)到燈,以提示用戶我們準備跳轉(zhuǎn)到 stage2。經(jīng)過上述這些執(zhí)行步驟后,系統(tǒng)。經(jīng)過上述這些執(zhí)行步驟后,系統(tǒng)的物理內(nèi)存布局應該如下圖的物理內(nèi)存布局應該如下圖 *42第一階段:第一階段:Boot Loader 的的 stage1*43第一階段:第一階段:Boot Loader 的的 stage15. 跳轉(zhuǎn)到跳轉(zhuǎn)到stage2的的C入口點入口點 在上述一切都就緒后,就可以跳轉(zhuǎn)到在上述一切都就緒后,就可以跳轉(zhuǎn)到 Boot Loader 的的 stage2 去執(zhí)行了。比如,
37、去執(zhí)行了。比如,在在 ARM 系統(tǒng)中,這可以通過修改系統(tǒng)中,這可以通過修改 PC 寄寄存器為合適的地址來實現(xiàn)。存器為合適的地址來實現(xiàn)。*44第二階段:第二階段:Boot Loader 的的 stage2 1. 初始化本階段要使用到的硬件設備初始化本階段要使用到的硬件設備 這通常包括:這通常包括:(1)初始化至少一個串口,以便和終端用戶)初始化至少一個串口,以便和終端用戶進行進行 I/O 輸出信息;輸出信息;(2)初始化計時器等。在初始化這些設備之)初始化計時器等。在初始化這些設備之前,也可以重新把前,也可以重新把 LED 燈點亮,以表明我們燈點亮,以表明我們已經(jīng)進入已經(jīng)進入 main() 函數(shù)
38、執(zhí)行。設備初始化完成函數(shù)執(zhí)行。設備初始化完成后,可以輸出一些打印信息,程序名字字符后,可以輸出一些打印信息,程序名字字符串、版本號等。串、版本號等。 *45第二階段:第二階段:Boot Loader 的的 stage22. 檢測系統(tǒng)的內(nèi)存映射(檢測系統(tǒng)的內(nèi)存映射(memory map) 所謂內(nèi)存映射就是指在整個所謂內(nèi)存映射就是指在整個 4GB 物理地址空間物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的中有哪些地址范圍被分配用來尋址系統(tǒng)的 RAM 單元。單元。比如,在比如,在 SA-1100 CPU 中,從中,從 0 xC000,0000 開開始的始的 512M 地址空間被用作系統(tǒng)的地址空間被
39、用作系統(tǒng)的 RAM 地址地址空間,而在空間,而在 Samsung S3C44B0X CPU 中,從中,從 0 x0c00,0000 到到 0 x1000,0000 之間的之間的 64M 地址空地址空間被用作系統(tǒng)的間被用作系統(tǒng)的 RAM 地址空間。地址空間。雖然雖然 CPU 通常預留出一大段足夠的地址空間給通常預留出一大段足夠的地址空間給系統(tǒng)系統(tǒng) RAM,但是在搭建具體的嵌入式系統(tǒng)時卻,但是在搭建具體的嵌入式系統(tǒng)時卻不一定會實現(xiàn)不一定會實現(xiàn) CPU 預留的全部預留的全部 RAM 地址空間。地址空間。 *46第二階段:第二階段:Boot Loader 的的 stage23. 加載內(nèi)核映像和根文件系
40、統(tǒng)映像加載內(nèi)核映像和根文件系統(tǒng)映像 (1) 規(guī)劃內(nèi)存占用的布局規(guī)劃內(nèi)存占用的布局 這里包括兩個方面:內(nèi)核映像所占用的內(nèi)存范這里包括兩個方面:內(nèi)核映像所占用的內(nèi)存范圍;根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)圍;根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局時,主要考慮基地址和映像的大存占用的布局時,主要考慮基地址和映像的大小兩個方面。小兩個方面。 (2)從從 Flash 上拷貝上拷貝 由于像由于像 ARM 這樣的嵌入式這樣的嵌入式 CPU 通常都是在統(tǒng)通常都是在統(tǒng)一的內(nèi)存地址空間中尋址一的內(nèi)存地址空間中尋址 Flash 等固態(tài)存儲設等固態(tài)存儲設備的,因此從備的,因此從 Flash 上讀取數(shù)據(jù)與從
41、上讀取數(shù)據(jù)與從 RAM 單元單元中讀取數(shù)據(jù)并沒有什么不同。中讀取數(shù)據(jù)并沒有什么不同。 *47第二階段:第二階段:Boot Loader 的的 stage2用一個簡單的循環(huán)就可以完成從用一個簡單的循環(huán)就可以完成從 Flash 設設備上拷貝映像的工作:備上拷貝映像的工作: while(count) *dest+ = *src+; /* 都是以字方式對齊都是以字方式對齊 */count -= 4; /* 字節(jié)數(shù)字節(jié)數(shù) */;*48第二階段:第二階段:Boot Loader 的的 stage24. 設置內(nèi)核的啟動參數(shù)設置內(nèi)核的啟動參數(shù) 應該說,在將內(nèi)核映像和根文件系統(tǒng)映像應該說,在將內(nèi)核映像和根文件系
42、統(tǒng)映像拷貝到拷貝到 RAM 空間中后,就可以準備啟動空間中后,就可以準備啟動 Linux 內(nèi)核了。內(nèi)核了。但是在調(diào)用內(nèi)核之前,應該作一步準備工但是在調(diào)用內(nèi)核之前,應該作一步準備工作,即:設置作,即:設置 Linux 內(nèi)核的啟動參數(shù)。內(nèi)核的啟動參數(shù)。 *49第二階段:第二階段:Boot Loader 的的 stage25. 調(diào)用內(nèi)核調(diào)用內(nèi)核 Boot Loader 調(diào)用調(diào)用 Linux 內(nèi)核的方法是直內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到跳轉(zhuǎn)到 MEM_START0 x8000 地址處。地址處。 *503.4.4 Bootloader移植實例
43、一:移植實例一:U_Boot1. U-Boot概述概述U-Boot可支持的主要功能如下。可支持的主要功能如下。系統(tǒng)引導:支持系統(tǒng)引導:支持NFS掛載、掛載、RAMDISK(壓縮或非壓壓縮或非壓縮縮)形式的根文件系統(tǒng)。支持形式的根文件系統(tǒng)。支持NFS掛載,并從掛載,并從FLASH中引導壓縮或非壓縮系統(tǒng)內(nèi)核。中引導壓縮或非壓縮系統(tǒng)內(nèi)核。基本輔助功能:強大的操作系統(tǒng)接口功能;可靈活基本輔助功能:強大的操作系統(tǒng)接口功能;可靈活設置、傳遞多個關鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在設置、傳遞多個關鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對Linux
44、支持最為強勁;支持目標板環(huán)境參數(shù)多種存支持最為強勁;支持目標板環(huán)境參數(shù)多種存儲方式,如儲方式,如FLASH、NVRAM、EEPROM;CRC32校驗,可校驗校驗,可校驗FLASH中內(nèi)核、中內(nèi)核、RAMDISK鏡鏡像文件是否完好。像文件是否完好。*511. U-Boot概述概述設備驅(qū)動設備驅(qū)動:串口、串口、SDRAM、FLASH、以太、以太網(wǎng)、網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動支持。等驅(qū)動支持。上電自檢功能:上電自檢功能:SDRAM、FLASH大小自動大小自動檢測;檢測;SDRAM故障檢測;故障檢測;CPU型號。型號。特殊功能:特殊功能:
45、XIP內(nèi)核引導。內(nèi)核引導。*522. 源碼閱讀源碼閱讀從網(wǎng)站上下載得到從網(wǎng)站上下載得到U-Boot源碼包,例如:源碼包,例如:U-Boot-1.1.6.tar.bz2,解壓就可以得到全部解壓就可以得到全部U-Boot源程序。在頂層目錄下有源程序。在頂層目錄下有18個子目錄,分別存放個子目錄,分別存放和管理不同的源程序。這些目錄中所要存放的文和管理不同的源程序。這些目錄中所要存放的文件有其規(guī)則,可以分為件有其規(guī)則,可以分為3類。類。第第1類目錄與處理器體系結(jié)構(gòu)或者開發(fā)板硬件直類目錄與處理器體系結(jié)構(gòu)或者開發(fā)板硬件直接相關;接相關;第第2類目錄是一些通用的函數(shù)或者驅(qū)動程序;類目錄是一些通用的函數(shù)或者
46、驅(qū)動程序;第第3類目錄是類目錄是U-Boot的應用程序、工具或者文檔。的應用程序、工具或者文檔。*53*54 Board目錄:存放和一些已有開發(fā)板有關的文件,比如目錄:存放和一些已有開發(fā)板有關的文件,比如Makefile和和U-Boot.lds等都和具體開發(fā)板的硬件和地址分等都和具體開發(fā)板的硬件和地址分配有關。配有關。 Common目錄:存放與體系結(jié)構(gòu)無關的文件,實現(xiàn)各種命目錄:存放與體系結(jié)構(gòu)無關的文件,實現(xiàn)各種命令的令的C文件。文件。 Cpu目錄:存放目錄:存放CPU相關文件,其中的子目錄都是以相關文件,其中的子目錄都是以U-BOOT所支持的所支持的CPU為名,比如有子目錄為名,比如有子目錄
47、arm926ejs、mips、mpc8260和和nios等,每個特定的子目錄中都包括等,每個特定的子目錄中都包括cpu.c和和interrupt.c,start.S。其中。其中cpu.c初始化初始化CPU、設置、設置指令指令Cache和數(shù)據(jù)和數(shù)據(jù)Cache等。等。interrupt.c設置系統(tǒng)的各種中設置系統(tǒng)的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;斷、預取中止和未定義指令等;start.S是是U-BOOT啟動時啟動時執(zhí)行的第一個文件,它主要是設置系統(tǒng)堆棧和工作方式,執(zhí)行的第一個文件,它主要是設置系統(tǒng)
48、堆棧和工作方式,為進入為進入C程序奠定基礎。程序奠定基礎。2. 源碼閱讀源碼閱讀*55 Disk目錄:存放目錄:存放disk驅(qū)動的分區(qū)處理代碼。驅(qū)動的分區(qū)處理代碼。 Doc目錄:存放開發(fā)使用的文檔。目錄:存放開發(fā)使用的文檔。 Drivers目錄:存放通用設備驅(qū)動程序,比如各種網(wǎng)卡、目錄:存放通用設備驅(qū)動程序,比如各種網(wǎng)卡、支持支持CF1的的Flash、串口和、串口和USB總線等。總線等。 Fs目錄:存放支持文件系統(tǒng)的文件,目錄:存放支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持現(xiàn)在支持cramfs、fat、fdos、jffs2和和registerfs。 net目錄:存放與網(wǎng)絡有關的代碼,目錄:存放與
49、網(wǎng)絡有關的代碼,BOOTP協(xié)議、協(xié)議、TFTP協(xié)議、協(xié)議、RARP協(xié)議和協(xié)議和NFS文件系統(tǒng)的實現(xiàn)。文件系統(tǒng)的實現(xiàn)。 lib_arm目錄:存放與目錄:存放與ARM體系結(jié)構(gòu)相關的代碼。體系結(jié)構(gòu)相關的代碼。 tools目錄:存放創(chuàng)建目錄:存放創(chuàng)建S-Record格式文件和格式文件和U-BOOT images的工具。的工具。 Include存放:頭文件,還有對各種硬件平臺支持的匯編存放:頭文件,還有對各種硬件平臺支持的匯編文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。 2. 源碼閱讀源碼閱讀*563.u-boot的移植的移植(1)在頂層)在頂層Makefil
50、e中為開發(fā)板添加新的配置選中為開發(fā)板添加新的配置選項項 (2)創(chuàng)建一個新目錄存放開發(fā)板相關的代碼,并)創(chuàng)建一個新目錄存放開發(fā)板相關的代碼,并且添加文件。且添加文件。(3)為開發(fā)板添加新的配置文件)為開發(fā)板添加新的配置文件(4)配置開發(fā)板)配置開發(fā)板(5)編譯)編譯U-Boot(6)添加驅(qū)動或者功能選項)添加驅(qū)動或者功能選項(7)調(diào)試)調(diào)試U-Boot源代碼,直到源代碼,直到U-Boot在開發(fā)板在開發(fā)板上能夠正常啟動。上能夠正常啟動。*574.燒寫燒寫U-Boot新開發(fā)的電路板沒有任何程序可以執(zhí)行,新開發(fā)的電路板沒有任何程序可以執(zhí)行,也就不能啟動,需要先將也就不能啟動,需要先將U-Boot燒寫到
51、燒寫到Flash中。中。多數(shù)嵌入式單板通過處理器的調(diào)試接口,多數(shù)嵌入式單板通過處理器的調(diào)試接口,直接對板上的直接對板上的Flash編程。最簡單方式就編程。最簡單方式就是通過是通過JTAG電纜,轉(zhuǎn)接到計算機并口連電纜,轉(zhuǎn)接到計算機并口連接。把接。把Bootloader下載并燒寫到下載并燒寫到Flash中。中。燒寫完成后,復位實驗板,串口終端應該燒寫完成后,復位實驗板,串口終端應該顯示顯示U-Boot的啟動信息。的啟動信息。 *583.4.5 Bootloader移植實例二:移植實例二:vivi1. vivi概述概述vivi是由韓國是由韓國Mizi公司開發(fā)的一種公司開發(fā)的一種Bootloader,
52、適合于適合于ARM9處理器,支持處理器,支持S3C2410 x處理器,處理器,其源代碼可以在其源代碼可以在http:/網(wǎng)站下載。網(wǎng)站下載。和所有的和所有的Bootloader一樣,一樣,vivi有兩種工作模式,有兩種工作模式,即啟動加載模式和下載模式。當即啟動加載模式和下載模式。當vivi處于下載模處于下載模式時,式時, 它為用戶提供一個命令行接口,通過該接它為用戶提供一個命令行接口,通過該接口能使用口能使用vivi提供的一些命令集。提供的一些命令集。大多數(shù)大多數(shù)Bootloader都分為都分為stage1和和stage2兩部兩部分,分,stage2 的代碼通常用的代碼通常用 C 語言來實現(xiàn),
53、以便語言來實現(xiàn),以便于實現(xiàn)更復雜的功能并取得更好的代碼可讀性和于實現(xiàn)更復雜的功能并取得更好的代碼可讀性和可移植性。可移植性。*592. vivi源碼導讀源碼導讀代碼基本結(jié)構(gòu)代碼基本結(jié)構(gòu)*602. vivi源碼導讀源碼導讀arch:此目錄包括了所有:此目錄包括了所有vivi支持的目標板的支持的目標板的子目錄,例如子目錄,例如s3c2410目錄。目錄。Documentation:存放一些使用:存放一些使用VIVI的幫助文的幫助文檔。檔。drivers:其中包括了引導內(nèi)核需要的設備的驅(qū):其中包括了引導內(nèi)核需要的設備的驅(qū)動程序(動程序(MTD和串口)。和串口)。MTD目錄下分目錄下分map、nand和
54、和nor三個目錄。三個目錄。init:這個目錄只有:這個目錄只有main.c和和version.c兩個文兩個文件。和普通的件。和普通的C程序一樣,程序一樣,vivi將從將從main函數(shù)函數(shù)開始執(zhí)行。開始執(zhí)行。*612. vivi源碼導讀源碼導讀include:頭文件的公共目錄,其中的:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。定義了這塊處理器的一些寄存器。Platform/smdk2410.h定義了與開發(fā)板相關的資定義了與開發(fā)板相關的資源配置參數(shù),我們往往只需要修改這個文件就源配置參數(shù),我們往往只需要修改這個文件就可以配置目標板的參數(shù),如波特率、引導參數(shù)、可以配置
55、目標板的參數(shù),如波特率、引導參數(shù)、物理內(nèi)存映射等。物理內(nèi)存映射等。lib:一些平臺公共的接口代碼,比如:一些平臺公共的接口代碼,比如time.c里的里的udelay()和和mdelay()。Scripts:存放:存放VIVI腳本配置文件。腳本配置文件。Test: 存放一些測試代碼文件。存放一些測試代碼文件。Util:存放一些:存放一些NAND Flash燒寫燒寫image相關的工相關的工具實現(xiàn)代碼。具實現(xiàn)代碼。*623.vivi的移植的移植vivi作為作為Linux系統(tǒng)的啟動代碼,在編譯配系統(tǒng)的啟動代碼,在編譯配置時需要用到函數(shù)庫,包括交叉編譯器庫置時需要用到函數(shù)庫,包括交叉編譯器庫和頭文件,
56、交叉編譯開關選項設置,還包和頭文件,交叉編譯開關選項設置,還包括括Linux內(nèi)核代碼中的庫和頭文件,所以,內(nèi)核代碼中的庫和頭文件,所以,通常需要修改通常需要修改vivi工程管理文件工程管理文件Makefile。 *633.vivi的移植的移植(1)vivi中與硬件相關的初始化中與硬件相關的初始化(2)對不同對不同F(xiàn)lash啟動的修改啟動的修改(3)內(nèi)核啟動參數(shù)設置內(nèi)核啟動參數(shù)設置*643.5 linux內(nèi)核結(jié)構(gòu)及移植內(nèi)核結(jié)構(gòu)及移植3.5.1 linux內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)3.5.2 linux的移植的移植3.5.3 修改修改linux內(nèi)核源碼內(nèi)核源碼3.5.4 內(nèi)核的裁剪內(nèi)核的裁剪3.5.5內(nèi)核的
57、編譯和下載內(nèi)核的編譯和下載*653.5.1 linux內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)1.Linux 內(nèi)核簡介內(nèi)核簡介 *661.Linux 內(nèi)核簡介內(nèi)核簡介 Linux 內(nèi)核可以進一步劃分成內(nèi)核可以進一步劃分成 3 層。最上面是層。最上面是系統(tǒng)調(diào)用接口,它實現(xiàn)了一些基本的功能,例系統(tǒng)調(diào)用接口,它實現(xiàn)了一些基本的功能,例如如 read 和和 write。系統(tǒng)調(diào)用接口之下是內(nèi)核代碼,可以更精確地系統(tǒng)調(diào)用接口之下是內(nèi)核代碼,可以更精確地定義為獨立于體系結(jié)構(gòu)的內(nèi)核代碼。這些代碼定義為獨立于體系結(jié)構(gòu)的內(nèi)核代碼。這些代碼是是 Linux 所支持的所有處理器體系結(jié)構(gòu)所通用所支持的所有處理器體系結(jié)構(gòu)所通用的。的。在這些代碼
58、之下是依賴于體系結(jié)構(gòu)的代碼,構(gòu)在這些代碼之下是依賴于體系結(jié)構(gòu)的代碼,構(gòu)成了通常稱為成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結(jié)構(gòu)的處理器的部分。這些代碼用作給定體系結(jié)構(gòu)的處理器和特定于平臺的代碼。和特定于平臺的代碼。*672.Linux 內(nèi)核的主要子系統(tǒng)內(nèi)核的主要子系統(tǒng)*682.Linux 內(nèi)核的主要子系統(tǒng)內(nèi)核的主要子系統(tǒng)(1)進程調(diào)度進程調(diào)度(2)進程間通信進程間通信(3)內(nèi)存管理內(nèi)存管理(4)虛擬文件系統(tǒng)虛擬文件系統(tǒng)(5)網(wǎng)絡堆棧網(wǎng)絡堆棧(6)設備驅(qū)動程序設備驅(qū)動程序(7)依賴體系結(jié)構(gòu)的代碼依賴體系結(jié)構(gòu)的代碼*69(1)進程調(diào)度進程調(diào)度S
59、CI 層提供了某些機制執(zhí)行從用戶空間到層提供了某些機制執(zhí)行從用戶空間到內(nèi)核的函數(shù)調(diào)用。內(nèi)核的函數(shù)調(diào)用。SCI 實際上是一個非常有用的函數(shù)調(diào)用多實際上是一個非常有用的函數(shù)調(diào)用多路復用和多路分解服務。路復用和多路分解服務。在在 ./linux/kernel 中您可以找到中您可以找到 SCI 的實的實現(xiàn),并在現(xiàn),并在 ./linux/arch 中找到依賴于體系中找到依賴于體系結(jié)構(gòu)的部分。結(jié)構(gòu)的部分。 *70(2)進程間通信進程間通信支持進程間各種通信機制,包括管道、支持進程間各種通信機制,包括管道、FIFO、共享內(nèi)存、信號、消息隊列、套、共享內(nèi)存、信號、消息隊列、套接字等。接字等。 *71(3)內(nèi)存
60、管理內(nèi)存管理內(nèi)核所管理的另外一個重要資源是內(nèi)存。內(nèi)核所管理的另外一個重要資源是內(nèi)存。為了提高效率,如果由硬件管理虛擬內(nèi)存,為了提高效率,如果由硬件管理虛擬內(nèi)存,內(nèi)存是按照所謂的內(nèi)存頁內(nèi)存是按照所謂的內(nèi)存頁 方式進行管理方式進行管理的(對于大部分體系結(jié)構(gòu)來說都是的(對于大部分體系結(jié)構(gòu)來說都是 4KB)。)。Linux 包括了管理可用內(nèi)存的方式,以及包括了管理可用內(nèi)存的方式,以及物理和虛擬映射所使用的硬件機制。物理和虛擬映射所使用的硬件機制。*72(4)虛擬文件系統(tǒng)虛擬文件系統(tǒng)虛擬文件系統(tǒng)虛擬文件系統(tǒng)(VFS)是)是 Linux 內(nèi)核中非常有用的內(nèi)核中非常有用的一個方面,因為它一個方面,因為它為文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學綜合素質(zhì)試題及答案
- 中醫(yī)針灸模擬試題及答案
- 新疆維吾爾自治區(qū)昌吉市教育共同體四校2025年高二物理第二學期期末質(zhì)量檢測模擬試題含解析
- 云南省保山市2024-2025學年高二下數(shù)學期末監(jiān)測試題含解析
- 鹽城市時楊中學高二下學期期中考試物理試題
- 高端制造業(yè)廠房租賃服務合同模板
- 車輛借用合同車輛使用記錄及報告協(xié)議
- 財務部門承包財務管理合同協(xié)議
- 幼師有哲理又幽默的演講稿(19篇)
- 行政組織理論中的沖突管理理念試題及答案
- 四年級下冊小數(shù)加減豎式計算400題及答案
- 酒店康樂項目營銷策劃
- 保護眼睛-家長進課堂課件
- 《施工測量》課件
- 2022年度上海廣告業(yè)發(fā)展與監(jiān)管狀況
- 2021年山東省新高考英語試卷(附詳解)
- 四川省會計師事務所服務收費管理辦法及收費標準新版
- GB/T 23794-2023企業(yè)信用評價指標
- 《土樓回響》第五樂章《客家之歌》高中音樂優(yōu)質(zhì)課課件
- 凡爾登戰(zhàn)役微課課件
- 二年級平行四邊形的初步認識
評論
0/150
提交評論