引言
嵌入式计算机系统随着其应用方式不同,具有不同的体系结构形式。基于x86平台的嵌入式计算机,因其采用与标准PC相同的硬件结构、操作系统和软件开发平台,开发方便,应用程序设计资源丰富,因此在嵌入式系统中占据越来越大的份额,尤其在工业控制方面得到了广泛的应用。
不同于没有操作系统、功能单一的消费类电子产品,也不同于加载启动完全由BootLoader引导加载程序来完成的某些嵌入式系统,基于x86平台的嵌入式计算机的结构由PC而来,其功能复杂,初始化硬件和引导操作系统仍然由BIOS来完成。但一个嵌入式系统的BIOS并不需要像通用PC BIOS那样具有那么多的灵活性,因为通常它仅需处理某种特定的硬件配置方案。所以,LinuxBIOS是替代传统BIOS的开源解决方法,移除了许多嵌入式平台不必要的功能,为基于x86平台的嵌入式计算机系统定制的基本输入输出系统。
本文将以基于 AMD Geode LX处理器的嵌入式 x86平台为例,介绍了 LinuxBIOS的基本结构、运行过程;在此基础上配置 LinuxBIOS映像,并实现其引导功能。
2.LinuxBIOS简介
LinuxBIOS项目由美国Los Alamos国家实验室高级计算实验室的 Ron Minnich创始,遵循GPL条款的开源项目。目前LinuxBIOS不仅支持嵌入式 Linux系统的引导,在配置相应的映像如FILO、ADLO时还可以支持Windows 2000、FreeBSD、OpenBSD等操作系统。
LinuxBIOS的主要特征有:①系统引导— 支持ext2、fat、iso9600等文件系统,可从IDE、Flash等设备中引导系统内核。如果配置Etherboot映像,还支持网络引导。②串口控制台—在系统初始化早期阶段输出控制信息,目的主要用于调试,控制信息分为9个级别,可以根据调试的需要进行配置。③源码易读— LinuxBIOS项目除了在CPU和存储器的初始化时使用汇编语言外,其它部分使用C语言,具有可读性和可移植性,方便代码的维护。
3.基于 Geode LX处理器的系统平台
GeodeLX处理器是AMD公司推出的新一代基于x86体系结构的嵌入式处理器,主要用于工业控制、移动设备等领域。Geode LX处理器支持i586指令集,并且带有MMX和AMD 3DNow!指令集扩展。其CPU频率在400MHZ-500MHZ,带有8级单发射的指令流水线,64K指令L1 cache和64K数据L1 cache,128K的可配置为指令或数据的L2 cache。处理器内部集成了图形和视频处理单元提高了二维图形和视频的应用加速。和Geode LX处理器一起使用的CS5536芯片组提供南桥的功能如IDE、USB2.0、Flash、AC97和x86的外围设备接口。
4.LinuxBIOS的基本结构
LinuxBIOS支持多个主板、CPUs和芯片组,其工程目录结构如图 1所示;主要有三个目录:src、targets和util。src目录包含了CPUs、主板、南桥、北桥和其它设备的源码,用来配置和初始化CPU、存储器和 PCI控制器等设备。在 targets目录中根据系统平台的配置文件来创建 ROM映像文件。util目录为创建 ROM映像或者将 ROM映像烧写到主板的 Flash中提供了工具支持。
LinuxBIOS的平台全局配置文件 Config.lb和选项文件 Option.lb在 src/mainboard/目录内,配置文件 Config.lb描述资源在目标结构中是如何被使用的,规定了 CPU的结构、平台所使用的 PCI设备以及代码存放的地址等内容。比如在追加 VGA BIOS到 LinuxBIOS的映像文件中,需要在该配置文件 Config.lb的 PCI桥选项中填加 VGA BIOS的存放地址;而选项文件 Option.lb定义了在配置文件 Config.lb中所使用的选项。
在 ROM映像中有个 Payload映像如FILO、Etherboot等,该映像为 ELF格式,是用来加载操作系统内核的。在创建 LinuxBIOS的 ROM映像过程中,Payload映像被集成到 ROM映像;配置期间,开发人员可以设置 ROM映像的大小和 Payload映像的指向,还可以选择是否采用NRV2B或 LZMA压缩算法对 Payload进行压缩,相关的配置选项在目录/targets内相关系统平台的配置文件 Config.lb中给出。
5.LinuxBIOS启动过程
从操作系统的角度看,LinuxBIOS的总的目标是正确的调用系统内核来执行,由于LinuxBIOS的实现依赖于 CPU的体系结构,此部分将依据基于 Geode LX处理器的嵌入式 x86平台来分析 LinuxBIOS的启动流程,其流程图如图2,可以分为以下三个阶段:
第一阶段是主要用 C语言完成的,其中也内嵌了少量的汇编语言,主要是存储控制器的初始化和其他硬件必要的初始化。系统加电启动时,CPU首先从 reset16.inc启动,随后跳转到 entry16.inc并切换到 32位的保护模式。在目录/CPU/amd/model_lx/内的cache_as_ram.inc将初始化 CPU中的 Cache控制器,为堆栈准备空间,而在目录/mainboard/amd/db800/内的 cache_as_ram_auto.c被 gcc编译成auto.inc,将开始初始化存储控制器。/CPU/amd/car/post_cache_as_ram.c是 cache_as_ram_auto.c的一部分,将Cache中的栈复制到 RAM中,使 Cache恢复正常,为 hardwaremain预留1M的空间,昀后调用 copy_and_run, copy_and_run将复制并解压 hardwaremain到 RAM 中,跳转到hardwaremain处执行。
第二阶段是硬件列举阶段,开始列举 PCI总线上的设备,分配存储空间和 IO空间,配置南桥上设备如USB、Flash和一些外围接口,初始化 PCI总线上的设备使其可用,并初始 化 LinuxBIOS表。
第三阶段加载Payload,要检测系统内存映射,将 Payload从 ROM映像中复制到RAM,开始解压 Payload映像并执行,将根据启动参数加载操作系统内核kernel。
6.Geode LinuxBIOS的配置
为了能从 IDE硬盘中启动操作系统,选择 FILO作为Payload,FILO支持从 IDE硬盘、CD-ROM等设备引导操作系统。构建 LinuxBIOS ROM映像需要的源文件有 LinuxBIOSv2、FILO-0.5和lx_vsa.36k.bin,其中lx_vsa.36k.bin是AMD Geode设备的系统管理模式软件,它将被目录/src/cpu/amd /model_lx/中的vsmsetup.c调用,由 AMD公司直接提供。
具体的配置 ROM映像的方法如下:
①创建 FILO Payload映像
将 FILO-0.5的压缩文件包解压,在 FILO-0.5的根目录下运行 make命令,创建了一个默认的 Config文件,在该文件中指出所要引导 Linux内核映像文件的磁盘分区等信息,其相关配置如下:
AUTOBOOT_FILE = "hda1:/vmlinuz root="/dev/hda1" console="tty0" console="ttyS0",115200" #自动加载系统的命令行参数 再次运行 make命令即可在 FILO-0.5的根目录下产生 filo.elf映像文件。
②配置 LinuxBIOS
为了加快系统启动的速度,减少串口控制台的输出信息,可以通过修改 src/mainboard/amd/db800目录中的 Option.lb文件的配置选项,降低输出信息的级别,其默认选项为8,将其修改为6,输出启动各阶段的通告信息。配置选项如下:
default DEFAULT_C*OLE_LOGLEVEL=6 #要求级别 6的调试输出
修改/targets/amd/db800目录下 config.lb文件,使用 LZMA算法压缩 payload映像,指出Payload 映像的指向为 payload /FILO-0.5/filo.elf,这样可将 Payload映像集成到ROM映像中。下面是基于 AMD Geode处理器目标板的 ROM映像一些配置选项:
option CONFIG_COMPRESSED_PAYLOAD_LZMA=0 #修改为 1时使用 LZMA算法压缩 payload option ROM_SIZE=512*1024-36*1024 #预留 36k空间给 lx_vsa.36k.bin payload ../payload.elf #修改指向为 payload /FILO-0.5/filo.elf
③生成 LinuxBIOS ROM映像
在/LinuxBIOSv2/targets/目录下,执行如下的命令: [root@localhost targets]#./buildtarget amd/db800此时在 amd/db800中产生了 db800目录,目录中有 Makefile、Makefile.settings和
config.py文件,将切换目录到 amd/db800/db800下,运行如下命令: [root@localhost db800]#make
在/db800目录下生成了 db800.rom映像文件,其大小为476k,从前面的配置选项中得知,在/targets/amd目录下的 config.lb文件中定义了 option ROM_SIZE=512*1024-36*1024,这 36k的空间是留给 lx_vsa.36k.bin的,执行下列命令将追加到 ROM映像中:
[root@localhost db800]#cat db800.rom lx_vsa.36k.bin>LinuxBIOS.rom
LinuxBIOS.rom为昀终所生成的 ROM映像文件。
7.烧写映像文件并运行
LinuxBIOS ROM映像文件将通过与宿主机相连的 SUPERPRO/GX编程器烧写到flashrom中,这样比较简单易行,方便调试。在启动系统前,首先要配置 Linuxkernel-2.6.23,在配置中要选择配置选项 Device Drivers中的 AMD Geode LXframebuffer支持模块。
将已经烧写了 LinuxBIOS.rom映像文件的 flashrom放到 db800开发板上。启动目标板,通过 windows的超级终端显示 LinuxBIOS的启动信息的结果如图3所示:
8.结束语
本文简单介绍了 LinuxBIOS的基本特征,以及基于 Geode LX处理器的嵌入式 x86体系结构,重点给出了 LinuxBIOS的基本结构和针对基于 Geode LX处理器开发平台的 LinuxBIOS的运行机理,昀后详细地给出了 LinuxBIOS的 ROM映像配置和生成方法,并给出了实验结果,实验表明该方法配置出来的 ROM映像是能够可靠运行的。
本文的创新点:阐明了在基于 Geode LX处理器的嵌入式开发平台上 LinuxBIOS的配置方法和实现步骤,为从事嵌入式系统开发工作的人员提供一个参考。
更多x86架构与ARM架构知识请访问http://www.elecfans.com/zhuanti/x86.html
评论
查看更多