第七章嵌入式BootLoard技术及Linux根文件系统_第1页
第七章嵌入式BootLoard技术及Linux根文件系统_第2页
第七章嵌入式BootLoard技术及Linux根文件系统_第3页
第七章嵌入式BootLoard技术及Linux根文件系统_第4页
第七章嵌入式BootLoard技术及Linux根文件系统_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章

BootLoard及根文件系统第一节嵌入式BootLoard技术Bootloader的概念BootLoader的操作模式主要任务与典型结构框架的Bootloader(vivi)BLOB简介7.1Bootloader的概念BootLoader就是在操作系统内核运行之前运行的一段小程序。通过它,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。7.1.1BootLoader所支持的

CPU和嵌入式板通常,每种CPU体系结构都有不同的BootLoader。有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。移植的工作,Bootloader的板级移植7.1.2BootLoader的安装媒介系统加电或复位后,所有的处理器通常都从某个预先安排的地址上取指令。比如,ARM在复位时从地址0x0取指。嵌入式系统中通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,处理器将首先执行BootLoader程序Bootloader是最先被系统执行的程序7.1.3固态存储设备的典型空间分配结构Bootloader参数系统内核根文件系统Flash从低地址到高地址方向7.1.4BootLoader的控制方式主机和目标机之间一般通过串口建立连接,BootLoader软件在执行时通常会通过串口来进行通讯,比如:输出打印信息到串口,从串口读取用户控制字符也可以通过JTAG等其他接口通讯7.2BootLoader的操作模式大多数BootLoader都包含两种不同的操作模式:启动加载模式下载模式最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别7.2.1启动加载模式启动加载模式,称为“自主”(Autonomous)模式

BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。7.2.2下载模式在下载模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,如:下载内核映像和根文件系统映像等从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。7.2.3BootLoader

与主机通信串口传输,传输协议通常是xmodem/ymodem/zmodem

。程序简单,传输的速度比较慢,115200bps通过以太网传输是个好方法。TFTP协议是最常见的方式

7.3BL的主要任务与典型结构框架大多数BootLoader都分为stage1和stage2两大部分。依赖于处理器体系结构和板级初始化的代码,通常都放在stage1中,用汇编言实现而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。7.3.1BootLoader的stage1通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载BootLoader的stage2准备RAM空间。拷贝BootLoader的stage2到RAM空间中。设置好堆栈。跳转到stage2的C入口点。

7.3.2BootLoader的stage2(1/2)通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memorymap)。将kernel映像和根文件系统映像从flash上读到RAM空间中。为内核设置启动参数。调用内核。7.3.2BootLoader的stage2确(2/2)stage2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。与普通C语言应用程序不同的是,在编译和链接bootloader这样的程序时,我们不能使用glibc

库中的任何支持函数。7.4Linux的Bootloader系统配置、中断接管、引导装载内核、根文件系统、参数传递、内核调试、内核和根文件系统的下载等等常见的uClinux(Linux)的Bootloader:RedbootBlobViviUbootarmBoot…7.4.1vivi

(1/2)UP-NETARM2410-S平台的引导程序结构简单基本功能:xmodem,Flash(Nand、Nor)坏块管理保存参数7.4.1vivi

(2/2)支持Linux内核引导,可以传递内核参数支持分区(bon)命令行7.4.2引导装载程序的详细设计第1阶段代码设计第2阶段入口代码设计FLASH的驱动设计串口驱动设计XMODEM协议的设计存储器空间分布设计编译、连接脚本设计网络接口(可选)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初始化系统堆(heap)空间初始化MTD设备(分区)初始化初始化vivi命令进入命令行或者引导系统7.4.6vivi的启动流程-装载主要组件初始化文件系统装载组件: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协议下载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=启动参数标记列表在RAM中起始基地址;2.CPU模式:

·必须禁止中断(IRQs和FIQs);

·CPU必须为Supervisor的保护模式;3.Cache和MMU的设置:

·MMU必须关闭;

·指令Cache可以打开也可以关闭;

·数据Cache必须关闭;7.4.9各种模式下的可见寄存器7.4.10linux内核的引导lib/boot_kernel.c中的boot_kernel函数传递启动参数退出vivi,处理cachevoidcall_linux(longa0,longa1,longa2)

函数负责启动7.5BLOB简介BootLoaderOBject

缩写结构简单功能完整:xmodem,tftp,flash等支持Linuxkernel引导,可以传递内核参数支持分区7.5.1Blob从哪里开始?正常的启动是从src/blob/start.S开始xlli接口,则和平台相关XLLI:LowLevelInitializationxlli的优点:增强了平台的移植性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区分上电复位和休眠IO初始化内存初始化配置锁频环相关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中的函数——驱动程序初始化的好地方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的存储器区域分配FLASHSDRAM大小Blob0-256KB0xA0020000256KB参数256-512KB0xA01ff000256KB内核512KB-2MB0xA02000001.5MB根文件系统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}第二节

构建嵌入式Linux根文件系统Linux根文件系统介绍根文件系统的目录结构使用Busybox生成工具集根文件系统启动流程根文件系统烧写流程Linux根文件系统介绍内核启动的最后步骤--挂载根文件系统,包含:Init进程Shell文件系统、网络系统等等的工具集系统配置文件链接库Linux根文件系统目录结构bin 必要的用户命令(二进制文件)*boot

引导加载程序使用的静态文件dev

设备文件及其他特殊文件etc系统配置文件*home用户主目录lib必要的链接库,例如:C链接库、内核模块mnt

临时挂载的文件系统的挂载点“*”目录在嵌入式Linux上为可选的。Linux根文件系统目录结构*opt附加软件的安装目录proc提供内核和进程信息的proc文件系统*rootroot用户主目录sbin

必要的系统管理员命令tmp

临时文件目录usr

大多数用户使用的应用程序和文件目录var

监控程序和工具程序存放的可变数据Linux根文件系统目录结构/dev目录设备文件及其他特殊文件当配置内核支持设备文件系统devfs时,此目录中的设备节点由内核和驱动程序自动创建Linux根文件系统目录结构/lib目录存放系统必要的动态链接库,支持系统的正常启动:ld 动态链接器 必要libc

主C链接器进程 必要libm

数学进程 数学函数需要用到libcrypt

密码学进程 多数涉及认证的应用程序需要使用完整说明参见glibc使用手册Linux根文件系统目录结构/etc目录--系统配置文件fstab

挂载文件系统的配置文件passwd Password文件inetd.conf

Inetd守护进程的配置文件group Group文件init.d/rcS

缺省的sysinit

脚本使用Busybox生成工具集很小的应用程序提供完整的工具集的功能Init进程Shell文件系统、网络系统等等的工具集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

网络命令集:hostnameifconfig

inetd

netstatpingroute ProcessUtilities

进程命令:freeps

sysctltop Shells shell工具:ash等

SystemLoggingUtilities

日志工具:syslogd

klogd

LinuxSystemUtilities

系统工具:dmesg

fdisk

getoptmoremountumountBusybox的配置和交叉编译(5)编译Busybox:

#makedep

#make

#makeinstallBusybox的配置和交叉编译(6)编译生成的目录结构:/bin/linuxrc/sbin/usr /usr/bin /usr/sbin构建根文件系统在$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构建根文件系统在$root/etc目录下,建立配置文件:fstab

挂载文件系统的配置文件[/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构建根文件系统在$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中限定的协议构建根文件系统在$root/etc目录下,建立配置文件:profile:ash的配置脚本[/etc]catprofile#/etc/profile:executedbybash(1)forloginsh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论