《嵌入式Linux的U-boot系统启动过程.pdf》由会员分享,可在线阅读,更多相关《嵌入式Linux的U-boot系统启动过程.pdf(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式 Linux 的 U-boot 系统启动过程本章基于 Intel公司的 pxa270芯片分析 U-Boot 的工作机制,介绍了嵌入式Linux 交叉开发工具ELDK(Embedded Linux Development Kit),说明配置安装U-Boot 到特定主板、交叉编译调试Linux 的方法,分析了U-Boot 的构架。目录 隐藏 1 BootLoad 启动方式o1.1 网络启动方式o1.2 2 磁盘启动方式o1.3 3 Flash 启动方式2 U-Boot 介绍o2.1 U-Boot功能介绍o2.2 U-Boot安装o2.3 U-Boot命令介绍o2.4 U-Boot环境变量o2
2、.5 U-Boot脚本o2.6 U-Boot单独应用程序o2.7 位图支持3 2 ELDK 工具介绍o3.1 下载与编译o3.2 建立开发系统o3.3 编译安装 Linux 内核o3.4 启动嵌入式 Linuxo3.5 Flash文件系统o3.6 根文件系统的设计与编译o3.7 覆盖层文件系统o3.8 调试3.8.1(1)U-Boot 的调试3.8.2(2)Linux 内核调试3.8.3(3)远程调试应用程序BootLoad 启动方式Bootloader的主要功能是引导操作系统启动,开放源代码的BootLoader 种类很多,常用的 BootLoader 的功能说明如表1所 示。表 1 常用
3、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的引导程序是是是网络启动方式这种方
4、式开发板不需要配置较大的存储介质,跟无盘工作站有点类似。但是使用这种启动方式之前,需要把Bootloader安装到板上的 EPROM 或 者 Flash 中。Bootloader通过以太网接口远程下载Linux 内核映像或者文件系统。第 4章介绍的交叉开发环境就是以网络启动方式建立的。这种方式对于嵌入式系统开发来说非常重要。使用这种方式也有前提条件,就是目标板有串口、以太网接口或者其他连接方式。串口一般可以作为控制台,同时可以用来下载内核影像和 RAMDISK文件系统。串口通信传输速率过低,不适合用来挂接NFS文件系统。所以以太网接口成为通用的互连设备,一般的开发板都可以配置10M以太网接口。
5、对于 PDA等手持设备来说,以太网的RJ-45 接口显得大了些,而USB接口,特别是USB的迷你接口,尺寸非常小。对于开发的嵌入式系统,可以把 USB接口虚拟成以太网接口来通讯。这种方式在开发主机和开发板两端都需要驱动程序。另外,还要在服务器上配置启动相关网络服务。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP 的方式动态配置 IP 地址。DHCP/BOOTP 服务为 Bootloader分配 IP 地址,配置网络参数,然后才能够支持网络传输功能。如果Bootloader可以 直接设置网络参数,就可以不使用DHCP。TFTP服务为 Bootloader客户端提供文件
6、下载功能,把内核映像和其他文件放在/tftpboot目录下。这样 Bootloader可以通过简单的 TFTP协议远程下载内核映像到内存。如图6.1 所示。图 6.1 网络启动示意图大部分引导程序都能够支持网络启动方式。例如:BIOS的 PXE(Preboot Execution Environment)功能就是网络启动方式;U-Boot也支持网络启动功能。2磁盘启动方式传统的 Linux 系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并且使用磁盘作为存储介质。如果进入 BIOS设置菜单,可以探测处理器、内存、硬盘等设备,可以设置BIOS从软盘、光盘或者某块硬盘启动。也就是说
7、,BIOS并不直接|口口|口口|口口|口口|口口引导操作系统。那么在硬盘的主引导区,还需要一个 Bootloader。这个 Bootloader可以从磁盘文件系统中把操作系统引导起来。Linux 传统上是通过LILO(LInux LOader)引导的,后来又出现了 GNU 的软件 GRUB(GRand Unified Bootloader)。这 2 种 Bootloader广泛应用在X86的 Linux 系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。LILO 软件工程是由Werner Almesberger创建,专门为引导Linux 开发的。现在LILO 的维护
8、者是 John Coffman,最新版本下载站点:http:/lilo.go.dyndns.org。LILO 有详细的文档,例如LILO 套件中附带使用手册和参考手册。此外,还可以在LDP的LILO mini-HOWTO中找到 LILO 的使用指南。GRUB 是 GNU 计划的主要 bootloader。GRUB 最初是由 Erich Boleyn为 GNU Mach 操作系统撰写的引导程序。后来有Gordon Matzigkeit和 Okuji Yoshinori接替 Erich 的工作,继续维护和开发GRUB。GRUB 的网站 http:/www.gnu.org/software/grub
9、/上 有对套件使用的说明文件,叫作GRUB manual。GRUB 能够使用 TFTP和 BOOTP 或者 DHCP 通过网络启动,这种功能对于系统开发过程很有用。除了传统的Linux 系统上的引导程序以外,还有其他一些引导程序,也可以支持磁盘引导启动。例如:LoadLin 可以从 DOS 下启动 Linux;还有 ROLO、LinuxBIOS,U-Boot 也支持这种功能。3Flash 启动方式大多数嵌入式系统上都使用Flash 存储介质。Flash 有很多类型,包括 NOR Flash、NAND Flash 和其他半导体盘。其中,NOR Flash(也就是线性Flash)使用最为普遍。NO
10、R Flash 可以支持随机访问,所以代码是可以直接在Flash 上执行的。Bootloader一般是存储在Flash 芯片上的。另外,Linux内核映像和 RAMDISK 也可以存储在Flash 上。通常需要把Flash 分区使用,每个区的大小应该是Flash 擦除块大小的整数倍。图 6.2 是 Bootloader和内核映像以及文件系统的分区表。图 6.2 Flash存储示意图Bootloader一般放在 Flash 的底端或者顶端,这要根据处理器的复位向量设置。要使Bootloader的入口位于处理器上电执行第一条指令的位置。接下来分配参数区,这里可以作为Bootloader的参数保存区
11、域。再下来内核映像区。Bootloader引导 Linux 内核,就是要从这个地方把内核映像解压到RAM 中去,然后跳转到内核映像入口执行。然后是文件系统区。如果使用 Ramdisk 文件系统,则需要 Bootloader把它解压到 RAM 中。如果使用 JFFS2文件系统,将直接挂接为根文件系统。这两种文件系统将在第12 章详细讲解。最后还可以分出一些数据区,这要根据实际需要和Flash 大小来考虑了。这些分区是开发者定义的,Bootloader一般直接读写对应的偏移地址。到了 Linux 内核空间,可以配置成MTD 设备来访问 Flash分区。但是,有的 Bootloader也支持分区的功
12、能,例如:Redboot 可以创建 Flash 分区表,并且内核 MTD驱动可以解析出 redboot的分区表。除了 NOR Flash,还有 NAND Flash、Compact Flash、DiskOnChip 等。这些 Flash 具有芯片价格低,存储容量大的特点。但是这些芯片一般通过专用控制器的I/O 方式来访问,不能随机访问,因此引导方式跟NOR Flash 也不同。在这些芯片上,需要配置专用的引导程序。通常,这种引导程序起始的一段代码就把整个引导程序复制到RAM 中运行,从而实现自举启动,这跟从磁盘上启动有些相似。U-Boot 介绍U-Boot 功能介绍PC机引导加载程序由BIOS
13、和 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)项目,用于引导加载
14、基于StorngARM CPU的单个主板计算机;U-boot(Universal loader)是通用的开源引导程序,常用于基于ARM、PowerPC、MIPS构架的嵌入式Linux 系统的引导,也用于NetBSD和 VxWorks 等多种操作系统的引导。U-Boot 支持的主要功能列出如下:系统引导功能。支持 NFS挂载、RAMDISK 系统引导压缩或非压缩形式的根文件系统。支持 NFS挂载、从 Flash 中引导压缩或非压缩的Linux 内核。具有强大的操作系统接口功能,可灵活设置、传递多个参数给操作系统,支持目标板环境参数的多种存储方式,如 Flash、NVRAM、EEPROM。支持 C
15、RC32 校验,可校验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 初始化目标板硬件,
16、为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。它能够将系统的软硬件紧密衔接在一起。Intel基于 XScale 架构的 pxa27X ARM系列处理器,最高主频可达624MHz,加入了 Wireless MMX 技术,广泛应用于PDA、智能手机、PMP 等产品的开发中,硬件的详细说明请参考产品手册。ARM 嵌入式系统复位后通常都从地址 0 x00000000 开始执行,Boot Loader 就从这里开始。Boot Loader 分为由汇编语言实现的部分(称为 stage1)和用 C语言实现部分(称为 stage2)。stage1 的功能是硬件设备初始化
17、、准备 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 的代码。跳转方法是
18、使用了trampoline程序来包装了main 函数,trampoline.S程序如下:.text.globl _trampoline _trampoline:bl main/*if main ever returns we just call it again*/b _trampoline 从这段代码可以看出,当从main 函数中返回时,则再进入main 函数。以防止程序异常中断。执行完 stage1 后系统内存布局如图1 所示。图 1 执行完 stage1 后系统内存布局图stage2 的功能是初始化硬件、检测系统内存映射(memory map)、将 kernel 映像和根文件系统映像从
19、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 bas
20、e-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 bo
21、otstrap 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 中,存储配置系统
22、的环境变量,并被 CRC32 校验和保护。一些环境变量对 U-Boot 来说有特殊含义,可用这些环境变量配置U-Boot 的行为。表 1说明了环境变量的功能。表 1 U-Boot 环境变量的说明环境变量功能说明bootdelay 定义复位等待执行bootcmd 变量对应命令的时间(以秒为单位)。baudrate 定义串口控制台的波特率。netmask 定义以太网接口的掩码。ethaddr 定义以太网接口的MAC 地址。bootfile 用 TFTP装载的映像的名字。bootargs 定义传递给Linux 内核的启动参数。bootcmd 定义自动启动时执行的几条命令。serverip 定义 tf
23、tp服务器端的 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-Bo
24、ot 命令 setenv 设置,一些设置样例列出如下:=setenv serverip 192.168.1.151=setenv ipaddr 192.168.1.152=setenv rootpath/opt/ruiva/xscale/rootfs =setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):$(rootpath)ip=$(ipaddr)console=ttyS0,115200 mem=64M#通过 bootm 命令传递给内核的启动参数D CJ CJ=setenv kernel_addr 30000000=setenv nfsc
25、md 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 00200000 echo=U-Boot setting
26、s=setenv u-boot/tftpboot/TQM860L/u-boot.bin setenv u-boot_addr 40000000 setenv load_u-boot tftp$loadaddr$u-boot setenv 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-boot echo=Linux Kernel settings=setenv bootfile/tftpboot
27、/TQM860L/uImage setenv kernel_addr 40040000 setenv load_kernel tftp$loadaddr$bootfile;setenv install_kernel era$kernel_addr+$filesize;cp.b$loadaddr$kernel_addr$filesize setenv update_kernel run load_kernel install_kernel echo=Ramdisk settings=setenv ramdisk/tftpboot/TQM860L/uRamdisk setenv ramdisk_a
28、ddr 40100000 setenv load_ramdisk tftp$loadaddr$ramdisk;setenv install_ramdisk era$ramdisk_addr+$filesize;cp.b$loadaddr$ramdisk_addr$filesize setenv update_ramdisk run load_ramdisk install_ramdisk echo=Save new definitions=saveenv 转换成映像文件的方法列出如下:bash$mkimage-T script-C none-n Demo Script File-d seten
29、v-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:0 x00000000 Entry Point:0 x00000000 Contents:Image 0:1139 Bytes=1 kB=0 MB 在目标板上,用户可以像其他映像文件一样使用tftp这样的命令进行装载,然后,使用命令autoscr
30、执行该映像,方法如下:=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
31、/LWMON/denk_startup.bmp TFTP from server 192.168.3.1;our IP address is 192.168.3.74 Filename/tftpboot/LWMON/denk_startup.bmp.Load address:0 x100000 Loading:#done Bytes transferred=308278(4b436 hex)=bmp info 100000 Image size:640 x 480 Bits per pixel:8 Compression:0=bmp display 100000 许多用户期望在系统启动过程(约
32、56 秒)中看见图像,这种图像显示称为splash screen。U-Boot 支持该功能。用户通过添加#define CONFIG_SPLASH_SCREEN到目标板的配置文件,就可打开splash screen支持,这意味着打开了位图支持。目标板开机后,U-Boot 将测试环境变量splashimage 是否定义,它是否含有位图的地址,如果含有位图,目标板启动时将不显示启 动信息,而是显示splash screen。安装 splash screen位图的方法列出如下:=tftp 100000/tftpboot/denx_startup.bmp TFTP from server 192.16
33、8.3.1;our IP address is 192.168.3.74 Filename/tftpboot/denx_startup.bmp.Load address:0 x100000 Loading:#done Bytes transferred=308278(4b436 hex)=cp.b 100000 41F80000$filesize Copy to Flash.done=setenv splashimage 41F80000=saveenv Saving Environment to Flash.Un-Protected 1 sectors Erasing Flash.done
34、Erased 1 sectors Writing to Flash.done Protected 1 sectors=bmp info$splashimage Image size:640 x 480 Bits per pixel:8 Compression:0 为了实现 U-Boot Splash Screen 特征的支持,Linux 内核加入了配置选项CONFIG_FB_PRE_INIT_FB,它允许跳过帧缓冲区(frame buffer)的某一部分,并再使用由U-Boot 固件建立的帧缓冲区内容。这样,系统启动过程中可以显示一个启动图像,该图像就掩盖了系统启动过程中屏幕输出。2 ELDK
35、工具介绍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等类型 Li
36、nux 操作系统,支持的目标构架为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
37、/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#编译软件包的起始、结束编
38、号,在文件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#编译源代码包建立开发系统开发时,主机需要与目标板交互,如:调试程序,控制目标
39、板,下载程序映像到目标板,目标板的调试信息需要反回到主机等。为了与目标板交互,主机必须建立开发环境,如:建立串行终端,配置TFTP服务器、DHCP 服务器和 NFS服务器。(1)配置串行终端开发者在开发时需要访问目标板的串行终端端口,通过在主机上的终端对目标板进行控制台操作。通常,开发者将目标板的串行终端端口绑定在主机的一个串行端口,实现控制台的功能,开发者还需要在主机上使用一个终端仿真程序,如:cu 或 kermit。命令 cu 是软件包 UUCP 的一部分,UUCP 可用作串行终端,还具有简单的文件传输功能,可用于映像文件的下载。依赖于目标板的波特率,需要改写UUCP 的配置文件,典型的配
40、置列出如下:?配置文件/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代表了整个串行线和网络连接通信软件簇,文
41、件/.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连接串行线的方法如下:$
42、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 192.168.0.0 netmask 255.2
43、55.0.0 option routers 192.168.1.1;option subnet-mask 255.255.0.0;option domain-name ;option domain-name-servers ;host trgt hardware ethernet 00:30:BF:01:02:D0;#目标板 MAC 地址fixed-address 192.168.100.6;#目标板固定 IP 地址option root-path/opt/eldk-4.2/ppc_4xx;option host-name canyonlands;#目标板的主机名next-server 192
44、.168.1.1;filename/tftpboot/canyonlands/uImage;用上面的配置,DHCP 服务器将回答来自目标板的请求,给出下面的信息:目标板位于子网192.168.0.0,子网掩码为255.255.0.0。目标板的主机名为Canyonlands,IP 地址为 192.168.100.0。IP 地址为 192.168.1.1的主机给目标板提供启动映像(boot image),当目标板根文件系统通过NFS挂接在主机上,它还提供NFS服务器功能。主机提供文件/tftpboot/canyonlands/uImage作为目标板的启动映像。目标板可以挂接目录/opt/eldk-
45、4.2/ppc_4xx在 NFS服务作为根文件系统。(3)配置 NFS服务器通过 NFS,主机和目标板可以共享文件,NFS服务器对外暴露的目录可以挂接作目标板的根文件系统。主机应安装NFS服务器,并开启 NFS 服务。NFS服务器的配置样例列出如下:$cat/etc/exports /opt/eldk-4.2/ppc_4xx 192.168.0.0/255.255.0.0(rw,no_root_squash,sync)上述语句含义为暴露目录/opt/eldk-4.2/ppc_4xx,在子网 192.168.0.0上的所有主机都可以读写操作该目录。编译安装 Linux 内核ELDK源代码包括了L
46、inux 内核,用户可以编译安装内核,方法如下: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/tftpboo
47、t/uImage 启动嵌入式Linux (1)启动内核当 Linux 内核和扁平设备树块(Flattened Device Tree Blob,FDT blob)下载到目标板的系统内存(如:RAM、ROM、flash等)时,用户可用bootm 命令启动系统。假设内核映像存放在地址 0 xFC000000 处,FDT blob 存放在地址 0 xFC1E0000处,则启动映像文件的命令列出如下:=bootm FC000000 FC1E0000 (2)编译 blob Linux 内核运行时,期望知道它运行的硬件信息,这些硬件信息按开放固件规范以设备树的形式描述,由于象U-Boot 这样的 Boot
48、Loader没有实现开放固件API(Open Firmware API),硬件信息将以扁平设备树的二进制形式传递给内核,这种二进制形式称为FDT blob 或简称 blob。在设备树信息文件(如:canyonlands.dts)由 dtc 编译器编译成二进制文件,ELDK包括了dtc 编译器,编译方法列出如下:dtc-b 0-V 17-p 0 x1000-I dts-O dtb-f arch/powerpc/boot/dts/canyonlands.dts /tftpboot/canyon 编译完后,可使用命令tftp将 blob 传输到目标机的内存中,接着,系统启动bootm 将 blob
49、中的硬件信息传递给内核。U-Boot 还提供命令 fdt修改 blob。(3)传递内核参数用户可以传递附加信息(如:根设备或网络配置)给内核。U-Boot 通过环境变量bootargs实现该功能。该变量的内容作为启动参数(或命令行参数)自动传递给内核,这样,可以让同一个内核映像有更多的配置,例如:仅改变变量bootargs 的内容,就可以让同一个内核映像与 initrd内存盘(ramdisk)映像一起启动,或者与在NFS之上的根文件系统一起启动。例如:内核映像地址在0 x200000,作为根文件系统的initrd ramdisk映像地址在0 x400000,FDT blob 地址在 0 x60
50、0000,则启动命令列出如下:=setenv bootargs root=/dev/ram rw =bootm 200000 400000 600000 假设 NFS服务器地址为192.168.1.1,输出目录/opt/eldk-4.2/ppc_4xx作为目标板的根文件系统,目标板的地址为192.168.100.6,目标板主机名为canyonlands,子网掩码为255.255.255.0。现由在 NFS上的根文件系统启动同样内核,则启动命令列出如下:=setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.1:/opt/eldk-4.2/ppc_