林俊杰遇见对的人歌词:PowerPC平台Linux的移植

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 20:55:04

PowerPC是早期Motorola和IBM联合为Apple的MAC机开发的CPU芯片,商标权同时属于IBM和Motorola,并成为他们的主导成品.IBM主要的PowerPC产品有PowerPC604s(深蓝内部的CPU), PowerPC750,PowerPCG3(1.1GHz).Motorola主要有MC和MPC系列.尽管他们产品不一样,但都采用PowerPC的内核.这些产品大都用在嵌入式系统中.

我们这里要介绍的,主要是针对IBM在xilinx平台上推出的PowerPC嵌入式内核。本文所写的内容,基本上都是用于XUP大学计划开发板的,但是其中很多步骤都是通用的,你完全可以在Xilinx ML-403开发板或者其他相应板子上参考这些步骤,它们之间最大的区别就是创建SystemACE时的命令行不同,在相应的部分会具体讲解。应该说不管什么平台,整个流程都遵从于:

Kernel preparation —》 isntall BSP —》 Build hardware platform —》 Memory test —》 Build kernel image —》 Download

本文假设读者对linux环境下ISE,EDK等工具的操作已经熟悉,并对在XUP开发板上定制基本硬件系统已经熟悉,因此不再详细涉及这方面的问题。本文作者直接使用linux作为开发环境,因此文章中也不会涉及交叉编译环境的创建,如果你是windows用户,请自行参考网上有关cygwin的文章;如果你所使用的操作系统是linux,但对开发环境的建立不熟悉,可以参考我之前写的linux下eda工具安装这篇文章;如果你对硬件系统的定制还不算熟悉,请将问题针对到某一个模块,然后留言询问。

整个文章比较长,从目前已经写了的内容来看,可能要分三个部分发布。这里是第一部分。

基本系统信息

软件:ISE和EDK都是9.1,没有sp,操作系统是ubuntu 7.04;硬件:XUP开发板,usb下载线;基本系统组成:

300MHz PPC
opb_sysace
opb_ethernet (无DMA)
DDR memory controller
opb_uart_16550
plb_bram_if_cntrl(bram选择最大容量)

所有部件都要有中断支持。按照上面的基本要求把系统构建起来,OS先选择standalone,跑一个基本程序看一看。只有确认基本系统正常之后,才可以知道以后移植系统时遇到的毛病是否是硬件原因。

在EDK中创建BSP

首先,打开软件平台设置的选项,按照下列步骤执行:

1. 将PPC_405_0的OS设置为linux_mvl31,我这里的版本是1.01.c
2. 进入Library/OS选项,其中,MEM_SIZE设置成你所用平台上内存的容量,比如是256MB就设置成0×10000000,依此类推。 PLB_CLOCK_FREQ_HZ是你PLB总线的频率,XUP是100MHz,也就是100000000,其他类型开发板自行修改。 TARGET_DIR是你用于存放BSP的路径,注意,路径千万不能有空格。
3. 添加硬件,在connected_periphs里面,不过一般点进去之后就都已经帮你自动添加好了。
4. 执行libgen。

如果一切顺利,就可以生成相应的bsp了。如果在这个过程中出现了什么问题,都可以去EDK安装目录下的sw/ThirdParty/bsp/linux_mvl31_v1_00_a/data/目录去看看相应的tcl文件,它们是用来实际执行BSP操作的命令。

到这里,你就已经有了可工作的bit流文件以及为Linux准备的BSP文件了。但有趣的是,我发现BSP的作用很小,所有edk9.1生成的文件,你所需要的可能就只有xparameters.h 和 xparameters_ml403.h真正有用,其它文件作用很少,如果你下载的Linux源代码是montavista的东西,甚至连这两个文件都不用了。当然,如果使用的电路板是自定制的,像xparameters_ml403.h就会有不同的macro定义,因此这两个是一定要覆盖默认的内核目录下的同名文件的。出于保险,最后还是使用上这个BSP就行了。

创建用于ppc的交叉编译环境

通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。建立一个交叉编译工具链是一个相当复杂的过程,如果你不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载。在这里,我们直接通过现成的脚本来建立ppc的交叉编译环境,如果你对自己编译建立这个环境感兴趣,可以自行参考文章如何为嵌入式开发建立交叉编译环境。

考虑到绝大多数人使用的都是x86电脑,因此,建立适宜于ppc的交叉编译环境就是必要的。首先,到这里来下载crosstoll的安装包。下载完后解压缩,进入文件夹,你就能看见很多类似于demo-arch.sh这种形式的脚本。每一种arch,对应的自然就是一种硬件平台,而我们这里要使用的,就是demo-powerpc-405.sh。如果你对这套工具感兴趣,可以参阅其 使用说明。这里,笔者只根据自己的开发环境来进行讲解。

在使用之前,需要先对脚本编辑一下。打开demo-powerpc-405.sh,TARBALLS_DIR是相关下载资源的存放地,因为在安装交叉编译环境之前,需要从网上下载glibc,gcc等的源代码包。RESULT_TOP的值是安装后的目录,自行根据需要修改。另外找到这句话:

eval `cat powerpc-405.dat gcc-4.1.0-glibc-2.3.6.dat` sh all.sh –notest
ls

将其中的gcc-4.1.0-glibc-2.3.6.dat修改为适合你平台的dat文件。可以先看看文件夹里面有哪些dat文件,gcc-4.1.0表示gcc的版本,glibc-2.3.6表示glibc的版本,这些版本号都要和你实际机器上的版本号相对应。

如果不准备修改目录,就在/opt目录下自己建一个crosstool目录,并将其权限改为可写,最后执行脚本:

sudo mkdir /opt/crosstool
sudo chown $USER /opt/crosstool
sh demo-powerpc-405.sh

之后,脚本就会根据你所修改的选项,去网上找相应版本的gcc,gdb,glibc,内核等,下载并编译安装。具体所消耗的时间是和你的网速息息相关的。如果你所在的网络速度很慢,建议你还是不要尝试了,换个网络再测试吧。或者你可以看看脚本中TARBALLS_DIR目录的值,然后自行下载所需要的各种工具以及内核的源码包,并自己放到这个目录下,再执行sh demo-powerpc-405.sh即可。唯一需要注意的就是,你自己下载的环境工具源码包的版本需要和demo-powerpc-405.sh里面指定的版本一致。

所有需要的资源下载完毕之后,并不是就直接执行demo-powerpc-405.sh了,因为直接执行的话可能出现一些问题,所以在之前要先做一些准备步骤:

1. 先unset LD_LIBRARY_PATH,至于为什么,笔者猜测是由于 LD_LIBRARY_PATH 环境变量通常都是由安装程序修改为包括相关库所在的目录,估计是编译环境时不能受已有库的影响,要在编译过程中临时给LD_LIBRARY_PATH 一个值,编译完成之后再改回来。

2. 安装语法分析程序生成器bison/flex,执行

apt-get install bison flex

即可。

3. 将/bin/sh的连接对象从dash改为bash,这是由于我选择的glibc-2.3.6和dash有bug冲突。就算你不是用的glibc-2.3.6,也建议修改。先用

ls -la /bin/sh

看看你的sh链接到底是什么。如果是dash,就要通过

sudo ln -sf /bin/bash /bin/sh

来更改。

进行以上步骤后,再执行demo-powerpc-405.sh ,编译过程就应该比较顺利了。当然这个用时也是比较长的,具体时间取决于机器配置,强烈建议吃个饭,打打球,然后再回来看看~。

环境构建完成之后,该环境下的工具列表如下:

别忘了在PATH变量中增添路径,就是${prefix}/bin,这样你就可以直接使用这些工具了。

处理并编译内核源代码

Linux内核的配置系统由三个部分组成,分别是:

1. Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;
2. 配置文件(config.in):给用户提供配置选择的功能;
3. 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。

这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。

应用补丁

如果使用上述脚本,它会自动帮你下载内核源码,如果你觉得版本较低,可以自行下载。我这里下载的是2.6.22的内核代码,直接去http: //www.kernel.org下载的,同时下载的还有patch-2.6.22,虽然一开始用不上。顺便说一句,其实默认下载的2.6.15.4版本已经足够了,没有特殊情况没有必要单独再下载别的,新版本内核很多特性都是用不上的。

如果你下载的内核版本有对应的补丁,就要通过补丁进行对内核源代码的修补操作。一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。补丁是通过diff应用程序来创建的。我们使用patch程序来应用下载的patch。patch程序读取一个diff(或者patch)文件,然后把文件中描述的变化内容应用到代码树上。Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。这就意味着:patch文件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是”a/”和”b/”之类的其它名字)。由于这很可能和你本地机器上的内核源代码目录的名字不匹配 (但是对于查看一个没有标签的补丁所基于的内核版本是非常有用的)。你应该切换到你的内核源代码目录,并且在打补丁的时候去掉patch中文件名字路径的第一个分量(patch命令的-p1参数可以完成这个任务)。

具体过程是这样的,比如把下载下来的patch压缩包解压到/patch目录下,解压后的文件名为:xxxx.patch,然后进入你内核源文件的文件夹,将补丁拷贝到这里,首先运行命令

patch -p1 –dry-run < /xxxx/patch-xxxx

这一步是测试应用patch,此命令不会对你的内核源码做任何更动,如果这一步没有出现任何错误输出的话,就执行:

patch -p1 < /xxxx/patch-xxxx

如果没有错误提示,就表示补丁已经打上了。

修改文件

好,此时的内核源代码,如果是用于台式机的编译,改动就已经足够了。但是我们是要编译出能在ppc上运行的内核,因此,还要继续进行修改。

修改串口代码

首先,在XUP板子上有一个串口终端,并且只有一个,这意味着很多流程,包括boot loader,boot process以及接下来的一些步骤都要和这个串口交互,如果采用默认的波特率9600,就有点慢了,因此,我们可以将其波特率修改得大一些。以 38400为例,硬件平台的修改请在edk下进行,系统源代码的修改,请找到arch/ppc/boot/common/ns16550.c,找到这一行:

#define SERIAL_BAUD 9600

将其修改成

#define SERIAL_BAUD 38400

即可。

修改xparameters.h

在生成bsp的时候会生成xparameters_.h文件,你需要修改源代码目录下arch/ppc/platforms/4xx/xparameters.h
文件,让它包括xparameters_.h这个文件。

修改makefile

接下来我们来关注一下Makefile,由于 Linux 内核源代码是按照树形结构组织的,所以 Makefile 也被分布在目录树中。Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有:

1. Makefile:顶层 Makefile,是整个内核配置、编译的总体控制文件。bother finally
2. .config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。
3. arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如 arch/arm/Makefile,是针对特定平台的 Makefile。
4. 各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。
5. Rules.make:规则文件,被所有的 Makefile 使用。

用户通过 make config 配置后,产生了 .config。顶层 Makefile 读入 .config 中的配置选择。顶层 Makefile 有两个主要的任务:产生 vmlinux(未压缩的内核) 文件和内核模块(module)。为了达到此目的,顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录,取决于内核的配置。在顶层 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 体系结构下的 Makefile,这个 Makefile 中包含了平台相关的信息。有关Makefile的更多说明,请参见IBM文档库文章 Linux内核配置系统浅析。

小知识:各种内核格式的区别

vmlinux是未压缩的原始内核,为ELF格式,常用于内核调试;
vmlinuz,或zImage or bzImage,是vmlinux经过压缩并包装有gzip自解压代码的内核,为BIN格式,常作为系统或目标板的引导内核。

位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。

下面谈谈具体如何对Makefile进行修改。打开内核源代码目录下的Makefile文件,找到以下两行:

ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=

这是表示ARCH的值为SUBARCH的值,而CROSS_COMPILE的值为空。我们应该将其改为:

ARCH := ppc
CROSS_COMPILE = powerpc-405-linux-gnu-

这样表示硬件平台是ppc,而交叉编译工具是powerpc-405-linux-gnu-系列工具。

小知识:ppc还是powerpc?

细心的朋友可能发现,arch/platforms目录下既有ppc目录又有powerpc目录,这是怎么回事呢?由于IBM 成立 power.org 组织,便以 Power Architecture 来称呼 PowerPC 处理器,因此,以往所惯用的PPC 现在都改名叫 PowerPC。也就是说, PowerPC 现在属于是官方名称了。而Linux kernel 由 2.6.15 开始,已经把 arch/ppc/ 重新组织到 arch/powerpc/,不过在整个迁徙的工作完成之前,arch/ppc/ 仍会继续存在,只不过 arch/ppc/ 将会停止发展,接下来的 Linux kernel for PowerPC 将会转移到 arch/powerpc/ 的新目录下继续发展。

仔细观察两个文件夹,会发现有些许不同,以往 PPC platform的分类 是被写在 arch/ppc/platforms/*.c 裡,组织结构不大良好,现在被重新组织在 arch/powerpc/platforms/ 目录下,一个 platform 一个目录,干净多了:

# ls arch/powerpc/platforms/
4xx/ 85xx/ apus/ embedded6xx/ maple/ prep/
82xx/ 86xx/ cell/ iseries/ pasemi/ pseries/
83xx/ 8xx/ chrp/ Makefile powermac/

当然,就目前来说,Makefile里面的arch值设置为ppc或者powerpc都无所谓,因为即使你选用了ppc,构建系统的时候也会自动包含asm-powerpc中所必须的共享包含文件,因此没有必要担心这一点。

内核配置

接下来进行内核配置。笔者推荐使用”make menuconfig”命令,而不是一些文章中推荐的”make xconfig”,因为后者可能产生一些未知原因的编译错误。menuconfig是一个文本模式、选单驱动的配置界面,而xconfig是基于 Tcl/Tk的X图形配置界面。另外一个常用的是make oldconfig,如果只想在原来内核配置的基础上修改一些小地方,这个命令会省去不少麻烦,但我们这里是要大改,所以也不用这个。关于配置内核的原理与过程,不熟悉的朋友可以参见这篇文章 ,这里就不详细介绍了。顺便提及的是,运行这个命令可能出现以下错误

1 /usr/bin/ld: crt1.o: No such file: No such file or directory

这个错误可以通过安装libc6-dev解决

2 /usr/bin/ld: cannot find -lncurses

这个错误可以通过安装libncurses5-dev解决

3 checklist.o: file not recognized: File format not recognized

解决方法是用”make mrproper”命令清除所有旧的Xwindow configuration文件,至于为什么会有这个错误,我没有深入研究,知道的朋友请指点一下

在一开始配置时,建议先生成一个最小的,保证可运行的.config文件,以后再根据自己的需要添加一些特性,而且添加特性的时候一定小心,稍不注意就会让你无法正常编译,或者无法正常运行。另外需要注意的是,所有标有“new”标签的选项都要遵从默认设置,不要修改它。下面这些选项是我所用的最小系统配置,如果你使用的内核版本和我的差别很大,可能需要改动一些config选项,或者如果你使用这个配置出现问题,请在这里留言,我会尽力帮你分析。先将清单与大概解释列出如下:

General Setup
* Prompt for development and/or incomplete drivers
(XUP)Local version – append to kernel release
* Initial RAM disk (initrd) support
* System V IPC
* Configure standard kernel features —>
* Sysctl syscall support ?

Processor
* 40x Processor Type
* Xilinx-ML300 Machine Type
* Math emulation
* TTYS0 device and default console

Platform options
* High memory support
* Default bootloader kernel arguments~
“console=ttyS0,38400 root=/dev/xsysace/disc0/part3 rw”

Networking
* Unix domain sockets
* TCP/IP networking
* IP: multicasting
* IP: kernel level autoconfiguration
* IP: DHCP support
* IP: TCP syncookie support (disabled per default)

Device drivers—Memory Technology Devices (MTD)
* Memory Technology Device (MTD) Support
* MTD partitioning support
* RedBoot partition table parsing
* Direct char device access to MTD devices
* Caching block device access to MTD devices
* RAM/ROM flash chip device drivers
* Detect flash chips by Common Flash Interface (CFI) probe
* Suport for AMD/Fujitsu flash chips(这个根据你现有芯片来选)

Device drivers—Block Devices
* Loopback device support
* Network block device support
* RAM disk support
(4096) Default RAM disk size
* Xilinx on-chip System ACE

Device drivers—Network Device Support
* Network device support
* Ethernet(10 or 100Mbit)
* PowerPC 4xx on-chip ethernet?

Device drivers—Character devices— Serial drivers
* 8250/16550 and compatible serial support
* Xilinx uartlite serial port support
* Support for console on Xilinx uartlite serial port

File systems
* Second extended fs support
* Kernel automounter version 4 support (also supports v3)
* Pseudo filesystems —>
* /proc/kcore support
* Virtual memory file system support (former shm fs)
* Miscellaneous filesystems —>
* Journaling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0=quiet, 2=noisy)
* Network file systems —>
* NFS file system support
* Provide NFSv3 client support
* Root file system on NFS
* NFS server support
* Provide NFSv3 server support
* SMB file system support (to mount Windows shares etc.)
* Native Language Support —>
* Default NLS Option: “cp437″

Kernel hacking
* Kernel debugging
* Compile the kernel with debug info
* Include BDI-2000 user context switcher

其实上面的选项不是最小的,如果你在编译的时候遇到某些问题,可以看看出问题的源代码属于哪个部分,只要能去掉就去掉。原则就是先搞定一个能跑的内核,然后再想扩展的事情。选择完成之后,将之前编译的BSP拷贝到源代码树目录中,覆盖原有文件。

内核编译

如果你想使用ram disk,那么用以下命令进行编译:

make zImage.initrd

否则用以下命令:

make

以前编译2.4内核的时候之前都要用make dep 命令保证编译内核时所有的依赖,例如头文件,都存在。不过对于2.6来讲已经不需要了,直接一个make命令把make dep和make zImage的事请就做了。如果你之前编译过,想重新编译的话,最好用一下make clean,它能够去除所有的object文件以及一些别的遗留文件。当然你也可以用make mrproper,这个比make clean清理得更加彻底,不过小心你的.config文件了,它会一起删除的,所以还是首先备份一下,或者就用make clean吧。


现在我们是第一次编译,所以还不用考虑这些。为了保险,我们使用第二组指令来进行编译。时间蛮长的,如果一切顺利,编译出来的内核会放在 arch/ppc/boot/images/目录下,可能叫zImage.elf或者zImage.initrd.elf,用目前这种编译方式编译的是 zImage.elf。

理论上讲,完毕之后就可以把这个执行文件拷贝到EDK工程目录下,并进入创建ACE文件的步骤了。但是,在上面的讲解中,我们并没有使用内核模块,而在进一步应用中,很可能有一些内核选项是要以模块形式编译进去的,此时,接下来的工作就是建立及安装模块,用命令

make modules
make modules_install

来编译,成功后,系统会在/lib/modules目录下生成一个按你所编译内核的版本号命名的子目录,里面存放着新内核的所有可加载模块。将来要使用时用insmod命令进行加载即可。目前的的Linux 2.6x版本内核是自动解决依赖关系,所以暂时不用关注depmod了。

CF的配置

CF卡分区

其实不分区也可以,但是我们在这里分区的原因是最大限度模拟正常的Linux,想想,一般的人安装Linux系统的时候是怎么分区的?/根分区,swap分区以及/boot分区。ok,我们在这里也给我们的CF卡分三个区。暂时先以我这里的8G CF卡举例子。

将CF卡插到系统上,使用命令

mount | column -t

看看CF卡对应的mount目录的dev名称是是什么。我计算机上的信息如图所示:
Screenshot-coloum@windstorm: ~.png

可以看出,CF卡在我这里是/dev/sdc。然后我们使用fdisk将其分区:

fdisk /dev/sdc

具体的分区过程我就不讲了,如果你觉得不习惯fdisk的命令行操作形式,也可以使用gparted这个图形化分区工具,总之,最后要分成的效果是:

1. Partition 1 – Type = FAT16 (6) – Size = 32MB (只需要能够放得下你的system.ace文件即可)
2. Partition 2 – Type = Linux Swap (82) – Size = 256MB (这个其实看情况了,不分swap也可以)
3. Partition 3 – Type = Linux (83) – Size = ??? (CF还剩多少就分多少,用来存放根文件系统)

可以看出,上面三个区分别对应常说的/boot,/swap和/三个分区。

创建CF卡文件系统

Xilinx的SystemACE控制器比较特殊,并不是说随便一个CF卡插上去就可以使用的,必须专门为CF卡创建特定文件系统。能够完成这个任务的是mkdosfs这个软件。用下面的命令对CF卡进行操作即可:

mkdosfs -s 8 -F 16 -R 1 F:

-s后面跟的数字表示每簇扇区数目,一般是2的整数次方。下面是FAT16文件格式通常容量对应的每簇扇区数目。

16–128MB 4
128–256MB 8
256–512MB 16
512–1024MB 32
1024–2048MB 64

不过我发现这个-s后面的数字其实可以大一些,比如我用64,除了在执行命令的时候会出现一个warning

WARNING: Not enough clusters for a 16 bit FAT! The filesystem will be
misinterpreted as having a 12 bit FAT without mount option “fat=16″.

其它没有什么问题。

-F表示FAT的大小,这里是FAT16,-R的值这里不要改动,保留扇区的数目,老问题了,有兴趣的可以去网上搜索。最后一个F:是在windows下的CF卡卷标,根据你自己的系统来调整它。如果是Linux环境,将这个卷表换成是/dev/fdx这种形式。具体设备名自行查询。

下载内核文件

OK,到这里,我假设你已经编译成功,产生了你所需要的zImage文件,好,现在该怎么用这个文件呢?有三种方式:

1 把该文件和硬件bit流合成ace文件,放到flash上面自行加载
2 通过自己编写的bootloader将flash上面的elf文件加载到内部ram中
3 通过xmd的dow命令来下载elf文件

第二种方法我还没有研究,嘿嘿,所以就先不介绍了,要是哪位朋友对bootloader比较熟的,恳请指教一下~~好了,首先详细介绍一下很多人使用的ace方式。

创建ACE

我们可以通过XMD工具来进行ACE文件的创建,命令如下:

xmd -tcl genace.tcl -opt genace.opt

genace.tcl是存在于xps安装目录下的data/xmd目录下,而genace.opt需要自己创建,内容如下:

-jprog
-board user
-target ppc_hw
-hw implementation/download.bit
-elf zImage.elf
-configdevice devicenr 1 idcode 0x1127e093 irlength 14 partname xc2vp30
-debugdevice devicenr 1 cpunr 1
-ace system.ace

-hw和-elf这两行是需要你根据自己的情况修改的,唯一需要注意的是,如果你的开发环境是Linux系统,则

-hw implementation/download.bit

这句要改为

-hw ./implementation/download.bit

在system.ace文件被拷贝到CF卡上之后,修改一下板子上的跳线,让其成为从JTAG启动,就可以始终从CF卡上加载程序。

对于非XUP的,官方的板子来说,比如ML-403开发板,步骤更加简单,genace.opt的内容如下:

-jprog
-board ml403
-hw implementation/download.bit
-elf TestApp_memory/executable.elf
-ace system.ace

你只需要告诉EDK板子是ml403就可以了,很多参数都不用自己配置。具体哪些开发板是被xmd直接支持的,可以参考genace.tcl文件。

有些朋友会发现,按照上面的步骤操作,可能会出现以下错误提示:

Error: Executable TestApp_Memory/executable.elf does not contain start address..

我在遇到这个错误之后查了一些资料,并按working harddfen照资料所述的修改办法来修改,都没有作用,最后是在朋友的安装了sp的edk环境中将ACE文件生成成功的。因此,我怀疑可能是edk无 sp的9.1版本的bug。如果你和我一样头疼于sp的下载,还在使用没有sp的环境……恭喜你,或者想办法去下载sp,或者就找安装了sp的机器来生成吧。其实基于windows的sp比较好找,主要是基于Linux的sp太难下了……默哀ing,如果有哪位Linuxer知道有别的方法能够修正这个错误,烦请告知,谢谢了。

我比较懒,还比较性急,不喜欢看着bit+elf这么大的文件通过9600速度的串口下载到板子上……所以直接使用了最简单的第三种方法,打开xmd,connect ppc hw,dow zImage.elf, con,然后就OK了。终端显示的信息如下:

loaded at: 00400000 0066D19C

board data at: 0066B120 0066B19C

relocated to: 00404060 004040DC

zimage at: 00404ED5 0066A3DD

avail ram: 0066E000 08000000

Linux/PPC load: console=ttyS0,9600 root=/dev/xsysace/disc0/part3 rw

Uncompressing Linux…done.

Now booting the kernel

……..(以下信息省略)

这就表示基本内核建立成功了,我们可以接下去创建root文件系统了。呵呵,我认为最艰难的一步已经被你搞定了,恭喜。

如果遇到错误……

很多朋友都会遇到下面这种错误

inflate returned FFFFFFFB, error is caused by the size of the uncompressed image

这表示你的内核解压缩之后大小超过了你的存储空间,通常这种情况出现在你的存储空间定位于bram上。怎么解决呢?很简单,修改ld,把程序定位到ddr上不就行了~~

还有的朋友会遇到下面这种错误:

Linux/PPC load: console=ttyS0,9600
Uncompressing Linux…done.
Now booting the kernel

loaded at: 00400000 005331A0
board data at: 40000000 4000007C
relocated to: 00404084 00404100
zimage at: 00404EB9 00530A50
avail ram: 00534000 00000000

Linux/PPC load: console=ttyS0,9600
Uncompressing Linux…oops… out of memory
pause

这个时候检查一下
arch/ppc/boot/simple/embed_config.c 中vertex的支持代码是否已经被编译进去(搜索ML403) 如果没有配置的话,板级信息就不会正确建立 。