嵌入式系统内核镜像相关(三)
文章目录
- 前言
- 一、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
内的组件,尤其是Yocto
和BusyBox
。因为第二篇发现了不少需要解释的坑,此外,既然已经在用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-wiki
对FSBL
、U-Boot
、ARM可信固件
等一一介绍。
1.1 Yocto
Yocto
是提供了通用框架,用于创建定制的Linux发行版
,特别适用于嵌入式系统
和物联网设备
。
Petalinux
是Xilinx
基于Yocto
项目开发的Linux开发工具
,在Yocto
基础上进行了封装和优化,以更好地支持Xilinx
的FPGA
平台。
通过petalinux-config
可以看到Yocto
的配置界面:
选中以后就参照第一篇和第二篇提到的arm sstate-cache
和downloads
实现离线编译。
好了!该找找这个这个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
有一堆文件,从上面两张图的痕迹来看大概能推定yocto
在misc
文件夹中,所以搜一下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
是一个通用的任务执行引擎,能够高效并行运行shell
和Python
任务,同时处理复杂的任务依赖关系。OpenEmbedded
是BitBake
的主要用户之一,利用其核心构建嵌入式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
是构建系统,而BitBake
是Yocto
的核心引擎。具体而言,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 feeds
的URL
。YOCTO_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
可以从罗列的entry
(xilinx-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
9、2018.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
工具的单个可执行文件,包括ls
、cp
、mv
、sh
等,常用于嵌入式系统,而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
开始,有192KB
的OCM
内存可供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区域:
0x100000U
(DDR_TEMP_START_ADDRESS
)这是比特流将被临时复制到DDR中的地址。 - OCM区域:
0xFFFFFFF8U
(BASEADDR_HOLDER
)- 该地址保存了找到的镜像引导ROM的基地址。
1.3.11 在BIF文件(用于创建引导镜像)中指定比特流的顺序是否有限制?
第一个分区必须是FSBL ELF
,然后是比特流分区
,最后是应用程序ELF
。比特流是可选的。FSBL
按BIF
中的顺序将控制权交给第一个应用程序。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
要看懂还是有点难度的!后面打算多花点时间消化一下!