




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式Linux的U-boot系统启动过程本章基于Intel公司的pxa270芯片分析U-Boot的工作机制,介绍了嵌入式Linux交叉开发工具ELDK(Embedded Linux Development Kit),说明配置安装U-Boot到特定主板、交叉编译调试Linux的方法,分析了U-Boot的构架。 目录隐藏 1 BootLoad启动方式 o 1.1 网络启动方式o 1.2 2磁盘启动方式o 1.3 3Flash启动方式 2 U-Boot介绍 o 2.1 U-Boot功能介绍o 2.2 U-Boot安装o 2.3 U-Boot命令介绍o 2.4 U-Boot环境变量o 2.5 U-Boot脚本o 2.6 U-Boot单独应用程序o 2.7 位图支持 3 2 ELDK工具介绍 o 3.1 下载与编译o 3.2 建立开发系统o 3.3 编译安装Linux内核o 3.4 启动嵌入式Linuxo 3.5 Flash文件系统o 3.6 根文件系统的设计与编译o 3.7 覆盖层文件系统o 3.8 调试 3.8.1 (1)U-Boot的调试 3.8.2 (2)Linux内核调试 3.8.3 (3)远程调试应用程序BootLoad启动方式 Bootloader的主要功能是引导操作系统启动,开放源代码的BootLoader种类很多,常用的BootLoader的功能说明如表1所 示。 表1 常用BootLoader的功能说明 Bootloader名 是否终端监视 描 述 x86 ARM PowerPC LILO 否 Linux磁盘引导程序 是 否 否 GRUB 否 GNU的LILO替代程序 是 否 否 Loadlin 否 从DOS引导Linux 是 否 否 ROLO 否 从ROM引导Linux而不需要BIOS 是 否 否 Etherboot 否 通过以太网卡启动Linux系统的固件 是 否 否 LinuxBIOS 否 完全替代BUIS的Linux引导程序 是 否 否 BLOB 否 LART等硬件平台的引导程序 否 是 否 U-boot 是 通用引导程序 是 是 是 RedBoot 是 基于eCos的引导程序 是 是 是 网络启动方式 这种方式开发板不需要配置较大的存储介质,跟无盘工作站有点类似。但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或 者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。第4章介绍的交叉开发环境就是以网络启动方式建立的。这种 方式对于嵌入式系统开发来说非常重要。 使用这种方式也有前提条件,就是目标板有串口、以太网接口或者其他连接方式。串口一般可以作为控制台,同时可以用来下载内核影像和 RAMDISK文件系统。串口通信传输速率过低,不适合用来挂接NFS文件系统。所以以太网接口成为通用的互连设备,一般的开发板都可以配置10M以太网 接口。 对于PDA等手持设备来说,以太网的RJ-45接口显得大了些,而USB接口,特别是USB的迷你接口,尺寸非常小。对于开发的嵌入式系 统,可以把USB接口虚拟成以太网接口来通讯。这种方式在开发主机和开发板两端都需要驱动程序。 另外,还要在服务器上配置启动相关网络服务。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置 IP地址。 DHCP/BOOTP服务为Bootloader分配IP地址,配置网络参数,然后才能够支持网络传输功能。如果Bootloader可以 直接设置网络参数,就可以不使用DHCP。 TFTP服务为Bootloader客户端提供文件下载功能,把内核映像和其他文件放在/tftpboot目录下。这样 Bootloader可以通过简单的TFTP协议远程下载内核映像到内存。如图6.1所示。 图6.1 网络启动示意图 大部分引导程序都能够支持网络启动方式。例如:BIOS的PXE(Preboot Execution Environment)功能就是网络启动方式;U-Boot也支持网络启动功能。 2磁盘启动方式 传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并且使用磁盘作为存储介质。如果进入BIOS设置菜单,可以探 测处理器、内存、硬盘等设备,可以设置BIOS从软盘、光盘或者某块硬盘启动。也就是说,BIOS并不直接引导操作系统。那么在硬盘的主引导区,还需要一 个Bootloader。这个Bootloader可以从磁盘文件系统中把操作系统引导起来。 Linux传统上是通过LILO(LInux LOader)引导的,后来又出现了GNU的软件GRUB(GRand Unified Bootloader)。这2种Bootloader广泛应用在X86的Linux系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系 统引导功能。 LILO软件工程是由Werner Almesberger创建,专门为引导Linux开发的。现在LILO的维护者是John Coffman,最新版本下载站点:。LILO有详细的 文档,例如LILO套件中附带使用手册和参考手册。此外,还可以在LDP的LILO mini-HOWTO中找到LILO的使用指南。 GRUB是GNU计划的主要bootloader。GRUB最初是由Erich Boleyn为GNU Mach操作系统撰写的引导程序。后来有Gordon Matzigkeit和Okuji Yoshinori接替Erich的工作,继续维护和开发GRUB。GRUB的网站/software/grub/上 有对套件使用的说明文件,叫作GRUB manual。GRUB能够使用TFTP和BOOTP或者DHCP通过网络启动,这种功能对于系统开发过程很有用。 除了传统的Linux系统上的引导程序以外,还有其他一些引导程序,也可以支持磁盘引导启动。例如:LoadLin可以从DOS下启动 Linux;还有ROLO、LinuxBIOS,U-Boot也支持这种功能。 3Flash启动方式 大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其他半导体盘。其中,NOR Flash(也就是线性Flash)使用最为普遍。 NOR Flash可以支持随机访问,所以代码是可以直接在Flash上执行的。Bootloader一般是存储在Flash芯片上的。另外,Linux内核映像 和RAMDISK也可以存储在Flash上。通常需要把Flash分区使用,每个区的大小应该是Flash擦除块大小的整数倍。图6.2是 Bootloader和内核映像以及文件系统的分区表。 图6.2 Flash存储示意图 Bootloader一般放在Flash的底端或者顶端,这要根据处理器的复位向量设置。要使Bootloader的入口位于处理器上电执 行第一条指令的位置。 接下来分配参数区,这里可以作为Bootloader的参数保存区域。 再下来内核映像区。Bootloader引导Linux内核,就是要从这个地方把内核映像解压到RAM中去,然后跳转到内核映像入口执行。 然后是文件系统区。如果使用Ramdisk文件系统,则需要Bootloader把它解压到RAM中。如果使用JFFS2文件系统,将直接 挂接为根文件系统。这两种文件系统将在第12章详细讲解。 最后还可以分出一些数据区,这要根据实际需要和Flash大小来考虑了。 这些分区是开发者定义的,Bootloader一般直接读写对应的偏移地址。到了Linux内核空间,可以配置成MTD设备来访问 Flash分区。但是,有的Bootloader也支持分区的功能,例如:Redboot可以创建Flash分区表,并且内核MTD驱动可以解析出 redboot的分区表。 除了NOR Flash,还有NAND Flash、Compact Flash、DiskOnChip等。这些Flash具有芯片价格低,存储容量大的特点。但是这些芯片一般通过专用控制器的I/O方式来访问,不能随机访 问,因此引导方式跟NOR Flash也不同。在这些芯片上,需要配置专用的引导程序。通常,这种引导程序起始的一段代码就把整个引导程序复制到RAM中运行,从而实现自举启动,这 跟从磁盘上启动有些相似。 U-Boot介绍 U-Boot功能介绍 PC机引导加载程序由BIOS和OS BootLoader(通常为GRUB)组成,嵌入式系统一般没有BIOS这样的固件程序,系统的引导加载完全由BootLoader完成。不同的系 统,boot Loader是不同的。Boot Loader有许多开放源代码,但在标准Linux中没有,需要用户从网上下载。 BootLoader包括LILO、GRUB、Loadlin、BOLB、U-boot、RedBoot等多种,其中,GRUB是LILO 的继任者,用于PC机,Loadlin用于从DOS装载Linux;BLOB来自LART(Luser Attitude Readjustment Tool)项目,用于引导加载基于StorngARM CPU的单个主板计算机;U-boot(Universal loader)是通用的开源引导程序,常用于基于ARM、PowerPC、MIPS构架的嵌入式Linux系统的引导,也用于NetBSD和 VxWorks等多种操作系统的引导。 U-Boot支持的主要功能列出如下: 系统引导功能。 支持NFS挂载、RAMDISK 系统引导 压缩或非压缩形式的根文件系统。 支持NFS挂载、从Flash中引导压缩或非压缩的Linux内核。 具有强大的操作系统接口功能,可灵活设置、传递多个参数给操作系统,支持目标板环境参数的多种存储方式,如Flash、NVRAM、 EEPROM。 支持CRC32校验,可校验Flash中内核、RAMDISK镜像文件是否完好。 支持串口、SDRAM、Flash、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等设备驱 动。 支持上电自检功能,如:SDRAM、Flash大小自动检测;SDRAM 故障检测;CPU型号检测等。 U-Boot有启动加载和下载两种操作模式,启动加载模式将操作系统加载到 RAM 中运行。下载模式是以某种通信方式从主机(Host)下载文件保存到目标机的 RAM 中,然后被 U-Boot 写到目标机上的FLASH中。这种模式下还提供一个简单的命令行接口。 U-Boot初始化目标板硬件,为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。它能够将系统的 软硬件紧密衔接在一起。 Intel基于XScale架构的pxa27X ARM系列处理器,最高主频可达624MHz,加入了Wireless MMX技术,广泛应用于PDA、智能手机、PMP等产品的开发中,硬件的详细说明请参考产品手册。 ARM嵌入式系统复位后通常都从地址 0x00000000 开始执行,Boot Loader 就从这里开始。 Boot Loader分为由汇编语言实现的部分(称为stage1)和用C语言实现部分(称为stage2)。stage1的功能是硬件设备初始化、准备 RAM、将C语言实现部分拷贝RAM、设置好堆栈,并跳转到C语言实现部分入口点。stage1中的初始化过程列出如下: (1)设置GPIO控制器,以便能控制外围设备。 (2)屏蔽所有的中断。Boot Loader 的执行过程中不必响应任何中断。 (3)设置 CPU时钟频率。 (4)RAM 初始化。设置系统的内存控制器等。 (5)关闭 CPU 内部指令数据 cache。 (6)准备stage2的ram空间,拷贝stage2到ram,设置堆栈。堆栈设置在stage2_end-4的地方,向下增长。 (7)跳转到stage2的入口点即main函数开始执行stage2的代码。 跳转方法是使用了trampoline程序来包装了main函数,trampoline.S程序如下: .text.globl _trampoline_trampoline:blmain/* if main ever returns we just call it again */b_trampoline从这段代码可以看出,当从main函数中返回时,则再进入main函数。以防止程序异常中断。 执行完stage1后系统内存布局如图1所示。 图1 执行完stage1后系统内存布局图stage2的功能是初始化硬件、检测系统内存映射(memory map)、将 kernel 映像和根文件系统映像从 flash 上读到 RAM 中、设置启动参数、进入内核。进入stage2后,程序都是c语言实现的,stage2的第一个函数为main函数。 U-Boot安装 下载和编译U-Boot源代码,方法如下: #下载 $ cd /opt/eldk/usr/src $ wget ftp:/ftp.denx.de/pub/u-boot/u-boot-1.3.2.tar.bz2 $ rm -f u-boot $ bunzip2 help - alias for help askenv - get environment variables from stdin autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure boot - boot default, i.e., run bootcmd bootd - boot default, i.e., run bootcmd bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BootP/TFTP protocol bootstrap - program the I2C bootstrap EEPROM bootvx - Boot vxWorks from an ELF image cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation date - get/set/reset date & time dhcp - invoke DHCP client to obtain IP/boot params U-Boot环境变量 U-Boot环境是保存在永久存储中的一块内存,当U-Boot启动时拷贝到RAM中,存储配置系统的环境变量,并被CRC32校验和保护。一些环 境变量对U-Boot来说有特殊含义,可用这些环境变量配置U-Boot的行为。表1说明了环境变量的功能。 表1 U-Boot环境变量的说明环境变量 功能说明 bootdelay 定义复位等待执行bootcmd变量对应命令的时间(以秒为单位)。 baudrate 定义串口控制台的波特率。 netmask 定义以太网接口的掩码。 ethaddr 定义以太网接口的MAC地址。 bootfile 用TFTP装载的映像的名字。 bootargs 定义传递给Linux内核的启动参数。 bootcmd 定义自动启动时执行的几条命令。 serverip 定义tftp服务器端的IP地址。 ipaddr 定义本地的IP地址。 autoload 如果设置为no,命令rarpb、bootp或dhcp将仅从BOOTP/DHCP服务器执行配置查找,而不使用TFTP装载任何映像。 autostart 如果设置为yes,使用命令rarpb、bootp、dhcp、tftp、disk或docb装载的映像将被命令bootm自动启动。 loadaddr 命令tftp或loads等的缺省装载地址。 U-Boot的环境变量都有缺省值,用户可以修改用于改变U-Boot的行为,环境变量存储于EEPROMak Flash这样的永久存储区。环境变量用U-Boot命令setenv设置,一些设置样例列出如下: =setenv serverip 51=setenv ipaddr 52=setenv rootpath /opt/ruiva/xscale/rootfs =setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath) ip=$(ipaddr) console= ttyS0,115200 mem=64M #通过bootm命令传递给内核的启动参数=setenv kernel_addr 30000000=setenv nfscmd tftp $(kernel_addr) uImage; bootm$(kernel_addr) #将uImage下载到指定的地址=run nfscmd #运行nfscmd脚本U-Boot脚本 U-Boot允许存储命令序列在纯文本文件中,用命令mkimage将该文件转换成脚本映像,该映像可用U-Boot命令autoscr执行。 例如:用户需要在许多目标板上运行下面命令序列,可将该命令序列存储在一个文本文件setenv-commands中,其内容如下: bash$ cat setenv-commands setenv loadaddr 00200000echo = U-Boot settings =setenv u-boot /tftpboot/TQM860L/u-boot.binsetenv u-boot_addr 40000000setenv load_u-boot tftp $loadaddr $u-bootsetenv install_u-boot protect off $u-boot_addr +$filesize;era $u-boot_addr +$filesize;cp.setenv update_u-boot run load_u-boot install_u-bootecho = Linux Kernel settings =setenv bootfile /tftpboot/TQM860L/uImagesetenv kernel_addr 40040000setenv load_kernel tftp $loadaddr $bootfile;setenv install_kernel era $kernel_addr +$filesize;cp.b $loadaddr $kernel_addr $filesizesetenv update_kernel run load_kernel install_kernelecho = Ramdisk settings =setenv ramdisk /tftpboot/TQM860L/uRamdisksetenv ramdisk_addr 40100000setenv load_ramdisk tftp $loadaddr $ramdisk;setenv install_ramdisk era $ramdisk_addr +$filesize;cp.b $loadaddr $ramdisk_addr $filesizesetenv update_ramdisk run load_ramdisk install_ramdiskecho = Save new definitions =saveenv转换成映像文件的方法列出如下: bash$ mkimage -T script -C none -n Demo Script File -d setenv-commands setenv.img Image Name: Demo Script File Created: Mon Jun 6 13:33:14 2005 Image Type: PowerPC Linux Script (uncompressed) Data Size: 1147 Bytes = 1.12 kB = 0.00 MB Load Address: 0x00000000 Entry Point: 0x00000000 Contents: Image 0: 1139 Bytes = 1 kB = 0 MB 在目标板上,用户可以像其他映像文件一样使用tftp这样的命令进行装载,然后,使用命令autoscr执行该映像,方法如下: = tftp 100000 /tftpboot/TQM860L/setenv.img U-Boot单独应用程序 U-Boot允许动态装载或运行 单个应用程序,该应用程序可以使用U-Boot资源,如:控制台I/O函数、内存分配或中断服务。编译U-Boot时,单个应用程序与U-Boot一起编 译。 位图支持 通过添加CFG_CMD_BMP选项到CONFIG_COMMAND命令选项,可以在U-Boot中打开位图支持,这将添加命令bmp到U- Boot配置的命令列表中。命令bmp可以在屏幕上显示图像。图像传送与显示的命令列出如下: = tftp 100000 /tftpboot/LWMON/denk_startup.bmpTFTP from server ; our IP address is 4Filename /tftpboot/LWMON/denk_startup.bmp.Load address: 0x100000Loading: #doneBytes transferred = 308278 (4b436 hex)= bmp info 100000Image size : 640 x 480Bits per pixel: 8Compression : 0= bmp display 100000许多用户期望在系统启动过程(约56秒)中看见图像,这种图像显示称为splash screen。U-Boot支持该功能。用户通过添加#define CONFIG_SPLASH_SCREEN到目标板的配置文件,就可打开splash screen支持,这意味着打开了位图支持。 目标板开机后,U-Boot将测试环境变量splashimage是否定义,它是否含有位图的地址,如果含有位图,目标板启动时将不显示启 动信息,而是显示splash screen。安装splash screen位图的方法列出如下: = tftp 100000 /tftpboot/denx_startup.bmpTFTP from server ; our IP address is 4Filename /tftpboot/denx_startup.bmp.Load address: 0x100000Loading: #doneBytes transferred = 308278 (4b436 hex)= cp.b 100000 41F80000 $filesizeCopy to Flash. done= setenv splashimage 41F80000= saveenvSaving Environment to Flash.Un-Protected 1 sectorsErasing Flash. doneErased 1 sectorsWriting to Flash. doneProtected 1 sectors= bmp info $splashimageImage size : 640 x 480Bits per pixel: 8Compression : 0为了实现U-Boot Splash Screen特征的支持,Linux内核加入了配置选项CONFIG_FB_PRE_INIT_FB,它允许跳过帧缓冲区(frame buffer)的某一部分,并再使用由U-Boot固件建立的帧缓冲区内容。这样,系统启动过程中可以显示一个启动图像,该图像就掩盖了系统启动过程中屏 幕输出。 2 ELDK工具介绍 ELDK(Embedded Linux Deveelopment Kit)包括GNU交叉开发工具(如:编译器、binutils、gdb等)、大量的预编译目标工具、目标系统需要的库、常用工具(如:ls、rm)、常 用服务器(如:DHCP、ftp)、U-Boot等。通过ELDK,目标板可以运行在控制台,并通过主机连接调试、装载映像文件等。 ELDK使用的主机操作系统通常为Fedora Core、Red Hat Linux、SuSE Linux、Debian、Ubuntu、Suse Linux、Mandrake、Slackware、Gentoo Linux和FreeBSD等类型Linux操作系统,支持的目标构架为PPC、ARM、MIPS等。 下载与编译 EKDK提供了源代码包和不同构架平台的二进制代码,可以方便地交叉编译所有源代码或单个软件包,提供了下载、在线调试、在线运行等多种工作方式。 用户可以下载源代码光盘或用版本管理工具git进行下载,用git下载的方法列出如下: $ cd /opt/eldk $ git clone git:/www.denx.de/git/eldk/build.git build $ git clone git:/www.denx.de/git/eldk/tarballs.git tarballs $ git clone git:/www.denx.de/git/eldk/SRPMS.git SRPMS 编译整个ELDK工具与软件包的方法列出如下: bash$ TARGET_CPU_FAMILY_LIST=8xx 85xx #CPU系列号 /opt/eldk/build.sh -a ppc #CPU构架 -n 2007-01-19 #编译结果存放目录名 -p /opt/eldk/build/ppc-2007-01-19 #编译前缀,编译目录存放路径 -r /opt/eldk/build/ppc-2007-01-19/results #输出存入目录 -w /opt/eldk/build/ppc-2007-01-19/work #工作目录 trg 47 47 #编译软件包的起始、结束编号,在文件tpckgs.lst与cpckgs.lst中在ELDK工具编译成功或下载有ELDK工具可执行代码后,可单独编译不同平台的源文件或软件包,方法如下: bash$ export CROSS_COMPILE=ppc_8xx- #编译器前缀,组成不同构架编译器bash$ $CROSS_COMPILEgcc -o hello_world hello_world.c #编译源文件bash$ $CROSS_COMPILErpm -iv .src.rpm #解压缩并安装源代码 bash$ $CROSS_COMPILErpmbuild -ba .spec #编译源代码包建立开发系统 开发时,主机需要与目标板交互,如:调试程序,控制目标板,下载程序映像到目标板,目标板的调试信息需要反回到主机等。为了与目标板交互,主机必须 建立开发环境,如:建立串行终端,配置TFTP服务器、DHCP服务器和NFS服务器。 (1)配置串行终端 开发者在开发时需要访问目标板的串行终端端口,通过在主机上的终端对目标板进行控制台操作。通常,开发者将目标板的串行终端端口绑定在主机 的一个串行端口,实现控制台的功能,开发者还需要在主机上使用一个终端仿真程序,如:cu或kermit。 命令cu是软件包UUCP的一部分,UUCP可用作串行终端,还具有简单的文件传输功能,可用于映像文件的下载。 依赖于目标板的波特率,需要改写UUCP的配置文件,典型的配置列出如下: 配置文件/etc/uucp/sys的内容列出如下: # # /dev/ttyS0 at 115200 bps: # system S0115200 port serial0_115200 time any 配置文件/etc/uucp/port的内容列出如下: # # /dev/ttyS0 at 115200 bps: # port serial0_115200 type direct device /dev/ttyS0 speed 115200 hardflow false 接着,用户可用下面命令连接到串行线: $ cu S0115200 $ . #断开连接 命令kermit代表了整个串行线和网络连接通信软件簇,文件/.kermrc执行kermit的初始化,通过合适的初始化命令可用来定 制kermit的行为,U-Boot推荐使用下面的设置: $cat /.kermrc: set line /dev/ttyS0 #串行端口 set speed 115200 #波特率 set carrier-watch off set handshake none set flow-control none robust set file type bin set file name lit set rec pack 1000 set send pack 1000 set window 5 命令kermit连接串行线的方法如下: $ kermit c (2)配置TFTP服务器 使用 U-Boot装载Linux内核或应用程序的最快捷方式是通过Ethernet传递,U-Boot实现了TFTP协议,通过U-Boot的 tftpboot命令下载文件到目标板中,主机应确信安装了TFTP后台程序/usr/sbin/in.tftpd。 (3)配置BOOTTP/DHCP服务器 BOOTP/DHCP服务器用于自动传递配置信息到目标机,目标机仅需要知道它自己的Ethernet硬件MAC地址,主机应安装DHCP 包,配置DHCP服务器,一个配置样例列出如下: subnet netmask option routers ; option subnet-mask ; option domain-name ; option domain-name-servers ; host trgt hardware ethernet 00:30:BF:01:02:D0; #目标板MAC地址 fixed-address ; #目标板固定IP地址 option root-path /opt/eldk-4.2/ppc_4xx; option host-name canyonlands; #目标板的主机名 next-server ; filename /tftpboot/canyonlands/uImage ; 用上面的配置,DHCP服务器将回答来自目标板的请求,给出下面的信息: 目标板位于子网,子网掩码为。 目标板的主机名为Canyonlands,IP地址为。 IP地址为的主机给目标板提供启动映像(boot image),当目标板根文件系统通过NFS挂接在主机上,它还提供NFS服务器功能。 主机提供文件/tftpboot/canyonlands/uImage作为目标板的启动映像。 目标板可以挂接目录/opt/eldk-4.2/ppc_4xx在NFS服务作为根文件系统。 (3)配置NFS服务器 通过NFS,主机和目标板可以共享文件,NFS服务器对外暴露的目录可以挂接作目标板的根文件系统。主机应安装NFS服务器,并开启NFS 服务。 NFS服务器的配置样例列出如下: $cat /etc/exports /opt/eldk-4.2/ppc_4xx /(rw,no_root_squash,sync) 上述语句含义为暴露目录/opt/eldk-4.2/ppc_4xx,在子网上的所有主机都可以读写操作该目录。 编译安装Linux内核 ELDK源代码包括了Linux内核,用户可以编译安装内核,方法如下: bash$ cd /opt/eldk/usr/src/linux-2.6-denx bash$ make mrproper bash$ make ARCH=powerpc CROSS_COMPILE=ppc_4xx- canyonlands_defconfig #用户设备目标板的配置 bash$ make ARCH=powerpc CROSS_COMPILE=ppc_4xx- INSTALL_MOD_PATH=/opt/eldk-4.2/ppc_4xx modules_install bash$ cp arch/powerpc/boot/uImage /tftpboot/uImage 启动嵌入式Linux (1)启动内核 当Linux内核和扁平设备树块(Flattened Device Tree Blob,FDT blob)下载到目标板的系统内存(如:RAM、ROM、flash等)时,用户可用bootm命令启动系统。假设内核映像存放在地址 0xFC000000处,FDT blob存放在地址0xFC1E0000处,则启动映像文件的命令列出如下: =bootm FC000000 FC1E0000 (2)编译blob Linux内核运行时,期望知道它运行的硬件信息,这些硬件信息按开放固件规范以设备树的形式描述,由于象U-Boot这样的 BootLoader没有实现开放固件API(Open Firmware API),硬件信息将以扁平设备树的二进制形式传递给内核,这种二进制形式称为FDT blob或简称blob。在设备树信息文件(如:canyonlands.dts)由dtc编译器编译成二进制文件,ELDK包括了dtc编译器,编译方 法列出如下: dtc -b 0 -V 17 -p 0x1000 -I dts -O dtb -f arch/powerpc/boot/dts/canyonlands.dts /tftpboot/canyon 编译完后,可使用命令tftp将blob传输到目标机的内存中,接着,系统启动bootm将blob中的硬件信息传递给内核。 U-Boot还提供命令fdt修改blob。 (3)传递内核参数 用户可以传递附加信息(如:根设备或网络配置)给内核。U-Boot通过环境变量bootargs实现该功能。该变量的内容作为启动参数 (或命令行参数)自动传递给内核,这样,可以让同一个内核映像有更多的配置,例如:仅改变变量bootargs的内容,就可以让同一个内核映像与 initrd内存盘( ramdisk)映像一起启动,或者与在NFS之上的根文件系统一起启动。 例如:内核映像地址在0x200000,作为根文件系统的initrd ramdisk映像地址在0x400000,FDT blob地址在0x600000,则启动命令列出如下: = setenv bootargs root=/dev/ram rw = bootm 200000 400000 600000 假设NFS服务器地址为,输出目录/opt/eldk-4.2/ppc_4xx作为目标板的根文件系统,目标板的地 址为,目标板主机名为canyonlands,子网掩码为。现由在NFS上的根文件系统启动同样内 核,则启动命令列出如下: = setenv bootargs root=/dev/nfs rw nfsroot=:/opt/eldk-4.2/ppc_4xx ip=: = bootm 200000 - 600000 内核启动后,可用下面命令查看启动的命令行: $ cat /proc/cmdline 用户还可用U-Boot环境变量存放所有需要的配置参数,方法如下: = setenv ipaddr = setenv serverip = setenv netmask = setenv hostname canyonlands = setenv rootpath /opt/eldk-4.2/ppc_4xx = saveenv 用户可用这些变量构建传递到内核的启动参数,方法如下: = setenv nfsargs root=/dev/nfs rw nfsroot=$serverip:$rootpath 下面可以定义bootargs环境变量,并一步步构建启动参数: = setenv ramargs setenv bootargs root=/dev/ram rw = setenv nfsargs setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath = setenv addip setenv bootargs $bootargs ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:= setenv ram_root run ramargs addip;bootm $kernel_addr $ramdisk_addr $fdt_addr = setenv nfs_root run nfsargs addip;bootm $kernel_addr - $fdt_addr 上面定义了ram_root和nfs_root两个变量,分别用于从ramdisk映像的根文件系统和NFS上的根文件系统启动。变量通过 run命令执行。 (4)用Ramdisk映像单独操作 当应用程序开发完成时,用户希望独立运行嵌入式系统,而不依赖外部系统,如:NFS文件系统,目标板不再通过NFS挂接根文件系统,而是使 用压缩的ramdisk映像,该ramdisk映像存储在flash中,在系统启动时装载到RAM中。 装载ramdisk映像到RAM,并将它写入到flash的方法如下: = setenv ramdisk_addr FC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年蚌埠竞先数据服务有限公司人才公开招聘6名考试模拟试题及答案解析
- 2025上海同济大学后勤管理与保障处节能保障管理岗招聘1人备考考试题库附答案解析
- 小学数学分数教学单元测试题
- 分数意义及性质单元测试题库
- 员工自我评价与工作总结范例
- 中小学课外阅读指导手册
- 建筑工程二次结构施工技术与质量控制
- 幼儿园学期教学及活动计划参考
- 2024年护士节护理知识竞赛试题及答案
- 海姆立克急救法课后测试题有答案
- 朝阳河流域生态修复综合治理工程环评报告
- 2024新版2025秋教科版科学二年级上册全册教案教学设计
- (2025秋新版)人教版八年级历史上册全册教案
- 企业向个人还款合同范本
- 钢模板安全知识培训课件
- GB/T 45707-2025皮革铬鞣鞋面用坯革规范
- 高空作业外墙漆施工方案
- 医务人员职业暴露预防及处理课件(完整版)
- C语言程序设计 课件 第1章-C语言概述
- 医学资料品管圈十大步骤的运用
- 餐饮空间设计课件ppt
评论
0/150
提交评论