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怎么读取windows文件本文假设读者对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: //下载的,同时下载的还有patch-2.6.22,虽然一开始用不上。顺便说一句,其实默认下载的2.6.15.4版本已经足够了,没有特殊情况没有必要单独再下载别的,新版本内核很多特性都是用不上的。
如果你下载的内核版本有对应的补丁,就要通过补丁进行对内核源代码的修补操作。一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。补丁是通过diff应用程序来创建的。我们使用patch程序来应用下载的patch。patch程序读取一个diff(或者patch)文件,然后把文件中描述的变化内容应用到代码树上。Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。这就意味着:patc件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是”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_.件,你需要修改源代码目录下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 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 里,组
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论