一、搭建编译环境
所需要的交叉编译工具链:S3C6410X Tool Chain 4.2.2 - EABI V0.0 - cross-4.2.2-eabi.tar
1.解压上述工具链获得文件夹:4.2.2-eabi/
2.在/usr/local/下面创建目录arm/ (注意,最好是放到这个目录,不然在以后的编译过程中可能出现一些错误)
3.将目录4.2.2-eabi/移动到/usr/local/arm/下面
4.设置环境变量:
编辑/etc/profile文件,在文件末尾添加:
PATH="$PATH:/usr/local/arm/4.2.2-eabi/usr/bin"
export PATH
使环境变量生效:
在终端输入命令: source /etc/profile
测试环境变量是否设置成功:
在终端输入:echo $PATH,如果输出的路径中包含了/usr/local/arm/4.2.2-eabi/usr/bin则说明环境变量设置成功
5.测试交叉编译工具链
在终端输入:arm-linux-gcc -v
显示如下:
Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with: /home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-unknown-linux-gnueabi --enable-languages=c,c++ --with-sysroot=/usr/local/arm/4.2.2-eabi/ --with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/usr/local/arm/4.2.2-eabi//gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t --with-float=soft --enable-cxx-flags=-msoft-float
Thread model: posix
gcc version 4.2.2
说明交叉编译工具链已经安装成功。
二、搭建文件系统镜像制作环境
1.创建根文件系统目录rootfs及其子目录bin,sbin,boot,root,sys,srv,proc,usr等
2.编译busybox1.7.0:(所需要的源码包:busybox- 1.7.0.tar.bz2)
2.1解压源码包,进入源码目录;
2.2配置busybox:在源码目录执行make menuconfig, 如果使用默认配置则直接退出、保存,如果需要配置自己的则更改相应的选项再保存退出。
选上以下选项可以支持Tab补全功能
Busybox Settings--->
Busybox Library Tuning--->
[ ] Tab competion
已经支持了mount nfs功能
2.3修改源码目录的Makefile:
将175行: ARCH ?= $(SUBARCH) 修改为: ARCH ?= arm
将176行: CROSS_COMPILE ?= 修改为: CROSS_COMPILE ?= arm-linux-
2.4正式编译busybox:在源码目录执行make编译
2.5安装busybox: 执行命令 make CONFIG_PREFIX=/***/rootfs(根文件系统目录) install
3.拷贝glibc库相关文件到根文件系统
glibc相关库文件在交叉编译工具链中已经有了,可以直接拷贝过来用
$ sudo cp /usr/local/arm/4.2.2-eabi/lib/*.so* /***/rootfs/lib/ -d
$ sudo cp /usr/local/arm/4.2.2-eabi/usr/arm-unknown-linux-gnueabi/lib/*.so* /***/rootfs/lib/ -d
4.创建配置文件:
4.1创建/etc/inittab, 内容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
4.2创建/etc/init.d/rcS,内容如下:(创建完成后改变其属性使它可以执 行sudo chmod +x /etc/init.d/rcS)
#!/bin/sh(这段脚本主要用来自动生成设备文件)
#ifconfig eth0 192.168.1.17
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
4.3创建/etc/fstab文件,内容如下:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
5.创建设备文件
在根文件系统的/dev目录下执行
$sudo mknod console c 5 1
$sudo mknod null c 1 3
这样我们的最基本的根文件系统就做好了。
6.测试已经制作好的根文件系统
在 PC上安装mkcramfs包,以便可以制作cramfs格式的文件
在CentOS里,可以用/sbin/mkfs.cramfs命令
制作出根文件系统: $mkcramfs /***/rootfs/ rootfs.cramfs
烧录uboot,kernel,rootfs到开发板并重启开发板(如何烧录这些内容请参考第三节:内核及文件系统镜像的烧写)
系统正常启动,并进入shell,测试成功。
7.测试基本的C程序在根文件系统的运行
在PC上写一个最简单的hello.c程序:
#include <stdio.h>
int main()
{
printf("hello!/n");
return 0;
}
编译程序:$arm-linux-gcc -o hello hello.c
将编译出来的hello复制到根文件系统的/bin或/sbin或/usr/bin或/usr/sbin等任一目录
重新制作根文件系统镜像rootfs.cramfs
重新烧写根文件系统镜像到开发板
重启动开发板,进入shell,执行hello程序,显示hello!
测试成功。
四、搭建内核开发环境
所需要的文件:linux-2.6.24-for-apdk6410.tar.gz
解压内核源码,进入到源码目录(注意:源码必须放在不含中文的目录下,否则make APDK6410_defconfig是不能正确执行的)
在源码目录执行 $ make APDK6410_defconfig命令(此命令将arch/arm/configs下面的APDK6410_defconfig拷贝到源码目录并命名 为.config,这样在编译时就正确运用了APDK6410的对应配置)
查看源码目录的.cross_compile文件,可见有如下内容:
/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
我们刚好将编译器装在了对应的位置,如果当时没有装在这个对应的位置,就要更改此文件内容,确保路径是一致的。
编译内核:在源码目录下执行make
获得结果:在arch/arm/boot下生成了zImage文件,这就是我们所需要的内核。
测试:将内核烧录到开发板上,重启开发板,正常进入系统,测试成功
注:配置文件已经默认增加了对nfs的支持,配置信息如下:
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_NFS_DIRECTIO=y
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y
CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=m
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
五、程序调试方法
1.在PC上安装、配置、启动NFS服务
$sudo apt-get install nfs-kernel-server portmap
修改其配置文件/etc/exports,在里面增加以下内容:
/work/nfs_root *(rw, sync, no_root_squash)
那以后就可以通过网络文件系统访问以上目录了
修改完后保存退出,重启NFS服务:
$sudo /etc/init.d/nfs-kernel-server restart
2.在开发板上启动系统后(网络已经通过配置文件设置好了,可以自行个更改不同的IP)
在开发板的系统上执行命令: mount -o nolock 192.168.0.*:/work/nfs_root /mnt
这样就将IP为192.168.0.*的PC上的/work/nfs_root目录mount到了开发板系统的/mnt目录
3.完成以上操作就可以随时调试自己交叉编译出来的程序了
【zz】http://blog.chinaunix.net/u3/96294/showart_1984736.html