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

zybo开发板linux作业系统移植

2018-01-23 20:55 507 查看
摘要

文章主要介紹zybo board上linux作业系统移植过程。分别介绍了开发环境搭建、U-boot编译、linux内核编译、busybox制作等流程及注意事项。文章使用的开发板是zynq 7000系列的zybo board(开发板照片在文章后面)。Vivado版本是2015.1.主机系统是Debian 9.

1.开发环境搭建

工欲善其事必先利其器,做开发前搭建好编译环境是重要的一步,这些步骤大体上都相同,然而对于不同的系统平台、硬件平台,环境的搭建也会有些差别,因人而异。有些问题只能根据错误提示去需找解决方案。虽然网上大多推荐使用ubuntu LTS作为开发环境,但是我还是倾向使用Debian系统,因为Debian稳定。在Debian 9系统上,要安装一些依赖包,否则无法进行下面的工作,因为在我的机器上我遇到了这些问题,至于其他的机器是什么情况,我就无法得知了。

首先安装以下软件包:

apt install gcc-multilib libmpfr-dev bc


在我的机器上,如果不安装gcc-multilib的话进行CROSS_COMPILE时会提示找不到相关的编译器,比如说找不到arm-xilinx-linux-gnueabi-gcc.没有安装bc时在编译uImage时会报错。

/bin/sh: 1: bc: not found


同时,如果机器上没有装u-boot-tools的话也要记得先安装。

apt install u-boot-tools


很多教程会说使用source命令去获取xilinx-arm toolchain的路径,但是在我的机器上这是一个坑,因为执行完命令:

source /opt/Xilinx/Vivado/2015.1/settings64.sh


进行编译u-boot时报错:arm-xilinx-linux-gnueabi-gcc: Command not found

所以推荐的方法是手动添加路径:

nano ~/.profile


在里面添加:

export PATH=$PATH:/opt/Xilinx/SDK/2015.1/gnu/arm/lin/bin

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

export ARCH=arm

# 建议ARCH变量使用使用时自己指定较好,不用默认为arm。在make时加上ARCH=arm


然后执行

huang@debian ~ $ source ~/.profile


当然,在/etc/proflie里修改也行。

1.U-boot编译

首先下载DigilentInc的 U-boot 版本,地址在这里,注意要选择master-next分支.当然用git命令更方便

git clone https://github.com/DigilentInc/u-boot-Digilent-Dev.git -b master-next


然后进入u-boot-Digilent-Dev目录,编译时使用CROSS_COMPILE选择交叉编译器。

CROSS_COMPILE=arm-xilinx-linux-gnueabi- make zynq_zybo_config
CROSS_COMPILE=arm-xilinx-linux-gnueabi- make -j2


编译完成后,在u-boot-DIgilent-Dev根目录下生成一个u-boot文档,这就是开发板需要用到的可执行文件。由于xilinx只能识别.elf后缀名的可执行文件,所以要把u-boot该名为u-boot.elf

cp -v u-boot u-boot.elf


2.Linux kernel编译

接下来编译linux kernel.同样在github上下载DigilentInc的linux kernel版本,下载地址在这里同样要选择master-next分支。或者使用git命令更方便

git clone https://github.com/DigilentInc/Linux-Digilent-Dev -b master-next


下载完成后进入Linux-Digilent-Dev目录编译。

ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make xilinx_zynq_def
b444
config
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make -j2
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make UIMAGE_LOADADDR=0x8000 uImage
ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make zynq-zybo.dtb


完成后会生成我们需要的uImage和zybo的设备树文件zynq-zybo.dtb

uImage文件在arch/arm/boot/uImage

我还试了另一种制作uImage的方法,同样也能工作;所以如果第一种方法不行时可以考虑用第二种方法。

mkimage -n 'arm-linux' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage

#地址可以根据实际情况.
#mkimage命令在u-boot-Digilent-Dev/tools/下面执行,如果提示找不到命令可以切换到此目录下面操作。


zynq-zybo.dtb文件在arch/arm/boot/dts/zynq-zybo.dtb

此外需要将zynq-zybo.dtb重命名为devicetree.dtb

cp -v zynq-zybo.dtb devicetree.dtb


3.BusyBox制作

Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统,例如Linux,包括Android、Hurd、FreeBSD等等。BusyBox可以被自定义化以提供一个超过两百种功能的子集。它可以提供多数详列在单一UNIX规范里的功能,以及许多用户会想在Linux系统上看到的功能。BusyBox使用ash。在 BusyBox的网站上可以找到所有功能的列表。——摘自维基百科

下载BusyBox的源代码:

git clone git://git.busybox.net/busybox -b 1_28_stable


在这里选择1_28_stable较新的分支,当然,也可以下载其他分支。

接下来进行BusyBox的配置,跟配置linux kernel时差不多。这里使用menuconfig配置

ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make menuconfig


当然,如果使用menuconfig配置出现错误时可能是你的电脑系统没有装libncurses5-dev库,对于Debian系统可以使用下面的命令来安装。

apt-get install libncurses5-dev


设定完成后开始进行编译

ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make -j2


然后使用make install命令把编译出来的BusyBox安装到默认的_install文件夹里。

ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- make install


进入_install文件夹里建立一些缺失的文件夹,文件夹的建立遵循FHS标准。

cd _install
mkdir -p dev proc sys root etc/init.d home mnt opt var lib tmp


这看起来和一个完整的linux文件夹很像吧。当然,可以根据具体项目需要建立这些文件夹,这里建立的文件夹只是一个参考。

接下来创建 etc/init.d/rcS 作为系统的启动脚本

nano etc/init.d/rcS

#在里面添加以下内容

#Begin /etc/init.d/rcS

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
mount -a
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs -o mode=0755 tmpfs /dev  // dev目录为tmpfs文件系统目录
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
mkdir /var/log
/bin/hostname yourhostname
export PATH runlevel

#End /etc/init.d/rcS


然后为rcS添加可执行权限

chmod +x etc/init.d/rcS


再建立 etc/inittab 文件

nano etc/inittab
#在里面添加以下内容
#Begin /etc/inittab

#!/bin/sh
#Init script
::sysinit:/etc/init.d/rcS
#Start shell on the serial ports
::respawn:/sbin/getty -L ttyPS0 115200 vt100
#What to do when restarting the init process
::restart:/sbin/init
#What to do before rebooting
::shutdown:/bin/umount -a -r

#End /etc/inittab


添加/etc/profile文件

nano /etc/profile
#Begin /etc/profile

#Ash profile
#vi:syntax=sh
#No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]#'
PATH=$PATH
HOSTNAME=`/bin/hostname`
echo "Processing /etc/profile..."
echo "Done"
export PATH USER LOGNAME PS1

#End /etc/profile


设定一个 etc/passwd 文件,这样可以免去输入root的密码

nano etc/passwd
#在里面添加以下内容

#Begin /etc/passwd

root::0:0:root:/root:/bin/sh

#End /etc/passwd


建立 /init 并软链接到 /sbin/init ,避免 Linux Kernel 开机时找不到 rootfs 的 init。

ln -s /sbin/init init


从交叉编译工具链复制一些文件到相应目录下,工具链名叫CodeSourcery,自己下载,假设此工具链文件夾放在我的用戶根目录下。

cp -rf ~/CodeSourcery-master/arm-xilinx-linux-gnueabi/libc/lib ./lib
cp -rf ~/CodeSourcery-master/arm-xilinx-linux-gnueabi/libc/usr/bin ./usr/bin


把编译出来的rootfs打包成cpio格式

find . | sudo cpio -H newc -o | gzip -9 > ../uramdisk.cpio.gz


之后再通过 mkimage 將 uramdisk.cpio.gz 文件转成 uboot 使用的 uramdisk.image.gz

mkimage -A arm -T ramdisk -C gzip -d ../uramdisk.cpio.gz ../uramdisk.image.gz




这个生成的uramdisk.image.gz是我们需要的文件,之后把BOOT.bin,uramdisk.image.gz,devicetree.dtb,uImage复制到sd卡的第一个分区里。



5.启动系统

最后把复制好文件的SD卡插入开发板卡槽,通电后检查是否正常。开发板上电后如果上面的Done指示灯亮,如下图,证明上面制作的文件是可以启动的:



注意:我的zybo开发板设置使用USB1,也有些使用USB0,可以使用命令

ls /dev/ttyUSB


按Tab键查看有多少个USB口,然后选择合适的。比如我的机器是ttyUSB1



然后在终端输入:

sudo minicom -D /dev/ttyUSB1


启动成功后大概是这样的:



6.结语

文章到此已经讲解完本次的linux系统移值过程,包括开发环境搭建,内核编译,uboot编译,BusyBox制作,相信读者自己动手,参考教程走完一遍流程的话会对所学过的知识有更进一步的了解。我认为学以致用是比较好的学习方式。由于这是我第一次接触zynq系列的开发板,所以也有很多不完善的地方,如果有文章有错误或读者有疑问的地方,欢迎留言。也可以邮箱联系我,我会及时更新文章。我的联系方式在下面。

7.引用

[1].zybo board 開發記錄: 執行 Linux 作業系統

[2].维基百科.BusyBox
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐