开发环境:
单板:TINY4412-1611
系统:Ubuntu 16.04 64位
编译工具链:arm-linux-gcc-4.3.2
uboot版本:uboot_tiny4412-20130729
内核版本:linux-3.5-20170221
busybox版本:busybox-1.20.0
【注】本文只用于移植,不会讲解其中原理。若读者希望了解其中原理,请阅读《嵌入式linux应用开发完全手册》。
一、下载源码和必需文件
百度网盘链接(提供了友善之臂光盘的文件系统,但是本博客使用的是网络文件系统):
https://pan.baidu.com/s/1lYkkP2eT5qxjYbxJ7-jLvw
提取码为:g6yy
二、安装arm-linux-gcc-4.3.2
解压arm-linux-gcc-4.3.2到/usr/local/目录:
$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /
设置环境变量,在/etc/environment文件中添加:/usr/local/arm/4.3.2/bin,更改完成后如下图:
$ sudo vim /etc/environment
$ sudo source /etc/environment
查看是否安装成功:
$ arm-linux-gcc -v
三、编译uboot_tiny4412-20130729
将百度网盘中文件夹下的所有文件放在某一目录(笔者目录为/work/tiny4412/tools/),解压uboot并打补丁:
$ tar xzf uboot_tiny4412-20130729.tgz
$ cd uboot_tiny4412/
$ patch -p1 < ../tiny4412_lioker.patch
完成后如下图:
编译:
$ make tiny4412_config
$ make
完成后会在当前目录下生成u-boot.bin
四、编译linux-3.5-20170221
解压linux-3.5:
$ cd ../
$ tar xzf linux-3.5-20170221.tgz
$ cd linux-3.5/
配置:
$ sudo cp ../uboot_tiny4412/tools/mkimage /usr/bin/mkimage
$ sudo chmod 777 /usr/bin/mkimage
$ cp tiny4412_linux_defconfig .config
$ make menuconfig
【注】如果make menuconfig时报错,如make[1]: *** [menuconfig] Segmentation fault (core dumped),那么需要执行sudo apt-get install libncurses*
成功后如下图,我们可以通过方向键控制,按空格键选中或取消选中(也就是[*]或[ ]),按回车进入下一级
我们需要在此基础上进行修改,打开以下选项:
Kernel hacking --->
[*] Kernel low-level debugging functions (read help!)
Kernel low-level debugging port (Use S3C UART 0 for low-level debug)
(X) Use S3C UART 0 for low-level debug
保存后退出
修改kernel/timeconst.pl文件,否则编译过程会出现如下错误:
修改kernel/timeconst.pl文件373行如下图所示:
编译:
$ make -j4
完成后会在arch/arm/boot目录中生成我们需要的zImage文件
五、编译busybox-1.20.0,创建文件系统
配置busybox-1.20.0:
$ cd ../
$ tar -xvf busybox-1.20.0.tar.bz2
$ cd busybox-1.20.0/
$ make defconfig
$ make menuconfig
打开以下选项,设置如下图所示:
BusyboxSettings --->
Build Options --->
保存后退出
编译:
$ make -j4
$ make install
完成后会在busybox-1.20.0目录下生成_install目录
制作文件系统:
$ cd /work/tiny4412/
$ mkdir fs
$ cd fs/
$ mkdir etc dev opt sys tmp mnt lib proc
$ mkdir etc/init.d
$ mkdir dev/pts
$ vim etc/init.d/rcS
添加:
mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
保存后退出,完成后如下图:
$ vim etc/inittab
添加:
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
保存后退出,完成后如下图:
$ vim etc/profile
添加:
export PS1="[root @ lioker \W ] #"
保存后退出,完成后如下图:
$ vim etc/fstab
添加:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
保存后退出,完成后如下图:
创建命令行设备和空设备:
$ sudo mknod dev/console c 5 1
$ sudo mknod dev/null c 1 3
构造lib:
$ cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/* ./lib -r
设置权限并允许挂接:
$ cd ../
$ chmod 777 fs -R
$ sudo vim /etc/exports
添加:
/work/tiny4412/fs *(rw,sync,no_root_squash)
保存后退出,完成后如下图:
重启nfs服务并测试是否可以挂接:
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo mount -t nfs 127.0.0.1:/work/tiny4412/fs /mnt
完成后如下图:
取消挂接:
$ sudo umount /mnt