第七章嵌入式BootLoard技術及Linux根文件系統(tǒng)_第1頁
第七章嵌入式BootLoard技術及Linux根文件系統(tǒng)_第2頁
第七章嵌入式BootLoard技術及Linux根文件系統(tǒng)_第3頁
第七章嵌入式BootLoard技術及Linux根文件系統(tǒng)_第4頁
第七章嵌入式BootLoard技術及Linux根文件系統(tǒng)_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章

BootLoard及根文件系統(tǒng)第一節(jié)嵌入式BootLoard技術Bootloader的概念BootLoader的操作模式主要任務與典型結構框架的Bootloader(vivi)BLOB簡介7.1Bootloader的概念BootLoader就是在操作系統(tǒng)內核運行之前運行的一段小程序。通過它,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境。通常,BootLoader是嚴重地依賴于硬件而實現(xiàn)的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的BootLoader幾乎是不可能的。盡管如此,我們仍然可以對BootLoader歸納出一些通用的概念來,以指導用戶特定的BootLoader設計與實現(xiàn)。7.1.1BootLoader所支持的

CPU和嵌入式板通常,每種CPU體系結構都有不同的BootLoader。有些BootLoader也支持多種體系結構的CPU,比如U-Boot就同時支持ARM體系結構和MIPS體系結構。移植的工作,Bootloader的板級移植7.1.2BootLoader的安裝媒介系統(tǒng)加電或復位后,所有的處理器通常都從某個預先安排的地址上取指令。比如,ARM在復位時從地址0x0取指。嵌入式系統(tǒng)中通常都有某種類型的固態(tài)存儲設備(比如:ROM、EEPROM或FLASH等)被映射到這個預先安排的地址上。因此在系統(tǒng)加電后,處理器將首先執(zhí)行BootLoader程序Bootloader是最先被系統(tǒng)執(zhí)行的程序7.1.3固態(tài)存儲設備的典型空間分配結構Bootloader參數(shù)系統(tǒng)內核根文件系統(tǒng)Flash從低地址到高地址方向7.1.4BootLoader的控制方式主機和目標機之間一般通過串口建立連接,BootLoader軟件在執(zhí)行時通常會通過串口來進行通訊,比如:輸出打印信息到串口,從串口讀取用戶控制字符也可以通過JTAG等其他接口通訊7.2BootLoader的操作模式大多數(shù)BootLoader都包含兩種不同的操作模式:啟動加載模式下載模式最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載工作模式的區(qū)別7.2.1啟動加載模式啟動加載模式,稱為“自主”(Autonomous)模式

BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產品發(fā)布的時侯,BootLoader顯然必須工作在這種模式下。7.2.2下載模式在下載模式下,目標機上的BootLoader將通過串口連接或網(wǎng)絡連接等通信手段從主機下載文件,如:下載內核映像和根文件系統(tǒng)映像等從主機下載的文件通常首先被BootLoader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設備中。這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。7.2.3BootLoader

與主機通信串口傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem

。程序簡單,傳輸?shù)乃俣缺容^慢,115200bps通過以太網(wǎng)傳輸是個好方法。TFTP協(xié)議是最常見的方式

7.3BL的主要任務與典型結構框架大多數(shù)BootLoader都分為stage1和stage2兩大部分。依賴于處理器體系結構和板級初始化的代碼,通常都放在stage1中,用匯編言實現(xiàn)而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)更復雜的功能,而且代碼會具有更好的可讀性和可移植性。7.3.1BootLoader的stage1通常包括以下步驟(以執(zhí)行的先后順序):硬件設備初始化。為加載BootLoader的stage2準備RAM空間。拷貝BootLoader的stage2到RAM空間中。設置好堆棧。跳轉到stage2的C入口點。

7.3.2BootLoader的stage2(1/2)通常包括以下步驟(以執(zhí)行的先后順序):初始化本階段要使用到的硬件設備。檢測系統(tǒng)內存映射(memorymap)。將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中。為內核設置啟動參數(shù)。調用內核。7.3.2BootLoader的stage2確(2/2)stage2的代碼通常用C語言來實現(xiàn),以便于實現(xiàn)更復雜的功能和取得更好的代碼可讀性和可移植性。與普通C語言應用程序不同的是,在編譯和鏈接bootloader這樣的程序時,我們不能使用glibc

庫中的任何支持函數(shù)。7.4Linux的Bootloader系統(tǒng)配置、中斷接管、引導裝載內核、根文件系統(tǒng)、參數(shù)傳遞、內核調試、內核和根文件系統(tǒng)的下載等等常見的uClinux(Linux)的Bootloader:RedbootBlobViviUbootarmBoot…7.4.1vivi

(1/2)UP-NETARM2410-S平臺的引導程序結構簡單基本功能:xmodem,F(xiàn)lash(Nand、Nor)壞塊管理保存參數(shù)7.4.1vivi

(2/2)支持Linux內核引導,可以傳遞內核參數(shù)支持分區(qū)(bon)命令行7.4.2引導裝載程序的詳細設計第1階段代碼設計第2階段入口代碼設計FLASH的驅動設計串口驅動設計XMODEM協(xié)議的設計存儲器空間分布設計編譯、連接腳本設計網(wǎng)絡接口(可選)7.4.3閱讀Linux源碼的工具在windows平臺下SourceInsight(讀C代碼)UltraEdit(讀匯編)7.4.4vivi的啟動過程vivi從vivi/arch/s3c2410/head.S開始配置PLL、SDRAM、IO、中斷等查看連接文件vivi/arch/vivi.lds程序定位在0x33f00000ARM指令的特點跳轉到第二階段on_the_ram7.4.5vivi的第二階段流程設置復位模式板上其他外設初始化內存映射,MMU初始化系統(tǒng)堆(heap)空間初始化MTD設備(分區(qū))初始化初始化vivi命令進入命令行或者引導系統(tǒng)7.4.6vivi的啟動流程-裝載主要組件初始化文件系統(tǒng)裝載組件:boot_kernel.c:copy_kernel_img(to,(char*)from,size,media_type);運行裝載后文件:boot_kernel.c:call_linux(0,mach_type,to);loaderrambitsflashbitsvivi的內存映射7.4.7vivi的命令命令處理在lib/command.c文件中add_commandfind_cmdexeccmdcommand_help1.vivi的命令使用vivi>help

cpu[{cmds}]--Managecpuclocksbon[{cmds}]--Managethebonfilesystemreset--Resetthesystem

param[set|show|save|reset]--set/getparameterpart[add|del|show|reset]--ManageMTDpartitions

mem[{cmds}]--ManageMemoryload{...}--LoadafiletoRAM/Flashgo<addr><a0><a1><a2><a3>--jumpto<addr>dump<addr><length>--Display(hexdump)arangeofmemory.call<addr><a0><a1><a2><a3>--jump_with_returnto<addr>boot[{cmds}]--Bootinglinuxkernel

bootucos[{cmds}]--Bootingucossystemhelp[{cmds}]--Helpabouthelp?2.添加vivi的命令命令初始化流程:main.cinit_builtin_cmdsadd_command添加命令的流程示例:cp–af./arch/s3c2410/smdk2410_test.c./lib/my_test.c

編輯./lib/Config_cmd.inbool'built-inmytestcommand'CONFIG_MY_TEST編輯./lib/Makefileobj-$(CONFIG_TEST)+=my_test.o編輯my_test.c文件init_builtin_cmds中添加命令:externuser_command_t

my_test_cmd;add_command(&my_test_cmd);makemenuconfig

中添加命令的配置[*]built-inmytestcommand7.4.7vivi

bootloader的下載1、loadflashucosx

(注意:不是loadflashvivix)2、使用x-modem協(xié)議下載3、bootucos4、help命令:mytest[{cmds}]--Testfunctions5、mytest命令:vivi>mytestUsage:testsleep--Testsleepmode.(pwbtiseint0)testint--Testexternalinterrupt0testled--TestLEDs7.4.8在跳到內核時要滿足的條件1.CPU寄存器的設置:

R0=0;

R1=機器類型ID;關于MachineTypeNumber,可以參見linux/arch/arm/tools/mach-types。

R2=啟動參數(shù)標記列表在RAM中起始基地址;2.CPU模式:

·必須禁止中斷(IRQs和FIQs);

·CPU必須為Supervisor的保護模式;3.Cache和MMU的設置:

·MMU必須關閉;

·指令Cache可以打開也可以關閉;

·數(shù)據(jù)Cache必須關閉;7.4.9各種模式下的可見寄存器7.4.10linux內核的引導lib/boot_kernel.c中的boot_kernel函數(shù)傳遞啟動參數(shù)退出vivi,處理cachevoidcall_linux(longa0,longa1,longa2)

函數(shù)負責啟動7.5BLOB簡介BootLoaderOBject

縮寫結構簡單功能完整:xmodem,tftp,flash等支持Linuxkernel引導,可以傳遞內核參數(shù)支持分區(qū)7.5.1Blob從哪里開始?正常的啟動是從src/blob/start.S開始xlli接口,則和平臺相關XLLI:LowLevelInitializationxlli的優(yōu)點:增強了平臺的移植性XLLI示例EXPORTxlli_GPIO_init;InitializetheGPIOpinsforthisplatformEXPORTxlli_MFPR_init;InitializetheMultiFunctionPinRegistersEXPORTxlli_MFPR_offset_table;MFPRoffsetloouptableEXPORTxlli_Dmem_initP1;DynamicMemoryControllerInitializationPart#1EXPORTxlli_Rcomp;RunRcompcalibrationEXPORTxlli_DDR_HCAL;HardwaredelaylinecalibrationroutineEXPORTxlli_DDR_SCAL;SoftwaredelaylinecalibrationroutineEXPORTxlli_Dmem_initP2;DynamicMemoryControllerInitializationPart#2EXPORTxlli_Smem_init;StaticMemoryControllerInitializationEXPORTxlli_intr_init;Interruptinitialization(masksallinterrupts)EXPORTxlli_freq_change;FrequencychangesequenceEXPORTxlli_icache_enable;EnableI-Cache,D-Cache,andBranchTargetBufferEXPORTxlli_setPTB;SetthePageTabeBaseaddress(usedforsleepresets)EXPORTxlli_initPageTable;InitializePageTableforMMUunitEXPORTxlli_initPageTable_var;InitializePageTableforMMUunit(baseaddrinr1)EXPORTxlli_MMU_init;InitializetheMemoryManagementUnitEXPORTxlli_goVirtual;Makethetransitionfromphysicaladdresstovirtualaddress從XLLI接口啟動src/blob/xlli/mainstone/start.s區(qū)分上電復位和休眠IO初始化內存初始化配置鎖頻環(huán)相關include文件xlli_Mainstone_defs.incxlli_Bulverde_defs.inc標準的Blob啟動從src/blob/start-pxa.S開始IO初始化內存初始化normal_boot完成的工作normal_boot在src/blob/start.s中定義復制blob后半部到內存為什么要復制?Blob的兩個連接配置腳本start-ld-script,啟動部分的定位。入口是_startrest-ld-script,后半部的定位。入口是_trampoline_trampoline負責初始化C代碼空間,跳轉到C代碼中運行Blob的C代碼中的初始化工作init_subsystems完成的任務,初始化initlist中的函數(shù)——驅動程序初始化的好地方Blob中串口驅動程序結構src/blob/mainstone.cserial_driver_t

pxa_serial_driver={ init: pxa_serial_init, read: pxa_serial_read, write: pxa_serial_write, poll: pxa_serial_poll,

flush_input: pxa_serial_flush_input,

flush_output: pxa_serial_flush_output};Blob的存儲器區(qū)域分配FLASHSDRAM大小Blob0-256KB0xA0020000256KB參數(shù)256-512KB0xA01ff000256KB內核512KB-2MB0xA02000001.5MB根文件系統(tǒng)2-16MB0xA040000014MBmain.c流程圖Blob中添加命令使用__commandlist宏#define__command__attribute__((unused,__section__(".commandlist")))#define__commandlist(fn,nm,hlp)\staticcommandlist_t__command_##fn__command={\ magic:COMMAND_MAGIC,\ name:nm,\ help:hlp,\ callback:fn}舉例__commandlist(Reload,"reload",reloadhelp);被替換為:staticcommandlist_t__command_Reload__attribute__((unused,__section__(".commandlist")))={ magic:COMMAND_MAGIC, name:“reload”, help:reloadhelp, callback:Reload}第二節(jié)

構建嵌入式Linux根文件系統(tǒng)Linux根文件系統(tǒng)介紹根文件系統(tǒng)的目錄結構使用Busybox生成工具集根文件系統(tǒng)啟動流程根文件系統(tǒng)燒寫流程Linux根文件系統(tǒng)介紹內核啟動的最后步驟--掛載根文件系統(tǒng),包含:Init進程Shell文件系統(tǒng)、網(wǎng)絡系統(tǒng)等等的工具集系統(tǒng)配置文件鏈接庫Linux根文件系統(tǒng)目錄結構bin 必要的用戶命令(二進制文件)*boot

引導加載程序使用的靜態(tài)文件dev

設備文件及其他特殊文件etc系統(tǒng)配置文件*home用戶主目錄lib必要的鏈接庫,例如:C鏈接庫、內核模塊mnt

臨時掛載的文件系統(tǒng)的掛載點“*”目錄在嵌入式Linux上為可選的。Linux根文件系統(tǒng)目錄結構*opt附加軟件的安裝目錄proc提供內核和進程信息的proc文件系統(tǒng)*rootroot用戶主目錄sbin

必要的系統(tǒng)管理員命令tmp

臨時文件目錄usr

大多數(shù)用戶使用的應用程序和文件目錄var

監(jiān)控程序和工具程序存放的可變數(shù)據(jù)Linux根文件系統(tǒng)目錄結構/dev目錄設備文件及其他特殊文件當配置內核支持設備文件系統(tǒng)devfs時,此目錄中的設備節(jié)點由內核和驅動程序自動創(chuàng)建Linux根文件系統(tǒng)目錄結構/lib目錄存放系統(tǒng)必要的動態(tài)鏈接庫,支持系統(tǒng)的正常啟動:ld 動態(tài)鏈接器 必要libc

主C鏈接器進程 必要libm

數(shù)學進程 數(shù)學函數(shù)需要用到libcrypt

密碼學進程 多數(shù)涉及認證的應用程序需要使用完整說明參見glibc使用手冊Linux根文件系統(tǒng)目錄結構/etc目錄--系統(tǒng)配置文件fstab

掛載文件系統(tǒng)的配置文件passwd Password文件inetd.conf

Inetd守護進程的配置文件group Group文件init.d/rcS

缺省的sysinit

腳本使用Busybox生成工具集很小的應用程序提供完整的工具集的功能Init進程Shell文件系統(tǒng)、網(wǎng)絡系統(tǒng)等等的工具集http:///Busybox的配置和交叉編譯(1)在http:///downloads/

下載Busybox:busybox-1.1.0.tar.bz2解壓后,進入配置菜單:

makemenuconfigBusybox的配置和交叉編譯(2)Busybox的配置和交叉編譯(3)選擇Busybox的編譯方式:BuildOptions BuildBusyBoxasastaticbinary(nosharedlibs)

缺省配置為使用鏈接庫Busybox的配置和交叉編譯(3)配置交叉編譯器:BuildOptions[*]DoyouwanttobuildBusyBoxwithaCrossCompiler?(/home/wbn/arm2410/tools/usr/local/arm/3.4.1/bin/arm-linux-)CrossCompilerprefix安裝路徑:InstallationOptions

(./_install)BusyBoxinstallationprefixBusybox的配置和交叉編譯(4)配置其他工具集:ArchivalUtilitiesCoreutilsConsoleUtilitiesDebian

UtilitieEditorsFindingUtilitiesInitUtilitiesLogin/PasswordManagementUtilitiesMiscellaneousUtilitiesLinuxModuleUtilitiesNetworkingUtilitiesProcessUtilitiesShellsSystemLoggingUtilitiesLinuxSystemUtilitiesBusybox的配置和交叉編譯(4)配置其他工具集:InitUtilities[*]init[*]Supportreadinganinittabfile?[*]Supportrunninginitfromwithinaninitrd?編譯后

/bin

/linuxrc->bin/busybox

/sbinBusybox的配置和交叉編譯(4)配置其他工具集:ArchivalUtilities

工具:tar、zip、unzipCoreutils

常用命令:basenamecatchgrp

chmoddatedd

dfechoenv

ln

ls

mkdir

mknod

mv

pwd

rm

rmdirsleepsortsyncwc

whoami等等Editors

編輯命令:viawk

sed等FindingUtilities

查找命令:findgrep

xargsBusybox的配置和交叉編譯(4)配置其他工具集:

Login/PasswordManagementUtilities Login:gettyloginpasswd NetworkingUtilities

網(wǎng)絡命令集:hostnameifconfig

inetd

netstatpingroute ProcessUtilities

進程命令:freeps

sysctltop Shells shell工具:ash等

SystemLoggingUtilities

日志工具:syslogd

klogd

LinuxSystemUtilities

系統(tǒng)工具:dmesg

fdisk

getoptmoremountumountBusybox的配置和交叉編譯(5)編譯Busybox:

#makedep

#make

#makeinstallBusybox的配置和交叉編譯(6)編譯生成的目錄結構:/bin/linuxrc/sbin/usr /usr/bin /usr/sbin構建根文件系統(tǒng)在$root/etc目錄下,建立配置文件:init.d/rcS

缺省的sysinit

腳本[/etc]cat

init.d/rcS#!/bin/sh/bin/mount-a/bin/mount-n-tramfs

ramfs/var/bin/mount-n-tramfs

ramfs/root/bin/mkdir/var/tmp/bin/mkdir/var/modules/bin/mkdir/var/run/bin/mkdir/var/logexec/usr/etc/rc.local構建根文件系統(tǒng)在$root/etc目錄下,建立配置文件:fstab

掛載文件系統(tǒng)的配置文件[/etc]cat

fstabnone/procprocdefaults00none/dev/ptsdevptsmode=062200tmpfs/dev/shm

tmpfsdefaults00/dev/mtdblock/1/mnt/yaffs

yaffsdefaults11/dev/scsi/host0/bus0/target0/lun0/part1/mnt/udisk

vfat

noauto,codepage=936,iocharset=cp93600/dev/ide/host0/bus0/target0/lun0/part1/mnt/hdap1vfat

noauto,codepage=936,iocharset=cp93600/dev/ide/host0/bus0/target0/lun0/part2/mnt/hdap2vfat

noauto,codepage=936,iocharset=cp93600/dev/ide/host0/bus0/target0/lun0/part3/mnt/hdap3vfat

noauto,codepage=936,iocharset=cp93600/dev/ide/host0/bus0/target1/lun0/part1/mnt/hdbp1vfat

noauto,codepage=936,iocharset=cp93600/dev/mmc/disc0/part1/mnt/sdcard

vfat

noauto,codepage=936,iocharset=cp93600構建根文件系統(tǒng)在$root/etc目錄下,建立配置文件:inetd.conf

services

protocols

Inetd守護進程的配置文件[/etc]cat

inetd.conf#<service_name><sock_type><proto><flags><user><server_path><args>ftpstreamtcp

nowaitroot/sbin/ftpd

ftpdtelnetstreamtcp

nowaitroot/sbin/in.telnetd

in.telnetdinetd.conf只能使用/etc/services中限定的服務inetd.conf只能使用/etc/protocols中限定的協(xié)議構建根文件系統(tǒng)在$root/etc目錄下,建立配置文件:profile:ash的配置腳本[/etc]catprofile#/etc/profile:executedbybash(1)forloginsh

溫馨提示

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

評論

0/150

提交評論