Zynq研发(6)——嵌入式Linux系统编译及制作

2019-07-12 16:28发布

编译Bootloader

打开Ubuntu系统终端,进入Bootloader 目录,解压U-boot 源码到u-boot-xlnx目录 $ cd /Bootloader $ tar -jxvf u-boot-xlnx.tar.bz2 虚拟机里直接提取到此处,然后进入文件夹 $ cd u-boot-xlnx 开始编译 $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- distclean $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_myd_config $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_myd_config是核心板的配置文件 编译需要一段时间,子系统比虚拟机里编译时间更长。编译完成后,在当前目录下会生成“u-boot”ELF 文件。使用此镜像制作 boot.bin时需要重命名为“u-boot.elf”: cp u-boot ../u-boot.elf 把u-boot.elf文件移动到/sd_image/boot_build目录 删除包u-boot-xlnx.tar.bz2

编译Linux内核

进入 Kernel 目录,解压内核源码: $ cd /Kernel $ tar -jxvf linux-xlnx.tar.bz2 虚拟机直接解压,然后进入文件夹 $ cd linux-xlnx 开始编译: $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- distclean $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_myd_defconfig $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- dtbs 我的机器在虚拟机里编译需要约7分钟,而在Linux子系统编译时间非常长(最终放弃编译,估计是在64位系统用32位模拟器运行的原因)。编译完成后,会在arch/arm/boot 目录下生成Linux内核镜像文件uImage;在arch/arm/boot/dts/生成设备树文件zynq-myd.dtb,将这2个文件拷贝到/sd_image目录,并把设备树文件重命名为devicetree.dtb linux-xlnx根目录是Linux内核包含驱动及设备树,开发过程中需要添加、修改。完成驱动后,添加驱动信息到arch/arm/configs/zynq_myd_defconfig文件里,然后再次make一遍(不需要distclean) 删除包linux-xlnx.tar.bz2

构建QT 根文件系统

使用buildroot 来构建根文件系统。首先进入文件系统Filesystem目录,解压buildroot 源码: $ cd /Filesystem $ tar -jxvf buildroot-2015.02.tar.bz2 $ cd buildroot-2015.02 将目录中的zynq_myd_config 文件复制为新的.config文件(显示隐藏文件): $ cp zynq_myd_config .config 配置buildroot: $ make menuconfig 设置交叉编译工具路径:
Toolchain ---> () Toolchain path
进入Toolchain path 选项,填入编译器路径:
/Toolchain/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux
修改保存后退出配置,开始编译: $ make 编译耗时非常长,大约1小时 ,等待!编译完成之后将在“buildroot-2015.02/output/images”目录内生产rootfs.tar 文件 ,将rootfs.tar文件移动到/sd_image目录 删除包buildroot-2015.02.tar.bz2

修改根文件系统

  1. 拆解rootfs包(只需要做一次),虚拟机不要直接解压提取(非root)
$ cd /sd_image $ mkdir -p rootfs $ sudo tar xvf rootfs.tar -C ./rootfs/
  1. 修改文件夹,加入新文件。添加用户应用程序及各种功能,如vsftpd(参考其他技术文档)
  2. 打包tar
$ cd ./rootfs $ sudo tar cvf ../rootfs.tar ./*/sd_image目录将生成更新的rootfs.tar文件

修改 Ramdisk 文件系统

Ramdisk 主要作为烧写QSPI,eMMC 时使用。 (1) 挂载Ramdisk 新建目录tmp,并将uramdisk.image.gz 拷贝至该目录 $ cd /Filesystem $ mkdir tmp $ cp uramdisk.image.gz tmp/ $ cd tmp/ 去掉mkimage 生成的64 bytes 的文件头,生成新的ramdisk.image.gz $ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=1 gunzip 解压ramdisk.image.gz 生成 ramdisk.image $ gunzip ramdisk.image.gz 新建挂载目录“ramdiskdir”,并将ramdisk.image 挂载 $ mkdir -p ramdiskdir $ sudo mount -o loop,rw ramdisk.image ramdiskdir (2) 进入ramdiskdir目录,根据需要做修改。 移植vsftpd见上一篇 (3) 重新生成ramdisk 同步文件系统并卸载ramdisk $ sync $ sudo umount ramdiskdir 用gzip 压缩 ramdisk.image,生成 ramdisk.image.gz $ gzip -9 ramdisk.image 用mkimage 添加文件头,生成新的 uramdisk.image.gz 供u-boot 使用 $ mkimage -A arm -T ramdisk -C gzip -n Ramdisk -d ramdisk.image.gz uramdisk.image.gz 删除临时文件 ramdisk.image.gz $ rm ramdisk.image.gz   说明:也可以用unpackfs.sh 脚本来解压。把unpackfs.sh拷贝到uramdksi.image.gz 所在的目录下,执行命令: $ ./unpackfs.sh uramdisk.image.gz 如提示sh文件没有权限,执行 $ chmod +x unpackfs.sh 该命令会将uramdisk.image.gz 解压并挂载到ramdiskdir 文件夹下。 如果用unpackfs.sh 脚本来解压,可以用packfs.sh脚本来打包。将packfs.sh 拷贝到uramdisk.image.gz 所在的目录下,执行命令打包: $ ./packfs.sh (4) 将uramdisk.image.gz文件拷贝到/sd_image目录,删除tmp目录 本节结束。