您的位置:首页 > 运维架构 > Linux

uclinux系统移植到bf561板子上过程

2009-09-14 11:08 323 查看
uclinux系统移植
主要工作包括:
1、选择处理器对应的交叉编译器(交叉编译器,运行于通用机上,目的为了编译出能够在特定平台上运行的软件)
2、选择并修改bootloader
3、修改链接文件,定位各个数据段
4、定义系统定时器、控制台
5、编写中断的控制函数
6、定义根文件系统
7、编写其他系统设备驱动
一、开发环境的建立
开发环境包括获取源代码,建立交叉编译环境,建立目标机与主机之间的调试环境。详细一点来说包括
1、开发模式与交叉编译
2、编译工具
3、U-BOOT引导代码
4、linux内核
5、lib库
6、应用程序及根文件系统
开发模式为程序在宿主机上被编译,然后下载到目标机上运行;目标机上的终端通常被重定向到串口,在宿主机上输出(注意宿主机上要运行linux系统);

交叉编译:在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。交叉编译工具链由一套用于编译、汇编和链接内核及应用程序的组件组成,通过编译可以使uClinux内核和应用程序在目标设备上运行。
GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs,C语言编译器GCC,以及大部分UNIX系统的程序库和工具
编译uClinux一般使用GNU开发套件作为交叉编译器工具链,它包括一系列的开发和调试工具,其中包括预处理、编译、汇编和链接4个互相关联的步骤,每一步骤都有相关工具完成,主要工具有:

GCC: 是GNU编译器的前端程序,负责完成预处理和编译过程,生成以.o为后缀的目标文件
AS: 是GNU编译器的汇编器(Assembler),负责把.S或.s为后缀的汇编文件编译成以.o为后缀的目标文件
LD: 是GNU编译器的连结器(Linker),负责把目标文件和库文件连结起来,重定位它们的数据,把所有的符号连结起来;
连接器是将所有编译器和汇编器的输出文件连接成一个二进制映象的工具,二进制映象有很多种不同格式,而Flat、AOUT、COFF、PE和ELF是最常见的几种。链接器输出文件都会出现三个区域,Text(或者Code),Data和BSS区。Text(或者Code)区是只读的代码区。Data区是可读可写的数据区,举例来说,你在程序定义了一个变量并给它赋值5,那么这个“5”就被存储在Data区。而BSS区则是可读可写且没有初始化的数据区。它存储着未赋任何值的数组。注意,BSS区是一个虚拟的区域它不存在于二进制映像中,但当二进制映像被加载后,它就存在于内存中了

GNU Binutils是二进制工具集合,主要包括了上面提到的GNU汇编器和链接器
elf2flt:
elf[exectivelinkedfile]:一种为Linux系统所采用的通用文件格式,支持动态链接和重定位。flat:扁平格式。elf文件有很大的头文件,flat格式对文件头和一些段信息做了简化,可执行程序小,适于嵌入式系统。elf2flt就是将elf格式转换为flt格式

在blackfin平台上建立交叉编译环境需要的工具有:
GCC; Binutils; elf2flt
还需要uclinux内核源码。可以从从blackfin网站下载这些编译器的源代码和内核源码
编译环境建立具体过程为:
1、从blackfin网站下载编译器的源代码
cvs -z9 -d:pserver:anonymous@cvs.blackfin.uclinux.org:/cvsroot/gcc3 binutils
cvs -z9 -d:pserver:anonymous@cvs.blackfin.uclinux.org:/cvsroot/gcc3 elf2flt
cvs -z9 -d:pserver:anonymous@cvs.blackfin.uclinux.org:/cvsroot/gcc3 gcc
2、从“http://blackfin.uclinux.org/frs/?group_id=17”下载内核源代码
3、编译Binutils:
make distclean
./configure --target=bfin-elf --prefix=<output_dir> --exec-prefix=<output_dir>
make
make install
4、复制头文件到编译器安装目录
cp -rf <2.6 kernel>/linux-2.6.x/include <output_dir>/bfin-elf
cp -rf <2.6 kernel>/lib/libc/include <output_dir>/bfin-elf
5、创建输出路径
PATH=<output_dir>/bin:$PATH
6、编译GCC
make disclean
./configure --target-bfin-elf --prefix=<output_dir> --exec-prefix=<output_dir>
make
make install
7、编译Elf2flt
make distclean
./configure --target=bfin-elf --with-libbfd=<binutils_dir>/bfd/libbfd.a
--with-libiberty=<output_dir>/lib/libiberty.a
--with-bfd-include-dir=<binutils_dir>/bfd
--with-inutils-include-dir=<binutils_dir>/include
--prefix=<ourput_dir> --exec-prefix=<output_dir>
mak
emake install
至此交叉编译环境建立

接下来要移植U-BOOT引导程序,类似于PC机的BIOS,负责把内核映像从FLASH拷贝到SDRAM,然后把执行权交给内核。
首先应该将U-BOOT程序烧到目标板FLASH中,在此需要Visual DSP++在裸板上调试、烧写

具体步骤为:
1、从Blackfin网站下载为BF533移植的U-BOOT
http://blackfin.uclinux.org/frs/?group_id=20&release_id=110
经过简单的移植,U-BOOT也可以很容易的在BF561上跑起来
2、编译得到RAM版U-BOOT(u-boot.dxe),和ROM版U-BOOT(u-boot.bin)
2.1 U-BOOT编译:
make clean
make mrproper
make ezkit561_config
2.2编译ROM版的U-BOOT
make clean
make all
2.3 编译RAM版的U-BOOT
make clean
make u-boot.ram
3、用串口线将开发板同PC机相连,同时把仿真器接到开发板的JTAG口
4、系统上电,启动Visual DSP调试环境z手工配置SDRAM寄存器
EBIU_SDGCTL:0x91998
DEBIU_SDBCTL:0x13
EBIU_SDRRC:0x74A
5、下载u-boot.dxez修改PC指针,将其指向RAM版U-BOOT的入口地址,0x1000000。
6、启动超级终端作为开发板的控制台(115200 8N1)运行U-BOOT程序,在超级终端进行调试
7、下载ROM版U-BOOT并烧写到FLASH中
BOOT> loadb 1000000
BOOT>fl 20000000 1000000 20000
8、重启后即可执行FLASH上烧好的U-BOOT引导代码。

内核镜像的调试与烧写
在uClinux-dist目录下执行make命令将完成全部的编译工作,编译完成后在uClinux-dist/images目录下将生成linux.bin和zImage.bin
linux.bin是包含根文件系统的linux二进制代码;
zImage.bin是将linux.bin压缩后做成的可用于u-boot解压的压缩文件,因为开发板上FLASH大小有限,为了节省空间,因而使用压缩的内核代码。

两种方式调试内核:
1、同U-BOOT一样使用仿真器调试;
通过JTAG我们可以控制flash芯片上所有管脚,这样可以通过向JTAG接口输入相应的指令和数据,用软件的方法在flash芯片的数据、地址和控制总线上产生出Flash器件的读写操作时序,将uClinux的内核映像文件烧写到Flash中
2.通过tftp将内核下载到SDRAM,然后再从SDRAM写到FLASH中
首先需要建立一个tftp服务器,为了简便,可以直接在windows下建这个服务器,然后把内核和文件系统映像放在服务器的目录下,烧写的过程也就是从服务器上把内容写到Flash指定位置
过程为:
利用U-BOOT调试,将内核下载到SDRAM中直接运行
BOOT> tftp 0x1000 linux.bin
BOOT> go 1000
内核烧写:
BOOT> tftp 0x1000 zImage //内核从0x1000处开始存放
BOOT> fl 0x20040000 0x1000 0x100000

重启后如果没有用户输入,U-BOOT将自动引导内核启动。

上面的步骤实现了将U-BOOT和uclinux镜像烧写到flash中

u-boot实现uClinux自举的顺序如下:(u-boot和uClinux的压缩映像都预先驻留在FLASH中.)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: