当前位置: 首页 > news >正文

嵌入式系统内核镜像相关(三)

文章目录

  • 前言
  • 一、Petalinux内的重要组件
    • 1.1 Yocto
      • 1.1.1 YOCTO_MACHINE_NAME配置
      • 1.1.2 TMPDIR Location配置
      • 1.1.3 Parallel thread execution配置
      • 1.1.4 什么是BitBake?
        • 1.1.4.1 BitBake介绍
        • 1.1.4.2 BitBake历史沿革
        • 1.1.4.3 BitBake和Yocto的关系
      • 1.1.5 Add pre-mirror url配置
      • 1.1.6 Local sstate feeds settings配置
      • 1.1.7 三个Enable相关的配置
      • 1.1.8 User Layers配置
      • 1.1.9 关于Yocto更多的细节
      • 1.1.10 Petalinux项目转化为Yocto项目?
    • 1.2 BusyBox
    • 1.3 FSBL@Zynq-7000
      • 1.3.1 什么是FSBL?
      • 1.3.2 如何从Vitis创建FSBL?
      • 1.3.3 FSBL有哪些编译标志级别?
      • 1.3.4 FSBL可以在哪些处理器核心上运行?
      • 1.3.5 FSBL使用OCM的哪一部分?
      • 1.3.6 `xfsbl_translation_table.S` 是否与ZYNQ中BSP的 `translation_table.S` 不同?
      • 1.3.7 FSBL执行了哪些ECC初始化操作?
      • 1.3.8 还有哪些其他方式可以进一步减小 FSBL 的占用空间?
      • 1.3.9 FSBL 使用了什么级别的优化?
      • 1.3.10 FSBL 预留了哪些内存区域和寄存器?
      • 1.3.11 在BIF文件(用于创建引导镜像)中指定比特流的顺序是否有限制?
      • 1.3.12 FSBL是否支持USB引导模式?
      • 1.3.13 FSBL回退功能是什么,FSBL是否支持此功能?
      • 1.3.14 FSBL是否支持早期交接?
      • 1.3.15 FSBL代码提供了哪些钩子?
      • 1.3.16 如何在FSBL中进行启动时间测量?
      • 1.3.17 FSBL中添加了哪些QSPI模式支持,以及对于大于16MB的QSPI,复位要求是什么?
      • 1.3.18 使用大于16MB QSPI和RSA认证时,引导镜像有哪些要求?
      • 1.3.19 什么是第二阶段引导模式?
      • 1.3.20 本项目的FSBL程序
    • 1.4 U-Boot
  • 总结


前言

这一篇主要负责解释清楚Petalinux内的组件,尤其是YoctoBusyBox。因为第二篇发现了不少需要解释的坑,此外,既然已经在用Petalinux了,没有理由只限于会技术工的操作,对整体框架的了解也是有必要的。

在解释过程中,会通过实际项目相互印证。


一、Petalinux内的重要组件

根据官网的说法,Petalinux工具可以使开发人员能够轻松地为Xilinx硅片配置、构建和部署必要的开源和系统软件,包括:

1、FSBL(First Stage Boot Loader)
2、U-Boot
3、ARM可信固件
4、Linux内核
5、根文件系统
6、库和应用程序
7、Xen虚拟机管理程序

其中,Yocto项目是开源协作项目,用于帮助开发人员创建定制的Linux系统,Petalinux工具构建在Yocto基础架构之上。

我打算首先对Yocto进行详细介绍,因为Yocto涉及petalinux-config的重要环节。随后对BusyBox展开介绍。最后,根据xilinx-wikiFSBLU-BootARM可信固件等一一介绍。

1.1 Yocto

Yocto是提供了通用框架,用于创建定制的Linux发行版,特别适用于嵌入式系统物联网设备

PetalinuxXilinx基于Yocto项目开发的Linux开发工具,在Yocto基础上进行了封装和优化,以更好地支持XilinxFPGA平台。

通过petalinux-config可以看到Yocto的配置界面:
在这里插入图片描述
选中以后就参照第一篇和第二篇提到的arm sstate-cachedownloads实现离线编译。
在这里插入图片描述
好了!该找找这个这个yocto在哪个文件里面了!

dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -type f \( -name "*conf*" \) -exec grep -l "yocto" {} +
...
./proj_peta/build/conf/site.conf
./proj_peta/build/conf/plnxtool.conf
./proj_peta/build/conf/bblayers.conf
./proj_peta/build/misc/config/Kconfig
./proj_peta/project-spec/configs/config

有一堆文件,从上面两张图的痕迹来看大概能推定yoctomisc文件夹中,所以搜一下Kconfig即可:

dention@ubuntu:~/petalinux_proj/test_peta$ grep -in "yocto" ./proj_peta/build/misc/config/Kconfig
621:menu "Yocto Settings"
623:config YOCTO_MACHINE_NAME
624:       string "YOCTO_MACHINE_NAME"
645:config YOCTO_BB_NUMBER_THREADS
650:config YOCTO_PARALLEL_MAKE
673:config YOCTO_DEFAULT_LOCAL_SSTATE_FEEDS
674:	comment "Default sstate feeds ${PETALINUX}/components/yocto always added"
676:config YOCTO_LOCAL_SSTATE_FEEDS_URL
682:config YOCTO_ENABLE_DEBUG_TWEAKS
689:config YOCTO_NETWORK_SSTATE_FEEDS
697:	depends on YOCTO_NETWORK_SSTATE_FEEDS
698:config YOCTO_NETWORK_SSTATE_FEEDS_URL
704:config YOCTO_BB_NO_NETWORK

然后打印从621行到850行的内容:

dention@ubuntu:~/petalinux_proj/test_peta$ sed -n '621,850p' ./proj_peta/build/misc/config/Kconfig
menu "Yocto Settings"config YOCTO_MACHINE_NAMEstring "YOCTO_MACHINE_NAME"default "plnx-versal" if SYSTEM_VERSALdefault "plnx-zynqmp" if SYSTEM_ZYNQMPdefault "plnx-zynq7" if SUBSYSTEM_ARCH_ARMdefault "plnx-microblazeel" if SUBSYSTEM_ARCH_MICROBLAZEhelpyou can specify MACHINE_NAME using this variable.menu "TMPDIR Location"config TMP_DIR_LOCATIONstring "TMPDIR Location"default "${PROOT}/build/tmp"helpRelative path can be used with reference to ${proot}Note: $PROOT is internal variable, any other variable willnot be functional.
endmenumenu	"Parallel thread execution"config YOCTO_BB_NUMBER_THREADSstring "sets number of bb threads (BB_NUMBER_THREADS)"helpBy default bitbake calculates the number of cores in pcconfig YOCTO_PARALLEL_MAKEstring "sets number of parallel make -j (PARALLEL_MAKE)"helpBy default bitbake calculates the number of cores in pcendmenumenu "Add pre-mirror url "config PRE_MIRROR_URLstring "pre-mirror url path"helppre-mirrors is used by bitbake to fetch sources from specified location first.If sources are not available in pre-mirrors, bitbake then fetches from SRC_URI in the recipes.path can be ftp, http, https or local directory.examples are"file::///path/to/your/downloads/""http://example.com/your/downloadsmirrors/""ftp://example.com/your/downloadsmirrors/"
endmenumenu "Local sstate feeds settings"
config YOCTO_DEFAULT_LOCAL_SSTATE_FEEDScomment "Default sstate feeds ${PETALINUX}/components/yocto always added"config YOCTO_LOCAL_SSTATE_FEEDS_URLstring "local sstate feeds url"default ""endmenuconfig YOCTO_ENABLE_DEBUG_TWEAKSbool "Enable Debug Tweaks"default nhelpdebug tweaks will be enabled in image features.it will enable auto login.config YOCTO_NETWORK_SSTATE_FEEDSbool "Enable Network sstate feeds"default yhelpThe sstate feeds which are hosted on webserver has to be provided.The sstate cache will be pulled from these servers and rootfs was generated.menu "Network sstate feeds URL"depends on YOCTO_NETWORK_SSTATE_FEEDS
config YOCTO_NETWORK_SSTATE_FEEDS_URLstring "network sstate feeds url"default ""endmenuconfig YOCTO_BB_NO_NETWORKbool "Enable BB NO NETWORK"default nhelpEnabling this option restricts bitbake to go to internet for fetching.menu "User Layers"config USER_LAYER_0string "user layer 0"helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_1string "user layer 1"depends on USER_LAYER_0 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_2string "user layer 2"depends on USER_LAYER_1 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_3string "user layer 3"depends on USER_LAYER_2 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_4string "user layer 4"depends on USER_LAYER_3 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_5string "user layer 5"depends on USER_LAYER_4 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_6string "user layer 6"depends on USER_LAYER_5 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_7string "user layer 7"depends on USER_LAYER_6 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_8string "user layer 8"depends on USER_LAYER_7 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_9string "user layer 9"depends on USER_LAYER_8 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.endmenu
endmenu

然后我们一点点看menu

1.1.1 YOCTO_MACHINE_NAME配置

YOCTO_MACHINE_NAME的配置见如下说明:

menu "Yocto Settings"config YOCTO_MACHINE_NAMEstring "YOCTO_MACHINE_NAME"default "plnx-versal" if SYSTEM_VERSALdefault "plnx-zynqmp" if SYSTEM_ZYNQMPdefault "plnx-zynq7" if SUBSYSTEM_ARCH_ARMdefault "plnx-microblazeel" if SUBSYSTEM_ARCH_MICROBLAZEhelpyou can specify MACHINE_NAME using this variable.

根据这里的解释说明,我们选择plnx-zynq7是符合要求的,因为7035开发板是arm框架下的。

1.1.2 TMPDIR Location配置

TMPDIR Location的配置见如下说明:

menu "TMPDIR Location"config TMP_DIR_LOCATIONstring "TMPDIR Location"default "${PROOT}/build/tmp"helpRelative path can be used with reference to ${proot}Note: $PROOT is internal variable, any other variable willnot be functional.
endmenu

看到/build/tmp的字眼,大概率也能猜到这是编译过程的临时文件。

dention@ubuntu:~/petalinux_proj/test_peta/proj_peta/build/tmp$ ls
abi_version  cache   hosttools  pkgdata       sstate-control  sysroots             sysroots-uninative  work-shared
buildstats   deploy  log        saved_tmpdir  stamps          sysroots-components  work

那么自然而然的,${PRROT} = ~/petalinux_proj/test_peta/proj_peta

在这里插入图片描述

1.1.3 Parallel thread execution配置

Parallel thread execution的配置见如下说明:

menu	"Parallel thread execution"config YOCTO_BB_NUMBER_THREADSstring "sets number of bb threads (BB_NUMBER_THREADS)"helpBy default bitbake calculates the number of cores in pcconfig YOCTO_PARALLEL_MAKEstring "sets number of parallel make -j (PARALLEL_MAKE)"helpBy default bitbake calculates the number of cores in pcendmenu

这两项配置是Yocto用于优化构建过程的设置,它们分别控制BitBake构建系统中的线程数并行编译任务数。默认选择pc的核心数量。
在这里插入图片描述

1.1.4 什么是BitBake?

BitBake的官方文档。我就不对整个文档进行阅读了,搞清楚它是什么、有什么作用以及历史沿革就行!我就机翻了,偷个懒!

1.1.4.1 BitBake介绍

BitBake是一个通用的任务执行引擎,能够高效并行运行shellPython任务,同时处理复杂的任务依赖关系。OpenEmbeddedBitBake的主要用户之一,利用其核心构建嵌入式Linux软件栈。

BitBake根据提供的元数据执行任务。 元数据存储在配方文件(.bb)配方“追加”文件(.bbappend)配置文件(.conf)类文件(.bbclass)中。这些元数据为BitBake提供了任务执行指令和任务之间的依赖关系。

BitBake包含一个获取库,可以从本地文件、版本控制系统或网站获取源代码。每个待构建单元(如软件组件)的构建指令称为“配方”文件,包含该单元的所有信息(依赖关系、源文件位置、校验和、描述等)。

BitBake包含客户端/服务器抽象,可通过命令行使用,也可作为XML-RPC服务使用,并有多种用户界面。

BitBake是用Python语言编写的程序。在最高级别,BitBake解释元数据,决定需要运行哪些任务,并执行这些任务。与GNU Make类似,BitBake控制软件的构建。GNU Make通过“makefile”实现控制,而BitBake使用“配方”`。

BitBake通过允许定义更复杂的任务(例如组装整个嵌入式Linux发行版)扩展了类似GNU Make的简单工具的功能。

关于元数据的情况:

dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -name "*.bb"
./proj_peta/project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bb
./proj_peta/project-spec/meta-user/recipes-apps/peekpoke/peekpoke.bb
./proj_peta/project-spec/meta-user/recipes-apps/gpio-demo/gpio-demo.bb
dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -name "*.bbappend"
./proj_peta/project-spec/meta-plnx-generated/recipes-kernel/linux/linux-xlnx_%.bbappend
./proj_peta/project-spec/meta-plnx-generated/recipes-core/init-ifupdown/init-ifupdown_%.bbappend
./proj_peta/project-spec/meta-plnx-generated/recipes-core/busybox/busybox_1.%.bbappend
./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/device-tree/device-tree.bbappend
./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/u-boot/u-boot-xlnx_%.bbappend
./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/fsbl/fsbl_%.bbappend
./proj_peta/project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend
./proj_peta/project-spec/meta-user/recipes-bsp/device-tree/device-tree.bbappend
./proj_peta/project-spec/meta-user/recipes-bsp/u-boot/u-boot-xlnx_%.bbappend
dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -name "*.bbclass"
dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -name "*.conf"
./proj_peta/build/tmp/work-shared/plnx-zynq7/kernel-source/Documentation/docutils.conf
./proj_peta/build/tmp/work-shared/plnx-zynq7/kernel-source/Documentation/networking/mac80211_hwsim/wpa_supplicant.conf
./proj_peta/build/tmp/work-shared/plnx-zynq7/kernel-source/Documentation/networking/mac80211_hwsim/hostapd.conf
./proj_peta/build/tmp/work-shared/plnx-zynq7/kernel-source/arch/parisc/defpalo.conf
./proj_peta/build/tmp/work-shared/plnx-zynq7/kernel-source/tools/testing/ktest/sample.conf

看其中的petalinux-user-image.bb文件:

dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bb 
DESCRIPTION = "PETALINUX image definition for Xilinx boards"
LICENSE = "MIT"require recipes-core/images/petalinux-image-common.inc inherit extrausers 
COMMON_FEATURES = "\ssh-server-dropbear \hwcodecs \"
IMAGE_LINGUAS = " "IMAGE_INSTALL = "\kernel-modules \mtd-utils \canutils \openssh-sftp-server \pciutils \run-postinsts \udev-extraconf \packagegroup-core-boot \packagegroup-core-ssh-dropbear \tcf-agent \bridge-utils \"
EXTRA_USERS_PARAMS = "usermod -P root root;"

这个配方文件定义了PetaLinux用户镜像,适用于Xilinx开发板。包含多个软件包和功能,具体如下:

kernel-modules:内核模块。
mtd-utils:MTD(Memory Technology Device)工具。
canutils:CAN 总线工具。
openssh-sftp-server:OpenSSH SFTP 服务器。
pciutils:PCI 工具。
run-postinsts:运行安装后脚本。
udev-extraconf:额外的 udev 配置。
packagegroup-core-boot:核心启动包组。
packagegroup-core-ssh-dropbear:核心 SSH Dropbear 包组。
tcf-agent:TCF(Test and Configuration Framework)代理。
bridge-utils:网桥工具。

这个配方文件也设置了root用户的密码为root

看看9个*.bbappend文件的内容:

dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-kernel/linux/linux-xlnx_%.bbappend FILESEXTRAPATHS_prepend := "${THISDIR}/configs:"
RDEPENDS_${KERNEL_PACKAGE_NAME}-base = ""
do_configure[depends] += "kern-tools-native:do_populate_sysroot"
SRC_URI += "file://plnx_kernel.cfg"
do_deploy_append () {install -m 0644 ${D}/boot/System.map-${KERNEL_VERSION} ${DEPLOYDIR}/System.map.linux
}# 将当前目录下的configs文件夹添加到文件搜索路径中。
# 在配置任务中添加对kern-tools-native的依赖,确保内核工具链在系统根目录中可用。
# 添加plnx_kernel.cfg文件到SRC_URI中,以便在构建过程中使用。
# (这里的SRC_URL眼熟了!!!!!)
# 在部署阶段,将System.map-${KERNEL_VERSION}文件复制到部署目录中,并重命名为System.map.linux。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-core/init-ifupdown/init-ifupdown_%.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"# 将当前目录下的files文件夹添加到文件搜索路径中,以便在构建过程中可以找到额外的文件。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-core/busybox/busybox_1.%.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"# 将当前目录下的files文件夹添加到文件搜索路径中,以便在构建过程中可以找到额外的文件。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/device-tree/device-tree.bbappend YAML_CONSOLE_DEVICE_CONFIG_forcevariable = "ps7_uart_0"
XSCTH_WS = "${TOPDIR}/../components/plnx_workspace/device-tree"
YAML_DT_BOARD_FLAGS_forcevariable = "{BOARD template }"
YAML_MAIN_MEMORY_CONFIG_forcevariable = "PS7_DDR_0"
sysconf = "${TOPDIR}/../project-spec/configs"
SRC_URI_append ="\file://config\
"
export PETALINUX
DEVICETREE_FLAGS += ""
DT_PADDING_SIZE = "0x1000"
FILESEXTRAPATHS_append := ":${sysconf}"
KERNEL_DTS_INCLUDE = "${STAGING_KERNEL_DIR}/include"
do_configure_append () {script="${PETALINUX}/etc/hsm/scripts/petalinux_hsm_bridge.tcl"data=${PETALINUX}/etc/hsm/data/eval xsct -sdx -nodisp ${script} -c ${WORKDIR}/config \-hdf ${DT_FILES_PATH}/hardware_description.${HDF_EXT} -repo ${S}\-data ${data} -sw ${DT_FILES_PATH} -o ${DT_FILES_PATH} -a "soc_mapping"
}# 设备树的这个文件非常核心。
# 指定了控制台设备为ps7_uart_0。
# ...dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/u-boot/u-boot-xlnx_%.bbappend FILESEXTRAPATHS_prepend := "${THISDIR}/configs:"
SRC_URI += "file://config.cfg file://platform-auto.h"
do_configure_append () {install ${WORKDIR}/platform-auto.h ${S}/include/configs/install ${WORKDIR}/platform-top.h ${S}/include/configs/
}
# 添加config.cfg和platform-auto.h文件到SRC_URI中。
# 在配置阶段,将platform-auto.h和platform-top.h文件复制到源代码目录的include/configs/文件夹中。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-plnx-generated/recipes-bsp/fsbl/fsbl_%.bbappend YAML_SERIAL_CONSOLE_STDOUT_forcevariable = "ps7_uart_0"
YAML_SERIAL_CONSOLE_STDIN_forcevariable = "ps7_uart_0"
# 设置串行控制台的标准输出设备为ps7_uart_0。
# 设置串行控制台的标准输入设备为ps7_uart_0。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend 
#Note: Mention Each package in individual line
#      cascaded representation with line breaks are not valid in this file.
IMAGE_INSTALL_append = " peekpoke"
IMAGE_INSTALL_append = " gpio-demo"
# 在镜像中添加peekpoke和gpio-demo包。dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-user/recipes-bsp/device-tree/device-tree.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"SRC_URI += "file://system-user.dtsi"
# 跟前面类似,略去不提!dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-user/recipes-bsp/u-boot/u-boot-xlnx_%.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"SRC_URI += "file://platform-top.h"
# 跟前面类似,略去不提!

以上对若干个*.bbappend的解释已经放在注释中。system-user.dtsi我已经比较熟悉了,也是我自己手动修改过的文件。现在看看platform-top.h文件:

dention@ubuntu:~/petalinux_proj/test_peta$ cat ./proj_peta/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h #include <configs/platform-auto.h>
#define CONFIG_SYS_BOOTM_LEN 0xF000000 // 定义内核加载的最大长度为0xF000000字节(256MB)。// 从RAM加载image.ub,符合之前对镜像启动流程的分析!!!
#define DFU_ALT_INFO_RAM \"dfu_ram_info=" \"setenv dfu_alt_info " \"image.ub ram $netstart 0x1e00000\0" \"dfu_ram=run dfu_ram_info && dfu 0 ram 0\0" \"thor_ram=run dfu_ram_info && thordown 0 ram 0\0"// 从MMC加载内核镜像,这应该是从SD卡提取内核镜像的操作!!!
#define DFU_ALT_INFO_MMC \"dfu_mmc_info=" \"set dfu_alt_info " \"${kernel_image} fat 0 1\\\\;" \"dfu_mmc=run dfu_mmc_info && dfu 0 mmc 0\0" \"thor_mmc=run dfu_mmc_info && thordown 0 mmc 0\0"/*Required for uartless designs */
#ifndef CONFIG_BAUDRATE
#define CONFIG_BAUDRATE 115200  // 定义波特率。
#ifdef CONFIG_DEBUG_UART
#undef CONFIG_DEBUG_UART
#endif
#endif/*Dependencies for ENV to be stored in EEPROM. Ensure environment fits in eeprom size*/
// 如果环境变量存储在EEPROM中,定义相关的I2C和EEPROM配置
#ifdef CONFIG_ENV_IS_IN_EEPROM
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN         1
#define CONFIG_SYS_I2C_EEPROM_ADDR             0x54
#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS      4
#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS  5
#define CONFIG_SYS_EEPROM_SIZE                 1024 /* Bytes */
#define CONFIG_SYS_I2C_MUX_ADDR                0x74
#define CONFIG_SYS_I2C_MUX_EEPROM_SEL          0x4
#endif

platform-top.h文件包含U-Boot的一些定制配置,主要用于:

设置内核加载长度。
定义通过RAM和MMC进行DFU操作的环境变量和命令。
配置串口相关参数。
配置EEPROM相关参数,确保环境变量可以存储在EEPROM中。

确保U-Boot能够正确地初始化硬件,并支持通过不同介质(如RAM和MMC)进行固件更新。

1.1.4.2 BitBake历史沿革

BitBake最初是OpenEmbedded项目的一部分,受Gentoo Linux分布的Portage包管理系统启发。OpenEmbedded项目团队成员Chris Larson将其分为两个独立部分:BitBake(通用任务执行器)OpenEmbedded(BitBake使用的元数据集)

如今,BitBake是OpenEmbedded项目的主要基础,用于构建和维护Linux发行版,如Yocto项目下的Poky`参考发行版。

BitBake之前,没有其他构建工具能满足嵌入式Linux发行版的需求。传统桌面Linux发行版的构建系统缺乏重要功能,而嵌入式领域流行的Buildroot基础系统既不可扩展也不可维护。

所以,Buildroot不怎么好用,反而还是BitBake好用!

BitBake的一些重要原始目标包括:

处理交叉编译。
处理包之间的依赖关系(目标架构的构建时间、本地架构的构建时间以及运行时)。
支持在给定包内运行任意数量的任务,包括但不限于获取上游源代码、解压、打补丁、配置等。
对构建和目标系统都与 Linux 发行版无关。
与架构无关。
支持多种构建和目标操作系统(例如 Cygwin、BSD 等)。
自包含,而不是紧密集成到构建机器的根文件系统中。
处理目标架构、操作系统、发行版和机器的条件元数据。
轻松使用工具提供本地元数据和包,以便进行操作。
轻松使用 BitBake 在多个项目之间进行协作构建。
提供继承机制,以在多个包之间共享通用元数据。

随着时间的推移,发现还需要满足以下进一步的要求:

处理基础配方的变体(例如 native、sdk 和 multilib)。
将元数据分层,并允许层增强或覆盖其他层。
将给定任务的一组输入变量表示为校验和。基于该校验和,允许使用预构建组件加速构建。

BitBake满足了所有原始要求,并通过扩展基本功能来反映额外要求。灵活性和强大的功能一直是优先事项。BitBake高度可扩展,支持嵌入式Python代码和执行任何任意任务。

1.1.4.3 BitBake和Yocto的关系

两者之间的关系,Yocto是构建系统,而BitBakeYocto的核心引擎。具体而言,Yocto提供了一套元数据文件(如.bb.bbappend.conf等文件),这些文件定义了如何构建软件包和配置硬件。BitBake负责解析这些元数据并执行相应的任务。

1.1.5 Add pre-mirror url配置

Add pre-mirror url的配置见如下说明:

menu "Add pre-mirror url "config PRE_MIRROR_URLstring "pre-mirror url path"helppre-mirrors is used by bitbake to fetch sources from specified location first.If sources are not available in pre-mirrors, bitbake then fetches from SRC_URI in the recipes.path can be ftp, http, https or local directory.examples are"file::///path/to/your/downloads/""http://example.com/your/downloadsmirrors/""ftp://example.com/your/downloadsmirrors/"
endmenu

BitBake需要获取某个源代码包时,它会首先检查预镜像中是否有该包。如果预镜像中有该包,BitBake会直接从预镜像中获取,避免从远程服务器下载。如果预镜像中没有该包,BitBake会回退到从配方中的SRC_URI获取源代码。这也是我们之所以要加载离线包的原因所在!
在这里插入图片描述

1.1.6 Local sstate feeds settings配置

Local sstate feeds settings的配置见如下说明:

menu "Local sstate feeds settings"
config YOCTO_DEFAULT_LOCAL_SSTATE_FEEDScomment "Default sstate feeds ${PETALINUX}/components/yocto always added"config YOCTO_LOCAL_SSTATE_FEEDS_URLstring "local sstate feeds url"default ""endmenu

这两个配置项与Yocto的共享状态缓存(Shared State Cache,简称sstate)有关。sstate用于缓存构建过程中生成的中间文件和结果,通过加载离线sstate包的方式可以提高构建效率。
在这里插入图片描述

1.1.7 三个Enable相关的配置

三个Enable相关的见如下说明:

config YOCTO_ENABLE_DEBUG_TWEAKSbool "Enable Debug Tweaks"default nhelpdebug tweaks will be enabled in image features.it will enable auto login.config YOCTO_NETWORK_SSTATE_FEEDSbool "Enable Network sstate feeds"default yhelpThe sstate feeds which are hosted on webserver has to be provided.The sstate cache will be pulled from these servers and rootfs was generated.menu "Network sstate feeds URL"depends on YOCTO_NETWORK_SSTATE_FEEDS
config YOCTO_NETWORK_SSTATE_FEEDS_URLstring "network sstate feeds url"default ""endmenuconfig YOCTO_BB_NO_NETWORKbool "Enable BB NO NETWORK"default nhelpEnabling this option restricts bitbake to go to internet for fetching.

其中,YOCTO_ENABLE_DEBUG_TWEAKS启用调试功能,包括自动登录。YOCTO_NETWORK_SSTATE_FEEDS启用网络sstate feeds,从服务器拉取sstate缓存YOCTO_NETWORK_SSTATE_FEEDS_URL设置网络sstate feedsURLYOCTO_BB_NO_NETWORK启用BitBake的无网络模式,限制从互联网获取文件。但根据不少博客的说明来看,还是不建议取消YOCTO_NETWORK_SSTATE_FEEDS,因为有可能还要下载额外的包。
在这里插入图片描述
以下就是在线下载sstate的网址。
在这里插入图片描述
在这里插入图片描述

1.1.8 User Layers配置

User Layers的配置如下:

menu "User Layers"config USER_LAYER_0string "user layer 0"helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_1string "user layer 1"depends on USER_LAYER_0 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_2string "user layer 2"depends on USER_LAYER_1 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_3string "user layer 3"depends on USER_LAYER_2 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_4string "user layer 4"depends on USER_LAYER_3 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_5string "user layer 5"depends on USER_LAYER_4 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_6string "user layer 6"depends on USER_LAYER_5 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_7string "user layer 7"depends on USER_LAYER_6 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_8string "user layer 8"depends on USER_LAYER_7 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.config USER_LAYER_9string "user layer 9"depends on USER_LAYER_8 != ""helpYou can specify relative path or absolute path of layer.To add layer at <project-root>/project-spec/meta-securityEnter: ${proot}/project-spec/meta-securityNote: proot is internal to scripts.endmenu
endmenu

这段配置定义了一个菜单项,用于添加用户自定义的Yocto层。每个USER_LAYER_X配置项允许用户指定层路径,可以是相对路径或绝对路径,从而灵活扩展Yocto构建系统。目前不太清楚这个需求体现在哪里!暂时用不到,不做过多的了解。
在这里插入图片描述

1.1.9 关于Yocto更多的细节

参考链接。我不打算全部看一遍,因为确实绠短汲深。我这边罗列Yocto这一章节的目录,可以大概了解到Yocto的功能:

Getting Started with Yocto1、Yocto Project Quick Build
2、Yocto Project Reference Manual
3、BitBake User Manual
4、Yocto Project Development Tasks Manual
5、More Documentation is available at https://www.yoctoproject.org/documentation/current

可以从罗列的entryxilinx-wiki会附带跳转链接)看出来,官网提供了上手教程。

Yocto Wiki Pages
1、Yocto Project related Release Notes
2、Building Linux Images Using Yocto
3、PetaLinux to Yocto - Command Cross Reference
4、PetaLinux Yocto Tips
5、Customizing Device Trees in Xilinx Yocto
6、Building Yocto Images using a Docker Container
7、Xilinx Yocto Builds without an Internet Connection
8、Creating a Custom Yocto Layer
92018.1 release notes - Yocto
10、Adding MALI userspace binaries in Yocto builds
11、Creating a multilib image for the ZCU102 using Yocto
12、QEMU Yocto Flow
13、Xen Hypervisor through Yocto Flow
14、Yocto 2017.1 Linux Image creation for ZCU102
15、Docker Containers and Kubernetes Orchestration on Zynq UltraScale+
16、Adding a Hardware Platform to a Xilinx Yocto Layer
17、Install and Build with Xilinx Yocto
18、Yocto Project Machine Configuration Support
19、AMD Yocto Native Board Support Packages

从罗列的entry可以看出来,可以:
1、直接基于Yocto而不是Petalinux构建Linux镜像;
2、基于Yocto定制化设备树;
3、QEMU模拟器支持Yocto;
4、可以通过Yocto使用Xen虚拟机管理程序。

1.1.10 Petalinux项目转化为Yocto项目?

翻到这个链接,将Petalinux项目流程打断并将输出送入Yocto项目以得到启动镜像,感觉有点意思,就单独拎出来写!

Petalinux可自动执行在Xilinx平台上启动嵌入式Linux所需的任务。它在底层使用Yocto来配置和构建各种Xilinx组件。该节有助于将Petalinux生成的配置文件迁移到Yocto项目中。但请注意,此流程已不被Xilinx技术支持所支持,仅适用于2021.1 - 2022.2版本。对于2023.1及更高版本,此流程已被废弃,改用生成机器配置。更多可以参考Xilinx/gen-machine-conf仓库中的README.md文件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
放这个例子并非是为了去实现,而是直接以技术实现的方式证明Petalinux项目底层包含了Yocto项目。

1.2 BusyBox

为什么要提到BusyBox?理由其实很简单,在petalinux-build编译过程(如下截图)中突然看到了涉及BusyBox的下载与封装。刚好之前也听说过这个名词,于是乎,顺带了解一下这个概念。

在这里插入图片描述
在ZYNQ Linux这一节中看到部分应用的来源是BusyBox。所以BusyBox 集成许多常用Unix工具的单个可执行文件,包括lscpmvsh等,常用于嵌入式系统,而BusyBox提供了轻量级的解决方案,也就是将多个工具集成到一个可执行文件中,以减少系统的空间占用。
在这里插入图片描述

1.3 FSBL@Zynq-7000

参考网址对FSBL进行介绍。该网站采用了自问自答的方式对FSBL的特征进行了描述。我直接机翻了!

1.3.1 什么是FSBL?

第一阶段引导程序FSBL)用于ZYNQ-7000,它会用硬件比特流(如果存在)配置FPGA,并从非易失性存储器(NAND/SD/QSPI)第二阶段引导程序裸金属应用程序代码加载到内存(DDR/OCM)中,并使A9脱离复位。它支持多个分区,可以是代码镜像比特流。如果需要,这些分区将被认证和/或加密。FSBL被加载到OCM中,并在认证和/或解密(如需要)后由BootROM传递控制权。

1.3.2 如何从Vitis创建FSBL?

1、Launch VITIS with the below command: vitis2、Provide path where VITIS workspace and project need to be created. With this VITIS workspace will be created3(Optional step) To work with local repos, Select "Xilinx" (ALT - x) -> Repositories. Against Local Repositories, click on "New..." and provide path of the local repo4、Select File-->New-->Application Project to open "New Project" window, provide name for FSBL project
In the “Platform” section, click on “Create a new platform from hardware (XSA)” and select pre-defined hardware platform for Zynq(e.g. zc702).5、Alternatively, to create a new/custom platform from a .xsa file, click on “+, browse and select the XSA file and a new hardware platform is created.6、In the "Domain" window, select the processor ps7_cortexa9_0/ps7_cortexa9_1, OS as standalone and Language as C7、Click Next and select "Zynq FSBL"8、Click "Finish" to generate the A9 FSBL. This populates the FSBL code and also builds it (along with BSP)9、Debug prints in FSBL are now disabled by default (except for FSBL banner). To enable debug prints, define symbol: FSBL_DEBUG_INFO10、In VITIS this can be done by: right click on FSBL application project -> select “C/C++ Build Settings” -> “Tool Settings” tab ->Symbols (under ARM v7-A gcc compiler)11、Click on Add (+) icon and Enter Value: FSBL_DEBUG_INFO, click on "OK" to close the "Enter Value" screen12、In case any of the source files (FSBL or BSP) need to be modified, browse the file, make the change and save the file, build the project.elf file will be present in the Debug/Release folder of FSBL project.

1.3.3 FSBL有哪些编译标志级别?

FSBL支持六个编译标志级别:

  • FSBL_DEBUG:设置此标志以启用日志和消息打印。
  • FSBL_DEBUG_INFO:设置此标志以获取更详细的日志,如寄存器和分区头信息转储。
  • FSBL_DEBUG_RSA:设置此标志以打印在RSA函数中使用的更多详细中间值。
  • NON_PS_INSTANTIATE:当比特流没有PS组件时设置此标志。然后FSBL不会启用电平转换器。
  • D_BITSTREAM:设置此标志时,比特流没有PS组件。然后FSBL不会启用电平转换器。
  • RSA_SUPPORT:设置此标志以在FSBL中启用认证功能。
  • MMC_SUPPORT:设置此标志以在FSBL中启用MMC支持。设置此标志时,FSBL从eMMC设备读取所有分区,而不是主引导设备(由引导模式引脚设置)。

1.3.4 FSBL可以在哪些处理器核心上运行?

FSBL只能在A9_0(AArch32)上运行。

1.3.5 FSBL使用OCM的哪一部分?

从地址0x0000_0000开始,有192KBOCM内存可供FSBL代码内存使用。而OCM的上部内存,即从地址0xFFFF_0000开始的64KB,供FSBL程序内存使用。

1.3.6 xfsbl_translation_table.S 是否与ZYNQ中BSP的 translation_table.S 不同?

没有xfsbl_translation_table.S,FSBL使用BSP中默认可用的translation_table.S

1.3.7 FSBL执行了哪些ECC初始化操作?

DDR ECC初始化:最初它被添加到FSBL源代码中,后来移到ps7_init中并从FSBL中移除。

1.3.8 还有哪些其他方式可以进一步减小 FSBL 的占用空间?

  • 调试打印:默认情况下,仅打印FSBL标志。如果启用了更多调试打印,打印消息所需的时间将增加启动时间的延迟,并且会增加额外的代码,从而导致占用空间增大。
  • 驱动程序断言:断言在所有Xilinx驱动程序中使用,可以通过在编译时定义NDEBUG标识符(在驱动程序的extra_compiler_flags中添加-DNDEBUG)在系统范围内关闭断言。这将有助于进一步减小FSBL的占用空间。

1.3.9 FSBL 使用了什么级别的优化?

对于2019.2,FSBL默认将使用减少编译时间的优化级别(-O0)在Vitis中构建,我们可以在Vitis中调试FSBL。

1.3.10 FSBL 预留了哪些内存区域和寄存器?

以下是为FSBL预留的内存区域和寄存器:

  • DDR区域0x100000UDDR_TEMP_START_ADDRESS)这是比特流将被临时复制到DDR中的地址。
  • OCM区域0xFFFFFFF8UBASEADDR_HOLDER)- 该地址保存了找到的镜像引导ROM的基地址。

1.3.11 在BIF文件(用于创建引导镜像)中指定比特流的顺序是否有限制?

第一个分区必须是FSBL ELF,然后是比特流分区,最后是应用程序ELF。比特流是可选的。FSBLBIF中的顺序将控制权交给第一个应用程序。BIF文件中的顺序很重要。比特流必须是FSBL之后的分区。只有当需要对PL进行编程时,才需要比特流

1.3.12 FSBL是否支持USB引导模式?

FSBL不支持USB引导模式。

1.3.13 FSBL回退功能是什么,FSBL是否支持此功能?

为了从错误状态中恢复,FSBL会进行回退,并使BootROM加载另一个可引导镜像(最初存在且处于已知良好状态的黄金镜像),如果该镜像存在于闪存中。FSBL更新多启动寄存器并执行软复位,以便BootROM执行并加载下一个存在且有效的镜像。有关回退功能的详细信息,请参阅UG821

1.3.14 FSBL是否支持早期交接?

FSBL不支持早期交接。

1.3.15 FSBL代码提供了哪些钩子?

钩子是用户可以定义的函数。FSBL提供了空白函数,并从某些位置调用它们。以下是当前可用的钩子:

  • 在下载 PL 比特流之前FsblHookBeforeBitstreamDload()
  • 在下载 PL 比特流之后FsblHookAfterBitstreamDload()
  • 在交接给应用程序之前FsblHookBeforeHandoff()
  • 在 FSBL 回退期间FsblHookFallback()

1.3.16 如何在FSBL中进行启动时间测量?

启动时间(或性能)测量是一种测量完成某些耗时活动(例如分区复制、认证、解密等)所需时间的方法。此外,还提供了FSBL所需的总时间(从 ps7_init 完成后到所有分区/比特流加载完成的时间)。可以通过定义宏 FSBL_PERF(在 fsbl.h 中)启用此功能。当定义了 FSBL_PERF 宏时,不应启用调试打印。

1.3.17 FSBL中添加了哪些QSPI模式支持,以及对于大于16MB的QSPI,复位要求是什么?

Zynq支持线性和I/O模式QSPI。FSBL包含使用线性寻址模式为≤128Mb的Flash 设备以及使用IO模式为>128Mb设备的能力。如果使用大于16MB的QSPI flash,则为了访问超过16MB的flash部分,软件驱动程序(裸机、u-boot、Linux)需要将3字节地址扩展到一个名为 “扩展地址寄存器” 的供应商特定QSPI寄存器中,以存储第4字节。

1.3.18 使用大于16MB QSPI和RSA认证时,引导镜像有哪些要求?

BootROM使用线性模式访问QSPI flash的前16MB以查找引导镜像。如果使用大于16MB的QSPI flash和RSA认证,则引导镜像不能放置在闪存的0x0偏移处。

满足此要求的三种可能的解决方法如下:

  • 擦除闪存的前 32KB,并在 0x0 + 32KB 偏移处编程引导镜像(在双并行情况下为 64KB):BootROM 将无法从 0x0 启动,将回退并从 0x0 + 32KB 偏移处启动(请参阅 UG585 Zynq-7000-TRM 了解引导分区搜索)。
  • 在 0x0 处编程引导镜像,并在 0x0 + 16MB 偏移处重复镜像头:BootROM 将使用 0x0 + 16MB 偏移处的镜像头,然后使用编程在 0x0 处的引导镜像启动。
  • 仅使用单 x1 QSPI 模式
  • 注意:如果不使用 RSA,即使对于大于 16MB 的 QSPI,引导镜像也可以放置在 0x0 处。

1.3.19 什么是第二阶段引导模式?

在Zynq-7000架构中,可以有两个引导设备。主引导模式是由BootROM用于加载FSBL的引导模式。

第二阶段引导模式是FSBL用于加载所有其他分区的引导设备。Zynq-7000 AP设备支持MLC和SLC配置中的eMMC闪存设备作为第二阶段引导源。FSBL支持从eMMC加载分区。这仅在主引导模式(通过引导模式引脚设置)为QSPI时才可能。

当QSPI闪存较小,而您希望将所有其他分区存储在更大的闪存存储器(如eMMC)上时,请使用此选项。在这种情况下,将FSBL放在QSPI闪存上,而所有其他分区都在eMMC闪存上。

从PCIe的第二阶段引导模式支持:最初,BootROM和第一阶段引导程序(FSBL)被执行,然后是u-boot。从外部源(如通过QSPI的SD)加载u-boot是主要的引导机制。

1.3.20 本项目的FSBL程序

索引了一下文件:

dention@ubuntu:~/petalinux_proj/test_peta$ find ./ -name "*fsbl*"
./proj_peta/images/linux/zynq_fsbl.elf
./proj_peta/build/tmp/buildstats/20250610084147/fsbl-2019.1+gitAUTOINC+26c14d9861-r0
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.deploy
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.package_qa
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.populate_lic
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.populate_sysroot
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.package
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.packagedata
./proj_peta/build/tmp/sstate-control/manifest-plnx_zynq7-fsbl.package_write_rpm
./proj_peta/build/tmp/sysroots-components/manifests/fsbl.762ed1ec0037ab28798c9a4f0df086ba
./proj_peta/build/tmp/sysroots-components/plnx_zynq7/fsbl
./proj_peta/build/tmp/sysroots-components/plnx_zynq7/fsbl/sysroot-providers/fsbl
./proj_peta/build/tmp/sysroots-components/plnx_zynq7/fsbl/sysroot-providers/virtual_fsbl
./proj_peta/build/tmp/sysroots-components/plnx_zynq7/fsbl/boot/fsbl.elf
./proj_peta/build/tmp/deploy/images/plnx-zynq7/fsbl-2019.1+gitAUTOINC+26c14d9861-r0-plnx-zynq7-20250610084147.elf
./proj_peta/build/tmp/deploy/images/plnx-zynq7/fsbl-plnx-zynq7.elf
./proj_peta/build/tmp/deploy/licenses/fsbl
./proj_peta/build/tmp/deploy/rpm/plnx_zynq7/fsbl-2019.1+git0+26c14d9861-r0.plnx_zynq7.rpm
./proj_peta/build/tmp/deploy/rpm/plnx_zynq7/fsbl-dbg-2019.1+git0+26c14d9861-r0.plnx_zynq7.rpm
./proj_peta/build/tmp/deploy/rpm/plnx_zynq7/fsbl-dev-2019.1+git0+26c14d9861-r0.plnx_zynq7.rpm
./proj_peta/build/tmp/deploy/rpm/plnx_zynq7/fsbl-lic-2019.1+git0+26c14d9861-r0.plnx_zynq7.rpm
./proj_peta/build/tmp/pkgdata/plnx-zynq7/fsbl
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime-reverse/fsbl
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime-reverse/fsbl-dev
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime-reverse/fsbl-lic
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime-reverse/fsbl-dbg
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-locale
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-staticdev
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl.packaged
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-dev.packaged
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-dbg.packaged
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-doc
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-lic.packaged
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-dev
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-lic
./proj_peta/build/tmp/pkgdata/plnx-zynq7/runtime/fsbl-dbg
./proj_peta/build/tmp/stamps/plnx_zynq7-xilinx-linux-gnueabi/fsbl
./proj_peta/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl
./proj_peta/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.1+gitAUTOINC+9811303824-r0/recipe-sysroot/sysroot-providers/fsbl
./proj_peta/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.1+gitAUTOINC+9811303824-r0/recipe-sysroot/sysroot-providers/virtual_fsbl
./proj_peta/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.1+gitAUTOINC+9811303824-r0/recipe-sysroot/boot/fsbl.elf
...

真正能用的可能也就是./proj_peta/images/linux/zynq_fsbl.elf

查看文件头信息:

dention@ubuntu:~/petalinux_proj/test_peta$ readelf -h ./proj_peta/images/linux/zynq_fsbl.elf
ELF Header:Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF32Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              EXEC (Executable file)Machine:                           ARMVersion:                           0x1Entry point address:               0x0Start of program headers:          52 (bytes into file)Start of section headers:          558092 (bytes into file)Flags:                             0x5000400, Version5 EABI, hard-float ABISize of this header:               52 (bytes)Size of program headers:           32 (bytes)Number of program headers:         2Size of section headers:           40 (bytes)Number of section headers:         27Section header string table index: 26

可能需要留心的地方是Entry point address,表示程序的入口点地址,这里是0x0。对于FSBL,入口点地址通常为0x0。Start of program headers表示程序头表的起始位置,这里是文件的第52字节。Start of section headers表示节头表的起始位置,这里是文件的第558092字节。Flags表示文件的标志,这里是0x5000400,表示使用Version5 EABI和硬浮点ABI

查看程序头信息:

dention@ubuntu:~/petalinux_proj/test_peta$ readelf -l ./proj_peta/images/linux/zynq_fsbl.elfElf file type is EXEC (Executable file)
Entry point 0x0
There are 2 program headers, starting at offset 52Program Headers:Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg AlignLOAD           0x010000 0x00000000 0x00000000 0x1c008 0x21280 RWE 0x10000LOAD           0x030000 0xffff0000 0xffff0000 0x00000 0x0d400 RW  0x10000Section to Segment mapping:Segment Sections...00     .text .handoff .init .fini .rodata .data .mmu_tbl .init_array .fini_array .rsa_ac .bss .heap 01     .stack 

查看节头信息:

dention@ubuntu:~/petalinux_proj/test_peta$ readelf -S ./proj_peta/images/linux/zynq_fsbl.elf
There are 27 section headers, starting at offset 0x8840c:Section Headers:[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            00000000 000000 000000 00      0   0  0[ 1] .text             PROGBITS        00000000 010000 011500 00  AX  0   0 64[ 2] .handoff          PROGBITS        00011500 021500 00004c 00 AXS  0   0  4[ 3] .init             PROGBITS        0001154c 02154c 00000c 00  AX  0   0  4[ 4] .fini             PROGBITS        00011558 021558 00000c 00  AX  0   0  4[ 5] .rodata           PROGBITS        00011564 021564 000648 00   A  0   0  4[ 6] .data             PROGBITS        00011bb0 021bb0 002ef4 00  WA  0   0  8[ 7] .mmu_tbl          PROGBITS        00018000 028000 004000 00   A  0   0  1[ 8] .init_array       INIT_ARRAY      0001c000 02c000 000004 04  WA  0   0  4[ 9] .fini_array       FINI_ARRAY      0001c004 02c004 000004 04  WA  0   0  4[10] .rsa_ac           NOBITS          0001c008 02c008 001038 00  WA  0   0  1[11] .ARM.attributes   ARM_ATTRIBUTES  0001d040 02c008 000033 00      0   0  1[12] .bss              NOBITS          0001d040 02c008 002232 00  WA  0   0 32[13] .heap             NOBITS          0001f272 02c008 00200e 00  WA  0   0  1[14] .stack            NOBITS          ffff0000 030000 00d400 00  WA  0   0  1[15] .comment          PROGBITS        00000000 02c03b 000011 01  MS  0   0  1[16] .debug_info       PROGBITS        00000000 02c04c 022708 00      0   0  1[17] .debug_abbrev     PROGBITS        00000000 04e754 004ba4 00      0   0  1[18] .debug_loc        PROGBITS        00000000 0532f8 016b25 00      0   0  1[19] .debug_aranges    PROGBITS        00000000 069e20 000388 00      0   0  8[20] .debug_ranges     PROGBITS        00000000 06a1a8 0037f8 00      0   0  1[21] .debug_line       PROGBITS        00000000 06d9a0 0117e8 00      0   0  1[22] .debug_str        PROGBITS        00000000 07f188 0024ad 01  MS  0   0  1[23] .debug_frame      PROGBITS        00000000 081638 001574 00      0   0  4[24] .symtab           SYMTAB          00000000 082bac 003290 10     25 376  4[25] .strtab           STRTAB          00000000 085e3c 0024d1 00      0   0  1[26] .shstrtab         STRTAB          00000000 08830d 0000fe 00      0   0  1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),y (purecode), p (processor specific)

看了感觉还是非常抽象!

1.4 U-Boot

这个水有点深,资料偏多,打算单独写一篇。


总结

这一节对Petalinux的重要组件进行了分析,并尝试理解实际项目中的配置情况。

另外感觉FSBL要看懂还是有点难度的!后面打算多花点时间消化一下!

http://www.xdnf.cn/news/979345.html

相关文章:

  • React 状态管理指南:Redux 原理与优化策略
  • 避坑:启动sdk-c demo master需要注意的事情
  • 【AI】模型vs算法(以自动驾驶为例)
  • 基于React Native的HarmonyOS 5.0休闲娱乐类应用开发
  • 多分类性能评估方法
  • 企业级RAG系统架构设计与实现指南(基于Java技术栈)
  • uniapp 腾讯云 COS 访问控制实战(细粒度权限管理)
  • 撤销Git合并操作方法总结
  • 七牛云域名配置与CNAME解析
  • 李沐 《动手学深度学习》 | 实战Kaggle比赛:预测房价
  • 【PhysUnits】17.7 readme.md更新
  • 从代码学习深度强学习 - Dyna-Q 算法 PyTorch版
  • Android Gson工具类
  • 免下载苹果 IPA 文件重签名工具:快速更换应用名称和 BID的教程
  • xcode中project.pbxproj点开为空白问题
  • Linux Swap分区应该禁用吗?深入辨析其作用与性能优化
  • Spring @Qualifier,@Primary
  • 接收rabbitmq消息
  • 记录下three.js学习过程中不理解问题----材质(material)⑤
  • 在前端元素中,点击当前元素,但是却选中其他元素的文字的问题
  • Cesium圆锥渐变色实现:融合顶点着色器、Canvas动态贴图与静态纹理的多方案整合
  • 深度剖析:UI 设计怎样为小程序构建极致轻量体验
  • 在 Windows 上安装和配置 Redis 及可视化工具指南
  • C#接口代码记录
  • 物联网基础概述【一】
  • 容器化部署案例一wordpress
  • 递归法解N叉树的后序遍历
  • 若依微服务Openfeign接口调用超时问题
  • Java面向对象编程(OOP)深度学习解析
  • Flutter布局系统全面解析:从基础组件到复杂界面构建