uboot编译平台环境:64位win8.1的虚拟机vmware10下的ubuntu-12.04.5-64bit
交叉编译工具链为: arm-linux-gcc-4.5.1
uboot压缩包: uboot_tiny4412-20130729.tgz
linux压缩包: linux-3.5-20131028.tgz
busybox压缩包: busybox-1.17.2-20101120.tgz
一、Build uboot
配置并且编译出uboot.bin
解压:
book@book-virtual-machine:/work/tiny4412$ tar -xzf uboot_tiny4412-20130729.tgz
进入解压出来的uboot_tiny4412文件夹:
book@book-virtual-machine:/work/tiny4412$ cd uboot_tiny4412
配置tiny4412config:
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412$ make tiny4412_config
编译:
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412$ make
编译生bl2的工具
进入sd_fuse文件夹:
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412$ cd sd_fuse/
编译:
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412/sd_fuse$ make
make成功会出现以下红框内的两行
二、制作SD卡用来启动uboot
使用的SD卡:SanDISK的SDCH卡(8G)
注:制作SD卡时,SD卡里原有的数据会被损坏,如果SD卡里面包含需要的文件,需要先备份
1)SD卡分区与格式化
下载mkcard.sh脚本,并将其拷贝到/usr/local/bin目录下,使它可以在其它目录里使用;
mkcard.sh脚本下载地址:
http://download.csdn.net/detail/q1302182594/9621827
对SD卡进行分区和格式化,具体可以参考这篇博客《OMAPL138开发板SD系统启动卡制作方法》,完成后会生成boot和rootfs两个分区;
博客地址是:
http://blog.csdn.net/u012091895/article/details/11584869
2)将uboot烧写到SD卡
使用的SD卡被USB识别为/dev/sdc
如何让linux识别到SD卡:
将SD卡放入读卡器,将读卡器插入PC前,将虚拟机ubuntu放在窗口最前面,并将鼠标放在窗口上,插入U盘。U盘正确识别后,会出现/dev/sdc这一行设备文件
运行如下命令:
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412/sd_fuse/tiny4412$ sudo ./sd_fusing.sh /dev/sdc
SD卡制作好后出现的界面:
完成后卸载/dev/sdc
book@book-virtual-machine:/work/tiny4412/uboot_tiny4412/sd_fuse/tiny4412$umount /dev/sdc
注:如果使用df命令没有查看到/dev/sdc,可以使用”ls /dev/sd*”命令查看没有,如果存在则说明没有挂载。没有挂载也可以正常制作SD卡的,只要使用”ls /dev/sd*”命令查看到/dev/sdc。SD卡制作完成后也不需要umount(如下图,会显示/dev/sdc没有挂载),直接拔读卡器就可以了
1)卸将已经制作好的SD卡插到Tiny4412板子上,拨动S2切换到SDBOOT,同时连接串口线到PC
Ps:我的板子有两个九针串口,只有连在靠近电源的那个串口才可以正常打印信息
如何查看打印的信息来判断板子是否正常被启动?
答:通过linux下的minicom,具体的安装和使用参看下面的链接:
http://blog.csdn.net/zy799894671/article/details/16846817
2)开发板上电,然后在串口控制台(minicom)查看打印信息如下:
出现错误是因为没有烧写内核进去,暂时不管。
按任意键进入uboot命令行模式,出现”TINY4412 #”
三、使用SD卡启动linux系统
book@book-virtual-machine:/work/tiny4412/contex-a9$tar zxvf linux-3.5-20131028.tgz
book@book-virtual-machine:/work/tiny4412/contex-a9$cd linux-3.5/
book@book-virtual-machine:/work/tiny4412/contex-a9/linux-3.5$ cp tiny4412_linux_defconfig .config
book@book-virtual-machine:/work/tiny4412/contex-a9/linux-3.5$make
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
在book@book-virtual-machine:/work/tiny4412/linux-3.5/arch/arm/boot目录下生成zImage这个镜像文件
内核拷贝到SD卡
book@book-virtual-machine:/work/tiny4412/contex-a9/linux-3.5$ cp arch/arm/boot/zImage /media/boot
四、设置NFS服务
1)在ubuntu12.04上安装NFS Server
book@book-virtual-machine:/work/nfs_root$ sudo apt-get install portmap
book@book-virtual-machine:/work/nfs_root$ sudo apt-get install nfs-kernel-server
book@book-virtual-machine:/work/nfs_root$ sudo apt-get install nfs-common
2)修改/etc/exports文件
book@book-virtual-machine:/work/nfs_root$ sudo vi /etc/exports
在文件的末尾添加这一句:
/work/nfs_root *(rw,sync,no_root_squash,no_subtree_check)
格式说明:
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限。
注意,*和后面的括号不能出现空格。
然后保存退出。
3)重启NFS服务
book@book-virtual-machine:/work/nfs_root$ sudo /etc/init.d/portmap restart
book@book-virtual-machine:/work/nfs_root$ sudo /etc/init.d/nfs-kernel-server restart
4)测试NFS服务是否成功
把本地的文件夹挂载到mnt上
book@book-virtual-machine:/work/nfs_root$ sudo mount -t nfs localhost:/work/nfs_root /mnt
在nfs_root文件目录下创建一个新的文件“hello”,在mnt文件目录下可查看到“hello”,说明挂载成功
取消挂载
book@book-virtual-machine:/work/nfs_root$ sudo umount /mnt
NFS服务设置完成
五、安装busybox
book@book-virtual-machine:/work/nfs_root$ mkdir filesystem
book@book-virtual-machine:/work$ tar -xzvf busybox-1.17.2-20101120.tgz
book@book-virtual-machine:/work$ cd busybox-1.17.2/
book@book-virtual-machine:/work/busybox-1.17.2$ make menuconfig
配置:
配置完成后,编译和安装busybox:
book@book-virtual-machine:/work/busybox-1.17.2$ make
book@book-virtual-machine:/work/busybox-1.17.2$ make install
成功安装后会在/work/nfs_root/filesystem下生成一下四个文件:
bin
linuxrc
sbin
usr
检测busybox是否成功
book@book-virtual-machine:/work/nfs_root/filesystem$ file bin/busybox
bin/busybox: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
上面显示ARM平台运行,说明安装成功
六、制作根文件系统
book@book-virtual-machine:/work/nfs_root/filesystem$ mkdir etc dev opt sys tmp mnt lib proc
book@book-virtual-machine:/work/nfs_root/filesystem$ mkdir etc/init.d
book@book-virtual-machine:/work/nfs_root/filesystem$ vi etc/init.d/rcS
在rcS里添加如下内容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/mount -a # 挂载fstab文件中所有指定的文件系统
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s # 在/dev目录下建立必须的设备节点
/bin/hostname -F /etc/sysconfig/HOSTNAME #设置主机的名字
保存退出
book@book-virtual-machine:/work/nfs_root/filesystem$vi etc/inittab
在inittab里添加如下内容:
::sysinit:/etc/init.d/rcS# 设置内核的热插拔,有mdev接收来自内核的消息并做出响应
ttySAC0::askfirst:-/bin/sh # 在串口启动一个登陆会话
:ctrlaltdel:/bin/umount -a -r# 作为init重启执行程序
::showdown:/bin/mount -a -r# 告诉init在关机时运行umount命令卸载所有文件系统,
如果卸载失败,以只读方式重新挂载
保存退出
book@book-virtual-machine:/work/nfs_root/filesystem$vi etc/fstab
在fstab里添加如下内容:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
保存退出
注意:
第一列是挂载设备
第二列是挂载目录
第三列是挂载文件系统类型
第四列是挂载选项
book@book-virtual-machine:/work/nfs_root/filesystem$ vi etc/profile
在profile里添加如下内容:
#/etc/profile:system-wide .profile file for the Bourne shells
#!/bin/sh
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[root@tiny4412]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
保存退出
book@book-virtual-machine:/work/nfs_root/filesystem$ sudo chmod +x rcS//rcS添加权限,让其可执行
创建设备文件:
book@book-virtual-machine:/work/nfs_root/filesystem$ sudo mknod /dev/console c 5 1
完善动态链接库:
(1)我们在busybox设置的是动态链接库,而且编译器是arm-linux-gcc,找到安装arm-linux-gcc的安装路径
book@book-virtual-machine:/work/nfs_root/filesystem$ which arm-linux-gcc
/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
上面是我的路径,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,这个就是要复制出来的动态库的路径,把里面的动态链接文件复制到filesystem文件夹下
(2)复制动态链接文件book@book-virtual-machine:/work/nfs_root/filesystem$ cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib -r
简单小结一下:
1. inittab,rcS,fstab关系
系统启动挂载文件系统--->
--->读取/etc/inittab文件,解析其中定义的动作
--->根据sysinit定义的process执行/etc/init.d/rcS
--->/etc/init.d/rcS中第一条命令 mount -a
--->读取/etc/fstab文件
--->根据文件列表内容逐个挂载其中的设备到指定地
2.profile文件
设置环境变量,根据这里设置命令提示符号相关的环境变量
用户可以根据自己需要添加环境变量
3./etc/init.d/rcS
执行系统初始化时候,想开机启动的程序都可以写在这个文件中
七、在uboot中设置参数和启动命令
TINY4412# set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.123:/work/nfs_root/filesystem ip=192.168.1.17:192.168.1.123:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
格式说明:bootargs noinitrd root=/dev/nfs nfsroot=虚拟机linux系统ip:根文件系统绝对路径 ip=开发板ip:虚拟机linux系统ip:网关:子网掩码::开发板的网卡设备名(一般是eth0,不是虚拟机):off init=/linuxrc console=ttySAC0
TINY4412# set bootcmd fatload mmc 0:1 0x40008000 zImage;bootm 0x40008000TINY4412# save
八、挂载根文件系统
1)虚拟机、PC、开发板三者互ping成功(三者必须处于同一网段,如192.168.1.xxx)
2)启动开发板
linux系统成功启动,出现“Please press Enter to activate this console”:
网络根文件系统挂载成功:
到这里,从启动uboot,引导linux内核,到挂载网络根文件系统,整个开发环境的搭建就成功了!