我们要生成四个文件:Linux启动需要4个文件:
1. boot.bin
2. device_tree.dtb
3. uImage
4. uramdisk.image.gz
a1.生成boot.bin文件需要:(生成boot.bin时,下面三个文件顺序不能错。)
(1)FSBL:第一级启动引导程序,选择Zynq FSBL模版,生成zynq_fsbl_0.elf
(2)system.bit:硬件比特流(硬件工程文件,有的命名为zynq_system_wrapper.bit)
(3)u-boot:u-boot.elf。 Linux Bootloader。 u-boot是用于多种嵌入式CPU的bootloader程序。体系结构:api,arch(u-boot支持的cpu架构,子目录arm使我们用到的),board(和已有开发板相关文件),common(u-boot命令行下支持的命令),disk,doc,drivers(u-boot支持的设备驱动程序),fs(支持的文件系统),include(头文件,对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。configs/zynq_common.h是我们开发板相关的文件),lib(与体系结构相关的库文件),net,tools(生成u-boot的工具,例如,mkimage,crc等,还包括Makefile和boards.cfg)
启动过程参考:
a2.device_tree.dtb
devicetree.dtb:Linux系统设备树文件,通过u-boot加载到内存。在运行时,构建系统硬件的设备树信息传递给内核,进行系统的启动运行。作为u-boot和Linux内核之间的动态接口。设备树的引入,减少内核对系统硬件的严重依赖,提高代码重用。并且加速了Linux支持包的开发。这样,使得单个内核镜像能支持多个系统,通过降低硬件所带来的需求变化和成本,降低对内核设计和编译的要求。使用设备树运行时配置的linux内核,它允许同一内核镜像可以在不同的硬件配置上运行(Linux kernel that use device for run-time configuration which allows the same kernel image to run on different hardware configurations)。
.dts是设备树源文件的格式
a3.uImage
uImage:Linux内核镜像,通过u-boot加载到内存。Linux源码采用汇编语言和C语言编写,了解内核源码的整体分布情况,有利于理解Linux如何组织各项功能的实现。arch(硬件体系结构,kernel,lib,mm,math-emu,boot), Documentation, drivers, fs, include, init, ipc(进程间通信), kernel, lib, mm, net, scripts, block, crypto, security, sound, usr.
a4.uramdisk.image.gz
uramdisk.image.gz:Linux文件系统,通过u-boot加载到内存。
文件系统是解决如何在存储设备上存储数据的一种方法,其中包括存储布局、文件命名、空间管理、安全控制等。Linux操作系统支持很多现代的流行文件系统,比如ext2、ext3和ramdisk。
1.构建交叉编译环境
(1)在网上下载: arm-2013.05-24-arm-none-linux-gnueabi-x86_64-linux-gnu.tar.bz2
(2)解压缩。我直接解压到/home/ds下,解压后路径“/home/ds/arm-2013.05”
(3)gedit /etc/environment
将PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
注释掉(或直接改更改),添加
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ds/arm-2013.05/bin"
“/home/ds/arm-2013.05/bin”这个根据你的版本决定。
这个操作可以使用户在root权限下使用arm-none-linux-gnueabi-
(4) gedit /etc/bash.bashrc
在最后添加:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ds/arm-2013.05/bin"
“/home/ds/arm-2013.05/bin”这个根据你的版本决定。
这个操作可以使非root用户使用arm-none-linux-gnueabi-
然后:
source /etc/bash.bashrc
立即生效
(5)arm-none-linux-gnueabi-gcc -v
打印出交叉编译器版本信息,证明设置系统环境成功。
2.编译U-Boot
(1)在/home/ds下建立新文件夹build(可以用mkdir build,也可以手动添加),cd 到build文件夹
(2)从网上下载“u-boot-xlnx-xilinx-v2015.1.zip”,解压到build文件夹里,并cd 到u-boot-xlnx-xilinx-v2015.1。(此时路径为“/home/ds/build/u-boot-xlnx-xilinx-v2015.1”)
(3)
sudo su
export CROSS_COMPILE=arm-none-linux-gnueabi-
make zynq_microzed_config
make//在根目录生成了u-boot(an elf file),u-boot.bin,和u-boot.srec。其中u-boot(an elf file)用于制作最后启动的Boot文件。
cp u-boot u-boot.elf //复制一下
然后参照: 或者陆佳华老师的《嵌入式系统软硬件协同设计实战指南》第九章,生成boot.bin文件。
3.编译uImage
(1)在网上下载:“ linux-xlnx-xilinx-v2015.1.zip”,解压到build,cd 到 linux-xlnx-xilinx-v2015.1 里。
(2)
sudo su
sudo apt install u-boot-tools
sudo apt install libncurses5-dev//防止make menuconfig时缺少这个库文件
(3)编译出来的目标是针对ARM体系结构的。因为是针对ARM体系结构,所以需要使用交叉编译器。
export CROSS_COMPILE=arm-none-linux-gnueabi-
make ARCH=arm xilinx_zynq_defconfig
make ARCH=arm menuconfig
make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
(6)打印出:
Image Name: Linux-3.18.0-xilinx
Created: Tue Jul 19 16:00:07 2016
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3477600 Bytes = 3396.09 kB = 3.32 MB
Load Address: 00008000
Entry Point: 00008000
Image arch/arm/boot/uImage is ready
4.创建设备树
(1)(注意这是linux-xlnx/arch/arm/boot/dts/目录下存在的dts文件才可以生成dtb文件,以下以zedboard为例)在Linux源代码目录下(我的是“/home/ds/build/linux-xlnx-xilinx-v2015.1”), 编译目标为”dtbs”时会把所有的dts文件编译成dtb文件,所有的dts文件和生成的dtb文件都位于linux-xlnx/arch/arm/boot/dts/目录下
cd 到linux-xlnx-xilinx-v2015.1下
make ARCH=arm dtbs
zynq-zed.dtb是我们需要的文件,改名为devicetree.dtb
如果只想生成zynq-zed.dtb,在linux源代码根目录输入以下命令即可
make ARCH=arm zynq-zed.dtb
或者用设备树编译器对dts文件进行编译生成:
apt-get install device-tree-compiler
cd /home/ds/build/linux-xlnx-xilinx-v2015.1/arch/arm/boot/dts
dtc -O dtb -I dts -o zynq-zed.dtb zynq-zed.dts
——但是里面没有我们想要的zynq-microzed.dts文件,因此只能用别的方法,这里介绍是为了给用其他开发板的读者带来方便
(2)从步骤六可以下载到microzed_7010_7020_petalinux_SD_images ,里面有devicetree_microzed_2014_4.dts,可以生成。
也可以用Vivado创建一个Microzed的项目生成比特流后导入到SDK,File—>New—>Board Support Package—>Board Support Package OS : device-tree—>Finish命令—->在弹出的Setting对话框中,设置bootargs的Value值为:console=ttyPS0,115200 root= /dev/ram/ rw earlyprintk—>在console device的Value下拉菜单中选择ps7_uart_1,单击OK按钮。(这里的bootargs参数是内核的命令行参数,在内核启动阶段,这些参数被传递给内核。这里root= /dev/ram 指的是内核从内存启动文件系统,U-boot将uramdisk.image.gz加载到内存后将其内存地址传递给内核,内核就知道该从什么地方运行文件系统了。但是我们知道Zedboard上的内存只有512M,况且uramdisk.image.gz最大只能到32M,那么当在构建较大的系统时该怎么办呢?解决这一问题有两种方法,第一个仍然使用uramdisk.image.gz作为文件系统,然后将需要加载到用户系统文件放到FAT分区中,当操作系统启动后,将FAT分区挂载到系统中,然后进行相应的访问。第二种方法则是将文件系统放到SD卡的EXT分区中就像第一章中启动linaro_ubuntu桌面系统一样,这里唯一需要修改的是将这里的启动参数root=/dev/ram改为root=/dev/mmcblk0p2。)——>编译结束后,device-tree_bsp_0/ps7_cotexa9_0/libsrc/device-tree_v0_00_x目录下可以看到xilinx.dts文件生成。这里的xilinx.dts不是完美的,如果在Zedboard上使用还要根据实际的情况修改, 找到已经修改好的xup_zed.dts,该文件对ethernet的mdio参数进行修改。
cd ~/build/linux-xup
./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb xilinx.dts
当然这个过程可逆,可以将一个.dtb转换成.dts
./scripts/dtc/dtc -I dtb -O dts -o xilinx.dts devicetree.dtb
或者将xilinx.dts 放入arch/arm/boot/dts 文件夹中,然后使用下面的命令生成devicetree.dtb。
make ARCH=arm xilinx.dtb
cp arch/arm/boot/dts/xilinx.dtb ./devicetree.dtb
5.生成uramdisk.image.gz
(1)在+and+Modify+a+Rootfs下载arm_ramdisk.image.gz(该网址也有过程)
(2)在build目录中:mkdir filesys ,cd filesys, 把arm_ramdisk.image.gz 放到filesys目录中
(3)cp arm_ramdisk.image.gz ramdisk.image.gz
(4)gunzip ramdisk.image.gz
(5)mkdir file_tmp
(6)sudo mount ramdisk.image -o loop ./file_tmp/(或者sudo mount -o loop ramdisk.image file_tmp)
(7)此时文件系统已经挂载到了film_tmp目录中,你可以到film_tmp目录中对文件系统进行相应的修改。修改完后将文件系统umount并重新压缩即可。这里如果你要制作EXT文件系统,则只需要将SD卡插到PC机中,并将file_tmp文件夹的内容复制到SD卡的EXT分区中即可。
(8)sudo umount file_tmp/
(9)gzip ramdisk.image
(10)sudo apt-get install u-boot-tools
(11)mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
输出:
Image Name:
Created: Tue Jul 19 17:32:31 2016
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 5310073 Bytes = 5185.62 kB = 5.06 MB
Load Address: 00000000
Entry Point: 00000000
6.另一种途径:直接下载
Open Source Linux Images
下载后,根据你板子的型号来选择用7010的还是7020的。
也可以从我上传的位置下载:
或者:
MicroZed Open Source Linux QSPI Image Tutorial:
Open Source Linux In System QSPI Programming Tutoria:
The MicroZed platform ships from the factory with an example Open Source Linux image stored in the Quad-SPI Flash boot medium. This tutorial builds upon the Zynq Linux SpeedWay training material and describes how to perform in system programming of QSPI Flash partitions to restore the factory default QSPI Flash contents.
评论
查看更多