最近买了一个pcduino,看起来硬件配置不错,有1G的主频。官方发布了他们做的系统,用起来像个电脑,体验一般但是用来开发和实现创意想法,还是很不错的。图形化界面,里面还是装了很多驱动和应用,速度上有些慢。我打算将来移植QT和Opencv,运行图像处理算法和这方面的验证性试验,这个做好的系统显得太冗余,我想做个最小的系统,以后需要什么驱动在往里面添加。顺便学学整个系统的构架,搞懂了发布最后的镜像文件。二来我觉得这样最精简的系统,跑图像处理算法会更快些。
网上也已经有网友发布了一系列文章,来讲解pcduino的移植,我也是更具这位网友的文章移植内核的,使用起来基本没有什么问题,但是有些细节我也不太明白。这文章就是解释这些细节,以及我遇到的一些问题。下面是这个网友的网站地址:
http://blog.csdn.net/u010216127/article/category/1387771
第一阶段编译UBOOT,Kernel,Rootfs
开发环境:ubuntu12.04
硬件:PCduino,Cortex_A8,主频1G
编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
UBOOT源码地址https://github.com/pcduino/kernel
交叉编译器地址http://code.google.com/p/smp-on-qemu/downloads/list
我用的各个源码都是pcduino光盘里面自带的,网上也有,可能版本或有不同,请结合其他文章参考。
1.1.1开发环境搭建
解压交叉编译器
Sudo bunzip2 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Sudo tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
添加编译器路径的环境变量
Sudo vim /etc/environment
在PAHT里面添加“;/…./arm-2009q3/bin”我在这里写的是省略号,请根据自己的解压路径填写完整。
如果解压和环境变量填写完整使用如下命令可以验证
Sudo arm-none-linux-gnueabi-gcc –v
这个命令是显示gcc编译器的版本信息的,我的打印信息如下
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
如果没有显示请sudo source /etc/environment 确保环境变量被更新。至于64位系统还要安装一个库文件请参考网友的文章。
1.1.2编译UBOOT
解压UBOOT
Sudo unzip u-boot-sunxi-sunxi.zip
Sudo cd u-boot-sunxi-sunxi
Sudo make pcduino CROSS_COMPILE=arm-none-linux-gnueabi-
需要编译一段时间,编译顺利结束的话,会生成第一阶段/spl/sunxi-spl.bin 、第二阶段 /u-boot.bin
1.1.3编译内核源码
解压内核源码,网上同样有,我用的内核源码是pcduino是光盘自带的,解压到自己定义的目录,并打开进入源码目录
Sudo cd /pcduino_file/kernel/kernel/linux-sunxi/linux-sunxi-sunxi-3.0
Sudo ls
Android.mk CREDITS fs Kconfig mm REPORTING-BUGS sound vmlinux arch crypto include kernel modules rootfs System.map vmlinux.o block Documentation init lib Module.symvers samples tools build.sh drivers ipc MAINTAINERS net scripts usr COPYING firmware Kbuild Makefile README security virt
设置配置文件
Sudo make ARCH=arm sun4i_defconfig
#
# configuration written to .config
#
进入图形化配置界面,注意终端界面尺寸要够大,否则进入不了配置界面。
Sudo make ARCH=arm menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
保存退出即可,若执行make menuconfig报错,需要安装屏幕绘制动态库,安装过程
Sudo apt-get install libncurses5
这里是调整一些内核配置,根据自己的要求修改。
编译内核源码
Sudo make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
打印文字如下说明编译成功
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.0.62
Created: Sat Apr 20 18:33:26 2013
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4693068 Bytes = 4583.07 kB = 4.48 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
在arch/arm/boot/文件夹下生成内核文件,因为我没有添加其他驱动所以编译得到的内核很小才4.5MB左右,由此看来linux系统很是短小精干哪。这里我只是先把最小的系统搭起来,驱动的添加以后肯定还要修改。
1.1.4制作根文件系统
移植根文件系统首先需要安装busybox
获取源码在:http://www.busybox.net/ 点击BusyBox 1.21.0下载源码,解压到工作目录并进入该目录
Sudo make menuconfig
先采取默认配置,不行在改回来在配置界面里面把builid option 把 Build BusyBox as astatic binary (no shared libs) 把这个选上
修改Makefile文件里面的编译器名字和平台名字
Sudo vim Makefile
修改:
164:CROSS_COMPILE ?= arm-none-linux-gnueabi-
190:ARCH ?= arm
保存退出开始编译
Sudo make
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
编译结束安装到指定位置
Sudo make CONFIG_PREFIX=../rootfs install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
安装过程完成,安装在上面新建的rootfs目录
打开安装好的rootfs目录
Sudo cd ../rootfs
创建设备文件
Sudo mkdir dev
Sudo cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
构建配置文件inittab,inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。系统的第一个进程init会读取这个配置文件
这里是直接拷贝busybox的
Sudo cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r
Sudo vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:~/bin/sh
保存退出
::sysinit:/etc/init.d/rcS 告诉程序运行/etc/init.d/rcS脚本来初始化系统
配置fstab文件,这个文件是配置了系统在启动时挂载文件系统和存储设备它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。
Sudo vim etc/fstab
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
保存退出
安装glibc库,在rootfs目录下,可以看到制作的几个根目录文件 sudo ls
bin dev etc inittab inuxrc sbin usr
sudo mkdir –p lib
打开交叉编译器的解压文件,拷贝系统运行所需要的库文件到自己制作的根文件系统里
Sudo cd /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib
Sudo cp *.so* /pcduino_file/rootfs/rootfs/lib –d
Sudo /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /pcduino_file/rootfs/rootfs/lib –d
这时候UBOOT, uImage, rootfs都已经制作好了,pcduino支持tf卡启动系统,下面要完成的工作就是把这些编译好的UBOOT二进制文件,uImage,rootfs 部署到tf卡中,这样板卡在启动的时候,就可以按照约定读取UBOOT,启动内核,挂载文件系统了。