第八章嵌入式系統(tǒng)BootLoader技術_第1頁
第八章嵌入式系統(tǒng)BootLoader技術_第2頁
第八章嵌入式系統(tǒng)BootLoader技術_第3頁
第八章嵌入式系統(tǒng)BootLoader技術_第4頁
第八章嵌入式系統(tǒng)BootLoader技術_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第八章 嵌入式系統(tǒng)Boot Loader技術計算機科學技術學院祝勇主要內容Boot Loader的概念Boot Loader的主要任務Boot Loader的框架結構Boot Loader的安裝過程引言在專用的嵌入式開發(fā)板運行 GNU/Linux 系統(tǒng)已變得越來越流行。一個嵌入式 Linux 系統(tǒng)從軟件的角度看通常能分為四個層次: 1. 引導程序加載。包括固化在固件(firmware)中的 boot 代碼(可選),和 Boot Loader 兩大部分。2. Linux 內核。特定于嵌入式開發(fā)板的制定內核及內核的啟動參數(shù)。3. 文件系統(tǒng)。包括根文件系統(tǒng)和建立于 Flash 內存設備之上文件系統(tǒng)。

2、通常用 ram disk 來作為 root fs。4. 用戶應用程序。特定于用戶的應用程序。有時在用戶應用程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式 GUI 有:Micro視窗系統(tǒng) 和 MiniGUI 。引言引導程序加載是系統(tǒng)加電后運行的第一段軟件代碼。在嵌入式系統(tǒng)中,系統(tǒng)在上電或復位時通常都從地址0 x00000000 處開始執(zhí)行,而在這個地址處安排的通常就是系統(tǒng)的 Boot Loader程序。 8.1 Boot Loader的基本概念簡單地說,Boot Loader就是在操作系統(tǒng)內核運行之前運行的一段小程序。通過這段小程序,我們能初始化硬件設備、建立內存空間的映射圖,

3、從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境。8.1.1 Boot Loader的相關設備和機制通常,Boot Loader 是嚴重地依賴于硬件而實現(xiàn)的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的Boot Loader 幾乎是不可能的。盡管如此,我們仍然可以對Boot Loader 歸納出一些通用的概念來,以指導用戶特定的Boot Loader 設計與實現(xiàn)。8.1.1 Boot Loader的相關設備和機制Bootloader是一段可執(zhí)行程序,完成的主要功能是將可執(zhí)行文件(一般是操作系統(tǒng))搬移到內存中,然后將控制權交給這段可執(zhí)行文件(操作系統(tǒng)

4、)。cpuloaderflashOSmemoryOSBoot Loader的設計和實現(xiàn)1、 Boot Loader 所支持的 CPU 和嵌入式板每種不同的 CPU 體系結構都有不同的 Boot Loader。有些 Boot Loader 也支持多種體系結構的 CPU,比如 U-Boot 就同時支持 ARM 體系結構和MIPS 體系結構。除了依賴于 CPU 的體系結構外,Boot Loader 實際上也依賴于具體的嵌入式板級設備的配置。Boot Loader的設計和實現(xiàn)2、 Boot Loader 的安裝媒介(Installation Medium)系統(tǒng)加電或復位后,所有的 CPU 通常都從某個

5、由 CPU 制造商預先安排的地址上取指令固態(tài)存儲設備的典型空間分配結構Boot Loader的設計和實現(xiàn)3、用來控制 Boot Loader 的設備或機制主機和目標機之間一般通過串口建立連接,Boot Loader 軟件在執(zhí)行時通常會通過串口來進行 I/O,比如:輸出打印信息到串口,從串口讀取用戶控制字符等Boot Loader的設計和實現(xiàn)經典2410開發(fā)平臺硬件UART網(wǎng)卡NANDSDRAMS3C2410JTAGBoot Loader的設計和實現(xiàn)4. Boot Loader 的啟動過程是單階段(Single Stage)還是多階段(Multi-Stage通常多階段的 Boot Loader

6、能提供更為復雜的功能,以及更好的可移植性。從固態(tài)存儲設備上啟動的 Boot Loader 大多都是 2 階段的啟動過程,也即啟動過程可以分為stage 1 和 stage 2 兩部分Boot Loader的設計和實現(xiàn)5. Boot Loader 的操作模式 (Operation Mode)大多數(shù) Boot Loader 都包含兩種不同的操作模式:啟動加載模式和下載模式Boot Loader 的操作模式啟動加載模式嵌入式產品發(fā)布的時候,Bootloader必須工作在該模式下。這種情況下,Bootloader必須完成硬件自檢、配置,并從Flash中將內核拷貝到SDRAM中,并跳轉到內核入口,實現(xiàn)自

7、啟動,而不需要人為的干預。Boot Loader 的操作模式下載模式對研發(fā)人員來說,Bootloader一般需要工作在這種模式下,特別是調試內核或者Bootloader本身的時候。通過串口終端與Bootloader進行交互,可以操作系統(tǒng)硬件。比如通過網(wǎng)口或者串口下載內核,燒寫Flash等等。Boot Loader的設計和實現(xiàn)6. BootLoader 與主機之間進行文件傳輸所用的通信設備及協(xié)議1、通過串口與主機之間進行文件傳輸,傳輸協(xié)議通常是 xmodemymodemzmodem 協(xié)議中的一種。2、通過以太網(wǎng)連接并借助 TFTP 協(xié)議來下載文件。8.1.2 Boot Loader 的主要任務與

8、典型結構框架Boot Loader的總目標就是正確地調用內核來執(zhí)行由于 Boot Loader 的實現(xiàn)依賴于 CPU 的體系結構,因此大多數(shù) Boot Loader都分為 stage1 和 stage2 兩大部分。依賴于 CPU 體系結構的代碼,比如設備初始化代碼等,通常都放在 stage1 中,而且通常都用匯編語言來實現(xiàn),以達到短小精悍的目的。而 stage2 則通常用C語言來實現(xiàn),這樣可以實現(xiàn)給復雜的功能,而且代碼會具有更好的可讀性和可移植性。Boot Loader 的 階段1(stage1)1、硬件設備初始化2、為加載 Boot Loader 的 stage2 準備 RAM 空間3、拷貝

9、 Boot Loader 的 stage2 到 RAM 空間中4、設置好堆棧5、跳轉到 stage2 的 C 入口點基本的硬件初始化屏蔽所有的中斷設置 CPU 的速度和時鐘頻率RAM 初始化初始化 LED關閉 CPU 內部指令數(shù)據(jù) cache加載 stage2 準備 RAM 空間分配的空間大小最好是 memory page 大小(通常是 4KB)的倍數(shù)。確保所安排的地址范圍是可讀寫的 RAM 空間將所安排的 RAM 空間范圍進行清零操作拷貝 stage2 到 RAM 中stage2 的可執(zhí)行映象在固態(tài)存儲設備的存放起始地址和終止地址 RAM 空間的起始地址設置堆棧指針 sp堆棧指針的設置是為了

10、執(zhí)行 C 語言代碼作好準備,通常把sp的值設置為state2_end-4系統(tǒng)物理內存布局如下圖所示跳轉到 stage2 的 C 入口點在ARM 系統(tǒng)中,可以通過修改 PC 寄存器為合適的地址來實現(xiàn)Boot Loader 的 階段2(stage2)1、初始化本階段要使用到的硬件設備2、檢測系統(tǒng)內存映射(memory map)3、將kernel映像和根文件系統(tǒng)映像從Flash上讀到RAM空間中4、為內核設置啟動參數(shù)5、調用內核初始化本階段要使用到的硬件設備初始化至少一個串口初始化計時器等檢測系統(tǒng)的內存映射(memory map)所謂內存映射就是指在整個 4GB 物理地址空間中有哪些地址范圍被分配用

11、來尋址系統(tǒng)的 RAM 單元內存映射的描述內存映射的檢測 加載內核映像和根文件系統(tǒng)映像規(guī)劃內存占用的布局(1)內核映像所占用的內存范圍(2)根文件系統(tǒng)所占用的內存范圍從 Flash 上拷貝設置內核的啟動參數(shù)在嵌入式 Linux 系統(tǒng)中,通常需要由 Boot Loader 設置的常見啟動參數(shù)有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等調用內核Boot Loader 調用 Linux 內核的方法是直接跳轉到內核的第一條指令處,也即直接跳轉到 MEM_START0 x8000 地址處。調用內核內核啟動的條件(1)CPU寄存器設置

12、R0=0;R1=機器類型ID;R2=啟動參數(shù)標記列表在RAM中的起始基地址(2)CPU模式必須禁止中斷(IRQs和FIQs);CPU必須使用SVC模式 ;(3)cache和MMU的設置MMU必須關閉;指令cache可以打開也可以關閉;數(shù)據(jù)cache必須關閉 8.2 Boot Loader(vivi)的代碼分析Vivi 是韓國MIZI公司專門為三星公司S3C24XX芯片設計的Boot Loader。源碼樹如下:Vivi-+-arch-+-s3c24xx|-Documentation|-drivers-+-serial| -mtd-+-maps| |-nor| -nand|-include-+-p

13、latform| |-mtd| proc|-init|-lib-+-priv_data|-scripts-+-lxdialog|-test|-util8.2 Boot Loader(vivi)的代碼分析階段1階段1從程序arch/s3c24xx/head.S開始,按照head.S的代碼執(zhí)行順序,依次完成了下面幾個任務:(1)關閉看門狗(2)禁止所有中斷(3)初始化系統(tǒng)時鐘(4)初始化內存控制寄存器(5)檢查是否從掉電模式喚醒(6)點亮所有LED(7)初始化UART0,設置工作方式、波特率等(8)跳到內存測試函數(shù)(9)如果定義以NAND Flash方式啟動,則將vivi所有代碼從NAND Fla

14、sh復制到SDRAM中(10)跳到Boot Loader的階段2運行。8.2 Boot Loader(vivi)的代碼分析階段2階段2從init/main.c中的main函數(shù)開始執(zhí)行,一次完成:(1)reset_handler,內存清零(lib/reset_handle.c)(2)board_init(),初始化定時器和設置GPIO引腳功能(arch/s3c24xx/smdk.c)(3)建立頁表和啟動MMU(/arch/s3c24xx/mmu.c)mem_map_init();mmu_init();(4)heap_init,申請內存區(qū)域(5)mtd_dev_init,掃描所使用的NAND Fl

15、ash型號,構造MTD設備。U-Boot簡介 1999年由德國DENX軟件工程中心的Wolfgang Denk發(fā)起,全稱Universal Bootloader。特點:支持多種硬件構架:包括ARM、x86、PPC、MIPS、m68k、NIOS、Blackfin支持多種操作系統(tǒng):包括Linux、VxWorks、NETBSD、QNX、RTEMS、ARTOS、LynxOS支持多達216種以上的開發(fā)板開放源代碼,遵循GPL條款易于移植、調試官方網(wǎng)站:http:/www.denx.de/wiki/U-Boot/WebHomeU-Boot 啟動分析U-Boot目錄結構board 目標板相關文件,主要包含硬

16、件初始化、SDRAM初始化common 獨立于處理器體系結構的通用代碼 cpu 與處理器相關的文件,包含cpu初始化、串口初始化、中斷初始化等代碼doc U-Boot的說明文檔drivers 設備驅動代碼,如Flash驅動、網(wǎng)卡驅動、串口驅動等fs U-Boot支持的文件系統(tǒng)的實現(xiàn),如cramfs、fat、ext2、jffs2等include U-Boot使用的頭文件,包括不同硬件構架的頭文件lib_xxx 處理器相關文件,如我們要使用的lib_arm,與arm體系結構相關的文件net 網(wǎng)絡功能的上層文件,實現(xiàn)各種協(xié)議,如nfs、tftp、arp等U-Boot 啟動分析U-Boot啟動流程之s

17、tage1第一階段的代碼位于cpu/arm920t/start.S中,依次完成以下功能:1、系統(tǒng)上電,進入svc模式2、關閉看門狗,禁止所有中斷3、進行初級硬件初始化4、將自身代碼拷貝到SDRAM中5、設置堆棧6、清空bss段7、跳轉到C語言實現(xiàn)的stage2中U-Boot 啟動分析程序跳轉的實現(xiàn)ldr pc, _start_armboot _start_armboot: .word start_armboot_start_armboot和start_armboot都是symbol,程序鏈接時由連接器使用。上面程序的第二行表示在symbol處放置一個值,這個值就是start_armboot的鏈

18、接地址,也是程序代碼存放的地址。將這個地址放入PC中,從而實現(xiàn)程序的跳轉。U-Boot 啟動分析U-Boot啟動流程之stage2start_armboot 函數(shù)是c語言的入口函數(shù),定義在lib_arm/board.c中。調用初始化序列:init_fnc_t *init_sequence = board_init, / board/up2410/up2410.c中實現(xiàn),主要更新GPIO和PLL設置 還包括內核啟動參數(shù)存放地址設置、ARCH_NUMBER設置interrupt_init, /在cpu/arm920t/s3c24x0/interrupts.c實現(xiàn),初始化時鐘中斷env_init,

19、/在common/env_nand.c中實現(xiàn),設置缺省環(huán)境變量init_baudrate, /在lib_arm/board.c中實現(xiàn),設置環(huán)境變量中的串口波特率serial_init, /在common/serial.c中實現(xiàn),初始化串口(硬件層面)display_banner, /在lib_arm/board.c中實現(xiàn),打印U-Boot的bannerdram_init, / 在board/up2410/up2410.c中實現(xiàn),初始化SDRAMNULL,;U-Boot 啟動分析U-Boot啟動流程之stage2進入無限循環(huán):for (;) main_loop ();main_loop在comm

20、on/main.c中實現(xiàn)。它通過串口和U-Boot進行交互,以便引導內核或進行其他參數(shù)的修改、設置。U-Boot 啟動分析U-Boot啟動Linux內核(1/3)ARM Linux Kernel Boot Requirements :U-Boot 啟動分析設置machine type number定義在include/asm-arm/mach-types.h中#define MACH_TYPE_SMDK2410 193賦值在board_init函數(shù)中gd-bd-bi_arch_number = MACH_TYPE_SMDK2410;把該值設置到環(huán)境變量中。U-Boot 啟動分析U-Boot啟動

21、Linux內核(2/3)do_bootm_linux函數(shù),在lib_arm/armlinux.c中實現(xiàn)。由u-boot命令do_bootm函數(shù)調用 (common/cmd_bootm.c)設置內核啟動參數(shù):setup_start_tag (bd);setup_serial_tag (¶ms);setup_revision_tag (¶ms);setup_memory_tags (bd);setup_commandline_tag (bd, commandline);setup_videolfb_tag (gd_t *) gd);setup_end_tag (bd);內核啟動參數(shù)

22、存放地址:0 x30000100,在board_init函數(shù)(board/uptech_2410class/smdk2410.c) 中設置。U-Boot 啟動分析U-Boot啟動Linux內核(3/3)theKernel函數(shù)指針:聲明:void (*theKernel)(int zero, int arch, uint params);賦值:theKernel = (void (*)(int, int, uint)ntohl(hdr-ih_ep);U-Boot 啟動分析跳轉到內核入口處前面已經從環(huán)境變量中讀出了machine type number,設置好了內核啟動所需參數(shù),只需要跳轉到內核入

23、口處就可以了:theKernel (0, machid, bd-bi_boot_params);根據(jù)AAPCS,r0、r1和r2中分別放置了0、machid和啟動參數(shù)的地址。U-Boot 啟動分析一、建立板級支持包BOARD支持:目前U-boot支持上百種不同架構CPU生產廠商的開發(fā)板,如Marvell、atmel、altera、pxa255、omap、smdk2410等。根據(jù)S3C2410處理器,在board目錄下依照smdk2410目錄配置,創(chuàng)建自己開發(fā)板的板級資源目錄,相應的在include/configs目錄下創(chuàng)建頭文件。修改規(guī)則文件Makfile,添加開發(fā)板編譯參數(shù)支持。U-Boot

24、 移植的一般步驟二、添加外設支持添加存儲設備支持:NANDFLASH啟動支持添加網(wǎng)絡設備支持DM9000A添加USB接口支持添加文件系統(tǒng)支持U-Boot 移植的一般步驟三、設置環(huán)境變量U-Boot中提供了豐富的命令,smdk2410開發(fā)板配置了一部分命令,我們需要通過相應的環(huán)境變量為自己的開發(fā)板增加一些命令: #define CONFIG_CMD_NAND#define CONFIG_CMD_PING#define CONFIG_CMD_DLF#define CONFIG_CMD_ENV#define CONFIG_CMD_NET#define CONFIG_BOOTDELAY 3#defin

25、e CFG_LOAD_ADDR 0 x30008000 #define CFG_TFTP_LOAD_ADDR 0 x30008000 以上環(huán)境變量在開發(fā)板的頭文件中定義U-Boot 移植的一般步驟四、編譯U-boot配置開發(fā)板:# make uptech_2410class_configConfiguring for uptech_2410class board. 編譯:# make 編譯成功后會在源碼目錄下生成U-Boot 二進制文件u-boot.binU-Boot 移植的一般步驟五、燒寫U-boot安裝PC機端GIVEIO驅動,使用并口JTAG連接ARM設備,利用sjf2410.exe軟件

26、燒寫u-boot.bin文件U-Boot 移植的一般步驟U-Boot的使用(1/3)1、printenv 打印環(huán)境變量打印U-Boot的環(huán)境變量,包括串口波特率、ip地址、mac地址、內核啟動參數(shù)、服務器ip地址等等。2、setenv 設置環(huán)境變量對環(huán)境變量的值進行設置,保存在SDRAM中,但不寫入Flash。這樣系統(tǒng)掉電以后設置的環(huán)境變量就不存在了。3、saveenv 保存環(huán)境變量將環(huán)境變量寫入Flash,永久保存。掉電以后不消失。U-Boot 的使用U-Boot的使用(2/3)4、ping 測試網(wǎng)絡命令ping命令用于測試目標板的網(wǎng)絡是否通暢。格式:ping + ipaddr5、tftp 通過tftp協(xié)議下載文件至SDRAM將tftp服務器上的文件下載到指定的地址,速度快。格式:tftp + 存放地址 + 文件名6、loadb 通過串口下載二進制文件在目標板不具備網(wǎng)絡功能的時候,可以配合超級終端下載二進制文件至內存中。缺點是速度慢。格式:loadb + 存放地址U-Boot 的使用U-Boot的使用(3/3)7、nandflash

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論