<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植

          嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植

          作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

          本文引用地址:http://www.ex-cimer.com/article/257139.htm

          5.2

          5.2.1介紹

          1.概念

          簡單地說,就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序,它類似于PC機中的BIOS程序。通過這段程序,可以完成硬件設備的初始化,并建立內(nèi)存空間的映射關系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準備。

          通常,比較依賴于硬件平臺,特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個通用的Bootloader是一件比較困難的事情。盡管如此,仍然可以對Bootloader歸納出一些通用的概念來指導面向用戶定制的Bootloader設計與實現(xiàn)。

          (1)Bootloader所支持的CPU和嵌入式開發(fā)板。

          每種不同的CPU體系結(jié)構(gòu)都有不同的Bootloader。有些Bootloader也支持多種體系結(jié)構(gòu)的CPU,如后面要介紹的U-Boot支持ARM、MIPS、PowerPC等眾多體系結(jié)構(gòu)。除了依賴于CPU的體系結(jié)構(gòu)外,Bootloader實際上也依賴于具體的嵌入式板級設備的配置。

          (2)Bootloader的存儲位置。

          系統(tǒng)加電或復位后,所有的CPU通常都從某個由CPU制造商預先安排的地址上取指令。而基于CPU構(gòu)建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(比如ROM、EEPROM或Flash等)被映射到這個預先安排的地址上。因此在系統(tǒng)加電后,CPU將首先執(zhí)行Bootloader程序。

          (3)Bootloader的啟動過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復雜的功能,以及更好的可移植性。

          (4)Bootloader的操作模式。大多數(shù)Bootloader都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。

          n 啟動加載模式:這種模式也稱為“自主”模式。也就是Bootloader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是嵌入式產(chǎn)品發(fā)布時的通用模式。

          n 下載模式:在這種模式下,目標機上的Bootloader將通過串口連接或網(wǎng)絡連接等通信手段從主機(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被Bootloader寫入到目標機上的Flash類固態(tài)存儲設備中。Bootloader的這種模式在系統(tǒng)更新時使用。工作于這種模式下的Bootloader通常都會向它的終端用戶提供一個簡單的命令行接口。

          (5)Bootloader與主機之間進行文件傳輸所用的通信設備及協(xié)議,最常見的情況就是,目標機上的Bootloader通過串口與主機之間進行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜?,因此通過以太網(wǎng)連接并借助TFTP等協(xié)議來下載文件是個更好的選擇。

          2.Bootloader啟動流程

          Bootloader的啟動流程一般分為兩個階段:stage1和stage2,下面分別對這兩個階段進行講解。

          (1)Bootloader的stage1。

          在stage1中Bootloader主要完成以下工作。

          n 基本的硬件初始化,包括屏蔽所有的中斷、設置CPU的速度和時鐘頻率、RAM初始化、初始化外圍設備、關閉CPU內(nèi)部指令和數(shù)據(jù)cache等。

          n 為加載stage2準備RAM空間,通常為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準備好一段可用的RAM空間。

          n 復制stage2到RAM中,在這里要確定兩點:①stage2的可執(zhí)行映像在固態(tài)存儲設備的存放起始地址和終止地址;②RAM空間的起始地址。

          n 設置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準備。

          (2)Bootloader的stage2。

          在stage2中Bootloader主要完成以下工作。

          n 用匯編語言跳轉(zhuǎn)到main入口函數(shù)。

          由于stage2的代碼通常用C語言來實現(xiàn),目的是實現(xiàn)更復雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應用程序不同的是,在編譯和鏈接Bootloader這樣的程序時,不能使用glibc庫中的任何支持函數(shù)。

          n 初始化本階段要使用到的硬件設備,包括初始化串口、初始化計時器等。在初始化這些設備之前可以輸出一些打印信息。

          n 檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。

          n 加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上復制數(shù)據(jù)。

          n 設置內(nèi)核的啟動參數(shù)。

          5.2.2U-Boot概述

          1.U-Boot簡介

          U-Boot(UniversalBootloader)是遵循GPL條款的開放源碼項目。它是從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實上,不少U-Boot源碼就是相應的Linux內(nèi)核源程序的簡化,尤其是一些設備的驅(qū)動程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點。但是U-Boot不僅僅支持系統(tǒng)的引導,而且還支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系統(tǒng)。其目前要支持的目標操作系統(tǒng)是OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks、LynxOS、pSOS、QNX、RTEMS、ARTOS。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個特點正是U-Boot項目的開發(fā)目標,即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前為止,U-Boot對PowerPC系列處理器支持最為豐富,對Linux的支持最完善。

          2.U-Boot特點

          U-Boot的特點如下。

          n 開放源碼;

          n 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;

          n 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;

          n 較高的可靠性和穩(wěn)定性;

          n 高度靈活的功能設置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導要求和產(chǎn)品發(fā)布等;

          n 豐富的設備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、Flash、LCD、NVRAM、EEPROM、RTC、鍵盤等;

          n 較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡技術支持。

          3.U-Boot主要功能

          U-Boot可支持的主要功能列表。

          n 系統(tǒng)引導:支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)。支持NFS掛載,并從Flash中引導壓縮或非壓縮系統(tǒng)內(nèi)核。

          n 基本輔助功能:強大的操作系統(tǒng)接口功能;可靈活設置、傳遞多個關鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對Linux支持最為強勁;支持目標板環(huán)境參數(shù)多種存儲方式,如Flash、NVRAM、EEPROM;CRC32校驗,可校驗Flash中內(nèi)核、RAMDISK映像文件是否完好。

          n 設備驅(qū)動:串口、SDRAM、Flash、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動支持。

          n 上電自檢功能:SDRAM、Flash大小自動檢測;SDRAM故障檢測;CPU型號。

          n 特殊功能:XIP內(nèi)核引導。

          5.2.3U-Boot源碼導讀

          1.U-Boot源碼結(jié)構(gòu)

          U-Boot源碼結(jié)構(gòu)如圖5.27所示。

          圖5.27U-Boot源碼結(jié)構(gòu)

          n board:和一些已有開發(fā)板有關的代碼,比如makefile和U-Boot.lds等都和具體開發(fā)板的硬件和地址分配有關。

          n common:與體系結(jié)構(gòu)無關的代碼,用來實現(xiàn)各種命令的C程序。

          n cpu:包含CPU相關代碼,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S等。其中cpu.c初始化CPU、設置指令Cache和數(shù)據(jù)Cache等;interrupt.c設置系統(tǒng)的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;匯編代碼文件start.S是U-BOOT啟動時執(zhí)行的第一個文件,它主要是設置系統(tǒng)堆棧和工作方式,為進入C程序奠定基礎。

          n disk:disk驅(qū)動的分區(qū)相關代碼。

          n doc:文檔。

          n drivers:通用設備驅(qū)動程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。

          n fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs等。

          n include:頭文件,還有對各種硬件平臺支持的匯編文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。

          n net:與網(wǎng)絡有關的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實現(xiàn)。

          n lib_arm:與ARM體系結(jié)構(gòu)相關的代碼。

          n tools:創(chuàng)建S-Record格式文件和U-BOOTimages的工具。

          c語言相關文章:c語言教程


          linux相關文章:linux教程



          上一頁 1 2 3 4 5 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();