【Buildroot】基础知识:目录、根文件系统目录覆盖、编译性能分析(编译时间、目标尺寸、包依赖图)

news2024/11/25 7:03:41

文章目录

  • 一、Buildroot目录介绍
  • 二、Finalizing target
    • 2.1 fs overlay
    • 2.2 post build
    • 2.3 post image
  • 三、编译性能
    • 3.1 编译耗时
    • 3.2 编译依赖关系
    • 3.3 编译结果尺寸分析
    • 3.4 其他文件

buildroot官方教程
buildroot使用介绍

Buildroot官网上可以下载发布版
国内的SOC厂商Rockchip就是在Buildroot的基础上开发的SDK,类似BSP版本的Buildroot。

一、Buildroot目录介绍

.
├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs: 放置开发板的一些配置参数. 
├── COPYING
├── DEVELOPERS
├── dl: 存放下载的源代码及应用软件的压缩包. 
├── docs: 存放相关的参考文档. 
├── fs: 放各种文件系统的源代码. 
├── linux: 存放着Linux kernel的自动构建脚本. 
├── Makefile
├── Makefile.legacy
├── output: 是编译出来的输出文件夹. 
│   ├── build: 存放解压后的各种软件包编译完成后的现场.
│   ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│   ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│   ├── staging
│   └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
└── toolchain

二、Finalizing target

在buildroot编译的末期,需要对编译结果进行一些检查或者其他操作。

buildroot预留了两个接口:

  • BR2_ROOTFS_OVERLAY:指向一个目录,此目录下的所有文件将会覆盖到output/target下。比如一些配置文件,或者预编译的库等可以在此阶段处理。

  • BR2_ROOTFS_POST_BUILD_SCRIPT:一个脚本,更加复杂的对文件进行删除、重命名、strip等等功能。

  • BR2_ROOTFS_POST_IMAGE_SCRIPT:对最终生成的images进行打包处理等。

2.1 fs overlay

在文件系统构建过程中,有些应用或者配置不通过编译,直接采取拷贝的方式集成到rootfs中,可以设置“System configuration”->“Root filesystem overlay directories”。
比如下面就是RV1126的rootfs_overlay配置信息:
在这里插入图片描述
在这里插入图片描述
sdk/buildroot/configs/rockchip_rv1126_rv1109_facial_gate_defconfig文件对于rootfs overlay的描述。

在这里插入图片描述
这里涉及到五个文件,而这些文件都会在buildroot编译成功后拷贝到buildroot/output/xxx/build/target/的文件系统里面去替换里面原有的或没有的目录。

board/rockchip/rv1126_rv1109/fs-overlay-facial/ 
board/rockchip/rv1126_rv1109/fs-overlay-sysv/
board/rockchip/rv1126_rv1109/fs-overlay/
board/rockchip/common/base 
board/rockchip/common/wifi

设置的目录中的内容,会对output/target进行覆盖。

相关处理在Makefile中如下:

@$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
    $(call MESSAGE,"Copying overlay $(d)"); \
    rsync -a --ignore-times --keep-dirlinks $(RSYNC_VCS_EXCLUSIONS) \
        --chmod=u=rwX,go=rX --exclude .empty --exclude '*~' \
        $(d)/ $(TARGET_DIR)$(sep))

2.2 post build

除了fs overlay这种方式,buildroot还提供了一个脚本进行更加复杂的处理。

可以进行文件删除、重命名,甚至对带调试信息的文件进行strip等。

@$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_BUILD_SCRIPT)), \
        $(call MESSAGE,"Executing post-build script $(s)"); \
        $(EXTRA_ENV) $(s) $(TARGET_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))

在这里插入图片描述post.sh

#!/bin/bash

BUILDROOT=$(pwd)
TARGET=$1
NAME=$(whoami)
HOST=$(hostname)
DATETIME=`date +"%Y-%m-%d %H:%M:%S"`
if [[ $RK_ROOTFS_TYPE -eq "squashfs" ]]; then
	echo "# rootfs type is $RK_ROOTFS_TYPE, create ssh keys to $(pwd)/output/$RK_CFG_BUILDROOT/target/etc/ssh"
	ssh-keygen -A -f $(pwd)/output/$RK_CFG_BUILDROOT/target
fi
echo "built by $NAME on $HOST at $DATETIME" > $TARGET/timestamp
exit 0

2.3 post image

post image在post build之后,更倾向于生成完整的release文件。包括进行一些images打包、debug文件打包等等。

.PHONY: target-post-image
target-post-image: $(TARGETS_ROOTFS) target-finalize
    @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT)), \
        $(call MESSAGE,"Executing post-image script $(s)"); \
        $(EXTRA_ENV) $(s) $(BINARIES_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))

一个范例如下,对images文件进行打包操作。

#!/bin/sh
set -x -e

IMG_DIR=output/images
DEBUG_DIR=${IMG_DIR}/debug
KERNEL_DIR=output/build/linux-master

ROOTFS_CPIO=${IMG_DIR}/rootfs.cpio
KERNEL_IMAGE=${IMG_DIR}/uImage
SPL_IMAGE=${IMG_DIR}/u-boot-spl-bh.bin
UBOOT_IMAGE=${IMG_DIR}/u-boot.bin

IMG_TAR=images.tar.gz
DEBUG_TAR=debug.tar.gz
IMG_MD5=images.md5

rm -f ${IMG_TAR} ${DEBUG_TAR} ${IMG_MD5}

mkdir -p ${DEBUG_DIR}
cp -a ${KERNEL_DIR}/vmlinux ${KERNEL_DIR}/System.map ${ROOTFS_CPIO} ${DEBUG_DIR}/

tar -czf ${IMG_TAR} ${KERNEL_IMAGE} ${SPL_IMAGE} ${UBOOT_IMAGE}
tar -czf ${DEBUG_TAR} -C ${IMG_DIR} debug/

md5sum ${IMG_TAR} > ${IMG_MD5}

三、编译性能

需要安装:

sudo apt-get install python-matplotlib python-numpy

使用命令make help

Documentation:
  manual                 - build manual in all formats
  manual-html            - build manual in HTML
  manual-split-html      - build manual in split HTML
  manual-pdf             - build manual in PDF
  manual-text            - build manual in text
  manual-epub            - build manual in ePub
  graph-build            - generate graphs of the build times
  graph-depends          - generate graph of the dependency tree
  graph-size             - generate stats of the filesystem size
  list-defconfigs        - list all defconfigs (pre-configured minimal systems)

还可以使用的命令:

  • make graph-build
  • make graph-depends
  • make graph-size
Documentation:
  manual                 - build manual in all formats
  manual-html            - build manual in HTML
  manual-split-html      - build manual in split HTML
  manual-pdf             - build manual in PDF
  manual-text            - build manual in text
  manual-epub            - build manual in ePub
  graph-build            - generate graphs of the build times
  graph-depends          - generate graph of the dependency tree
  graph-size             - generate stats of the filesystem size
  list-defconfigs        - list all defconfigs (pre-configured minimal systems)

3.1 编译耗时

使用命令:make graph-build
RV1126在SDK根目录执行make graph-build会生成如下文件:

liefyuan@ubuntu:~/rv1126/rp_rv1126_sdk$ make graph-build
umask 0022 && make -C /home/liefyuan/rv1126/rp_rv1126_sdk/buildroot O=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate graph-build
./support/scripts/graph-build-time --type=histogram --order=name --input=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/build/build-time.log --output=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/build.hist-name.pdf 
./support/scripts/graph-build-time --type=histogram --order=build --input=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/build/build-time.log --output=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/build.hist-build.pdf 
./support/scripts/graph-build-time --type=histogram --order=duration --input=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/build/build-time.log --output=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/build.hist-duration.pdf 
./support/scripts/graph-build-time --type=pie-packages --input=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/build/build-time.log --output=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/build.pie-packages.pdf 
./support/scripts/graph-build-time --type=pie-steps --input=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/build/build-time.log --output=/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/build.pie-steps.pdf 

生成的文件目录在:

/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/

在这里插入图片描述
其中比较有参考意义的文件是build.hist-duration.pdf文件,按照耗时从大到小排列。

通过此图可以明白整个编译流程时间都耗在哪里,针对性进行分析优化,有利于提高编译效率。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.2 编译依赖关系

命令:make graph-depends
这需要安装graphviz

sudo apt-get install graphviz

生成的文件地址还是在:

/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/

graph-depends.pdf
在这里插入图片描述比较复杂!

3.3 编译结果尺寸分析

命令:make graph-size
生成的文件地址还是在:

/home/liefyuan/rv1126/rp_rv1126_sdk/buildroot/output/rockchip_rv1126_rv1109_facial_gate/graphs/

graph-size.pdf
在这里插入图片描述
另外更有参考意义的是file-size-stats.csv和package-size-stats.csv文件

3.4 其他文件

file-size-stats.csv文件的部分内容:

在这里插入图片描述
package-size-stats.csv文件的部分内容:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二届SWCTF部分WP

1、misc (1)Misc1 下载附件,压缩包里面有两张jpg图片 解压后习惯性的放进kali里面分析一下,没有隐藏文件 放到Stegsolve里分析,因为是两张一样的图片,combiner也没啥发现 分别对两张图片单独分析也没有发…

网卡,dma,内存关系

本篇主要讲网卡的工作原理 最近在做一个网卡仿真程序。主要目的是用程序代替网卡去向内存中填充报文。 网卡与内存的交互方式 1. rx阶段 网卡通过DMA向内存中发送数据包。 在内存中主要有三个数据结构 ① DMA环(rx_ring), 其中存储了DMA描述符, DMA描述符指向了实际物理地址…

【Python | 基础语法篇】01、字面量、注释、变量、数据类型及转换

目录 一、字面量 1.1 什么是字面量 1.2 常用的值类型 1.3 字符串 1.4 如何在代码中写它们 1.5 总结 二、注释 2.1 注释的作用 2.2 注释的分类 2.3 注释实战 2.4 总结 2.5 思考 三、变量 3.1 什么是变量 3.2 案例——模拟钱包 3.3 变量的特征 3.4 思考 3.5 …

一篇文章看懂MySQL的多表连接(包含左/右/全外连接)

MySQL的多表查询 这是第二次学习多表查询,关于左右连接还是不是很熟悉,因此重新看一下。小目标:一篇文章看懂多表查询!! 这篇博客是跟着宋红康老师学习的,点击此处查看视频,关于数据库我放在了…

主动式电容笔是什么?苹果平替电容笔性价比高的推荐

苹果Pencil在市场上有需求吗?苹果的原装电容笔,虽然功能强大,但价格却非常的昂贵。当然,你也可以用这个苹果Pencil,不过,如果你不想花大价钱买它,就可以选一支平替的电容笔。就当前的科技水平而…

黑客利用WordPress 插件暗中建立后门网站

东方联盟网络安全组织在上周发布的一份报告中透露,有人观察到威胁行为者利用一个合法但过时的 WordPress 插件暗中建立后门网站,作为正在进行的活动的一部分。 有问题的插件是 Eval PHP,由名为 flashpixx 的开发人员发布。它允许用户插入 PH…

从需求分析到上线发布,一步步带你开发收废品小程序

在如今的环保和可持续性的大趋势下,废品回收已经成为了人们日常生活中不可或缺的一部分。收废品小程序的开发可以帮助人们更方便地找到回收废品的地点,并有效减少废品对环境造成的污染。因此,我们的收废品小程序需要满足以下需求:…

Google Play编写长描述的最佳实践

在我们为应用编写详细说明时,要遵循以下建议: 我们作为应用营销人员,要了解受众群体的需求和顾虑,如果不知道用户关心什么,那么我们可以查看关键词的搜索量、每个关键词的 Google Play 安装报告、当前关键字排名等等。…

数据湖Iceberg-Hive集成Iceberg(3)

文章目录 Hive集成Iceberg环境准备Hive与Iceberg的版本对应关系如下上传jar包,拷贝到Hive的auxlib目录中修改hive-site.xml,添加配置项启动 HMS 服务启动 Hadoop 创建和管理 Catalog默认使用 HiveCatalog指定 Catalog 类型使用 HiveCatalog使用 HadoopCa…

HTML+CSS+JS 学习笔记(三)———Javascript(下)

🌱博客主页:大寄一场. 🌱系列专栏:前端 🌱往期回顾:HTMLCSSJS 学习笔记(三)———Javascript(上) 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 JavaScrip…

【ChatGPT】如何让 ChatGPT 不再频繁报错,获取更加稳定的体验?

文章目录 一、问题描述二、方案1:使用 OpenAI API Key 来访问 ChatGPT三、方案2:安装 Chrome 插件3.1 介绍3.2 安装步骤3.2.1 插件 & 脚本安装3.2.2 解读功能 一、问题描述 最近一段时间,相信大家都发现了 ChatGPT 一个问题,…

阿里二面:Spring用到了哪些设计模式?

代理模式 所谓代理,是指它与被代理对象实现了相同的接口,客户端必须通过代理才能与被代理的目标类进行交互,而代理一般在交互的过程中(交互前后),进行某些特定的处理,比如在调用这个方法前做前…

计算机网络|第二章:应用层

分层体系结构回顾 在本章中,我们学习有关网络应用的原理和实现方面的知识。 我们从定义关键的应用层概念开始,其中包括应用程序所需要的网络服务、客户和服务器、进程和运输层接口。详细考察几种网络应用程序,包括Web、电子邮件、DNS、对等文…

工业一体机在CNC机台起到什么作用?

随着工业自动化的不断发展,CNC机床已经成为现代制造业的重要设备之一。而工业一体机在CNC机台则是CNC机床的一种新型形态,其具有全封闭式设计、高精度、高效率等特点,广泛应用于各种制造行业。 全封闭工业一体机 一、工业一体机的功能&#x…

部门来了个软件测试工程师,听说是00后,上来一顿操作给我看呆了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍!给公司省了…

ArcGIS中加载在线地图系列:风格12

前言: ArcGIS作为最强大的地理数据处理、编辑、制图和地图服务发布、管理等的GIS平台,在不同的专业都可以看到它的身影。对于那些利用GIS信息进行编辑,设计的专业人士来说,其桌面端ArcMap备受欢迎。尤其是在可视化制图方面需求颇…

C++入门(C++)

目录 命名空间 1、命名空间的定义 2、命名空间的使用 1、加名空间名称和作用域限定符 2、使用using namespace 命名空间引入 3、使用using将命名空间中某个成员引入 C的输入与输出 缺省参数 1、缺省参数的概念 2、缺省参数分类 1、全缺省参数 2、半缺省参数 函数重载 1、函数重…

【数据库】索引和事务

目录 1.索引 1.1关于索引 索引是什么? 为什么要有索引? 索引的作用? 索引的优点和缺点? 1.2索引类型及创建 索引的分类 创建索引 1.3索引的数据结构 1.4索引覆盖 2.事务 2.1关于事务 概念 事务的使用 2.2事务的特…

智慧旅游丨“服务+获客”新模式

全面放开的第一个五一小长假即将来临,旅游企业、城市、景点等又将进入流量及经济“升级密码”阶段。目前,传统旅行社在客户服务、运营模式中仍存在诸多痛点: 全面放开后“假期出游潮”日益高涨,佳信针对这些“痛点”问题&#xff…

问题排查记录-ffmpeg链接libavfilter和libavcodec:未定义的引用

目录 一、问题背景 二、问题现象 2.1 ffmpeg测试例程 2.2 编译脚本 2.3 错误提示 三、问题排查 3.1 关于提示找不到“stdio" "iostream"头文件的问题 3.1.1查看工具链头文件检索位置 3.1.2 根据工具链路径查找头文件 3.1.3 在编译脚本中指定头文件路径…