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

本文详述了在Ubuntu环境下编译Bootloader、Linux内核及构建根文件系统的全过程,包括U-boot与Linux内核的编译配置,以及使用buildroot构建QT根文件系统的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译Bootloader

打开Ubuntu系统终端,进入Bootloader 目录,解压U-boot 源码到u-boot-xlnx目录

$ cd <WORK>/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文件移动到<WORK>/sd_image/boot_build目录

删除包u-boot-xlnx.tar.bz2

编译Linux内核

进入 Kernel 目录,解压内核源码:

$ cd <WORK>/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个文件拷贝到<WORK>/sd_image目录,并把设备树文件重命名为devicetree.dtb

linux-xlnx根目录是Linux内核包含驱动及设备树,开发过程中需要添加、修改。完成驱动后,添加驱动信息到arch/arm/configs/zynq_myd_defconfig文件里,然后再次make一遍(不需要distclean)

删除包linux-xlnx.tar.bz2

构建QT 根文件系统

使用buildroot 来构建根文件系统。首先进入文件系统Filesystem目录,解压buildroot 源码:

$ cd <WORKDIR>/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 选项,填入编译器路径:

<WORK>/Toolchain/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux

修改保存后退出配置,开始编译:

$ make

编译耗时非常长,大约1小时 ,等待!编译完成之后将在“buildroot-2015.02/output/images”目录内生产rootfs.tar 文件 ,将rootfs.tar文件移动到<WORK>/sd_image目录

删除包buildroot-2015.02.tar.bz2

修改根文件系统

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

在<WORK>/sd_image目录将生成更新的rootfs.tar文件

修改 Ramdisk 文件系统

Ramdisk 主要作为烧写QSPI,eMMC 时使用。

(1) 挂载Ramdisk

新建目录tmp,并将uramdisk.image.gz 拷贝至该目录

$ cd <WORK>/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文件拷贝到<WORK>/sd_image目录,删除tmp目录

本节结束。

 

### 构建和配置 Zynq 平台上的 Linux 系统 要在 Zynq 平台上成功构建和配置 Linux 系统,通常需要完成以下几个方面的操作: #### 1. 使用 PetaLinux 工具链创建基础系统 PetaLinux 是 Xilinx 提供的一个工具集,专门用于简化基于 Zynq嵌入式 Linux 开发过程。通过该工具可以快速生成定制化的 Linux 文件系统。 运行以下命令来配置并构建根文件系统: ```bash petalinux-config -c rootfs && petalinux-build ``` 此命令会启动图形化界面让用户自定义所需软件包以及调整其他设置[^2]。 #### 2. 配置实时操作系统 Xenomai (可选) 如果项目需求涉及严格的实时响应,则可以在标准 Linux 内核之上安装 Xenomai 实现硬实时特性支持。这一步骤对于某些工业控制应用尤为重要。 为此目的,在 zynq 嵌入式环境中部署 xenomai 可显著提升系统的实时表现能力[^1]。 #### 3. 利用 Debootstrap 和 QEMU 创建 ARM 根文件系统(备用方案) 当不采用 PetaLinux 方法时,另一种常见做法就是借助 `debootstrap` 脚本来建立 Debian 或 Ubuntu 类型的基础环境;与此同时还需要利用 `qemu-user-static` 来模拟目标架构下的动态链接库加载行为以便顺利完成交叉编译流程中的依赖关系解析工作。 具体步骤如下所示: ```bash apt install qemu-user-static apt install debootstrap ``` 这些工具允许开发者手动构造适合特定硬件平台的 GNU/Linux 发行版实例[^3]。 #### 4. 设备树编辑与网络功能启用 针对以太网模块部分,Xilinx 官方已经预先准备好了相应的驱动组件,因此重点应该放在正确填写 DTB(Device Tree Blob) 文档里关于 PHY 层面的各项参数上面。深入研究 Ethernet PHY 子系统的内部机制有助于更全面掌握整个 Linux 下设备管理框架的工作原理——即所谓的 MDIO 总线概念及其关联对象如物理层芯片实体代表节点、对应的控制器驱动程序等等[^4]。 以下是简单的 Python 示例代码片段展示如何读取 MAC 地址信息作为额外补充说明材料之一: ```python def get_mac_address(interface='eth0'): try: with open(f'/sys/class/net/{interface}/address') as f: mac = f.read().strip() return mac except Exception as e: print(e) if __name__ == "__main__": interface_name = 'eth0' result = get_mac_address(interface=interface_name) if result is not None: print(f"The MAC address of {interface_name} is {result}.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值