读书笔记《Building Embeded Linux System》第九章建立Bootloader

不同类型的Bootlader

  基于x86的PC机器,通常使用LILO或者GRUB。这些系统含有固件(常说的BIOS),是对于各主要系统元件的程序,例如初始化RAM控制器,取保CPU在某个特定的状态,提供很多信息给OS,例如传统的BIOS calls,ACPI table等等,这些linux的bootloader只需要从存储介质中加载kernel image(也可能包括initrd/initramfs的image),开始执行既可。在嵌入式操作系统,通常没有这些固件,需要由bootloader来完成。

  LILO很早就出现,记忆中读书时候Linux使用的就是lilo,现在仍有些x86的系统在使用,可以在http://lilo.go.dyndns.org 中获取最新版本和文档,它只能在带有PC BIOS的x86系统上使用。

  GRUB由GUN维护,可以在http://www.gun.org/software/grub 中获取资源。对于x86板块上的系统,GRUB是朋友,而不是U-boot。这也是为什么moblin在netbook上采用GRUB的原因,GRUB在是目前x86上最流行的bootloader。

  loadlin允许在非NT系列的老式的windows系统中启用linux,现在基本上不使用了。Coreboot(原来的LinuxBIOS),支持x866和PowerPC,从ROM中启动Linux,Linux具备系统初始化,interrupt-routing分配,设备初始化,所以也成为LinuxBIOS。他的特点就是快速启动。RedBoot是基于eCos(Embedded Configurable Operating System),在很多小型系统(小到无法跑整个Linux内核),当它可以跑其他的OS,例如Linux,后来Redhat使用了他。但是O’Reilly建议我们使用U-boot。

  U-Boot:是目前用的最为广泛的linux bootloader,可用于x86、PowerPC、ARM、MIPS等几乎所有的常见的Linux嵌入系统,O’Reilly在这一章将详细描述U-Boot的建立。

建立从Network启动的Server

  对于Linux嵌入式OS的开发,使用network boot是很方便的,因为不需要为一点改动就重新写flash。可以通过BOOTP/DHCP,TFTP和NFS来实现网络启动。DHCP已经取代BOOTP,但它不提供kernel img的传递,需要TFTP。NFS可以在NFS服务器和客户端之间共享整个目录树,他需要启动linux kernel来支持,通过mount方式,将网络目录(host上的目录)mount到target上,可用于调测我们的应用。

  我们需要在建立dhcp server。作者提醒建立dhcp server需要非常注意,不要影响到其他正常服务的dhcp server,有必要的话,应先和IT部门联系一下。我计划在host上建立dhcp server,IT部门不管事,但是为了安全的,我将限制在实验网段中。DHCP不依赖与其他intel的服务(例如inetd),都是由他自己提供。具体操作的结合实践另外给出,我想先读为这个章节,结合前面,以及moblin的一些情况,希望能在MID上跑一个系统,先run起来。

  我们需要建立TFTP server和NFS server。NFS通常rpm已经安装。我们需要提醒的是安装问题,尤其target是通过intenet来访问的。建议通过host.deny和host.allow中进行权限的控制。

Uboot的使用

  U-boot是目前嵌入式操作系统中最常见的bootloader。『对于MID,使用的是x86的主板,在重新刷BIOS后,可以安装GRUB的linux,没考虑好使用哪个,可以都试一试』在http://www.denx.de/wiki/U-Boot/WebHome 上的文档正得很多很强大。书以OpenMoko(GTA01)的板子为例子。

1. 选定板块类型:make gta01_config,建议看一下uboot的REAMDE的介绍。(比较长)

2. make ARCH=xxx CROSS_COMPILE=xxxx u-boot.udfu。前面两个自明其意。最后一个参数udfu表示USB Device Frimware Update,可以用来升级设备上的版本(指升级uboot)。还可以是u-boot.map(symbol map) , u-boot (ELF 二进制格式), u-boot.bin(raw 二进制img,可以写入boot 存储设备)。

  我觉得如果没有实践,很难理解得深刻,书中还介绍了通过uboot启动等方面,我将在实践篇中描述,这里只做少许的记录。我们需要将uboot放入设备的相应闪存的相应的物理地址中,需要靠它来启动。我们可以通过串口来查看uboot的输出和输入。如果我们按任何一个键,进入uboot的命令行操作,uboot提供了包括cp在内的很多命令,这些命令和arch,平台,开发板相关,uboot提供了每一个命令的help,例如:#help cp。如果我们没有按任何一键,将在等等x秒之后,uboot根据缺省的配置启动。启动后,进入命令行,可以通过printenv、setenv、saveenv来查看,修改,保存环境变量参数。uboot环境变量可以用来生成boot脚本,脚本就是这些环境变量加一些uboot命令(run和“;”)组成的。如果闪存是ikongb的,没有被组织为文件系统,没有包括任何的文件headers,那么下载到target的二进制img必须带有Uboot可以可以理解的headers并知道如何去load他们。mkimage可以提供这个功能。虽然image的headers不一个bootloader所必须要求的,但这些头在开发和启动的时候提供很多方便,所以uboot使用他们。可以通过mkimage制作img映像和RAM disk(initrd)。

  Uboot有一个命令bootp,使用DHCP,从DHCP服务器中获取地址、TFTP地址以及上面文件名。target从tftp中获取img,并防止在配置的RAM地址(例如地址为0x30100000)中。我们可以通过iminfo命令来获取img头信息(imi 30100000)。可以启动img(bootm 30100000)。这样在启动的过程吃那个出现panic,原因是没有根文件系统。我们需要利用uboot的环境变量来生成一个脚本,将一些boot的选项传递给kernel。我们增加bootnfs,使得系统可以通过NFS了mount根文件系统。

  开发的过程中,我们使用tftp、nfs,但是最终的产品是需要加载到设备的flash中去。可以利用uboot的命令,包括擦除和写,也可以通过tftpboot或者loadb下载img到RAM,然后用cp.b将其写入flash。在下载完之后,可以用imi命令,含有CRC校验来检查完整性。

  对于uboot本身的升级,使用crc32命令,因为uboot没有经过mkimage命令,没有img header。下载后,NOR和NAND的处理是一样的。先将flash去保护,erase,cp.b,重设环境变量,例如文件大小,保存配置(因为曾擦除,即使没有任何修改,需要重新保留配置)

你可能感兴趣的:(linux,server,读书,System,linux内核,嵌入式操作系统)