1、 开发环境:ubuntu 18.04 buildroot-2020.02.7.tar
Buildroot 是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。
## 2、下载buildroot
直接从官网下载最新的源码包:http://buildroot.net/downloads/
3、安装依赖库、软件包
(http://buildroot.net/downloads/manual/manual.html#requirement-mandatory)
which
sed
make (version 3.81 or any later)
binutils
build-essential (only for Debian based systems)
gcc (version 4.8 or any later)
g++ (version 4.8 or any later)
bash
patch
gzip
bzip2
perl (version 5.8.7 or any later)
tar
cpio
unzip
rsync
file (must be in /usr/bin/file)
bc
Source fetching tools:
wget
python
ncurses5
4、解压buildroot压缩包
5、 进入源码目录,ls configs/
挑选一个与你板子最相近的配置
6、make stm32mp157c_dk2_defconfig
7、make menuconfig配置
Target Architecture —> 用于选择目标的架构,这里自动选择ARM (little endian)
arget Architecture Variant —> 内核类型(cortex-A7)
Target ABI (如图) —> 目标使用的应用程序二进制接口,其中有两个选择
Build options —> 主要是一些编译时用到的选项,比如dl的路径,下载代码包使用的路径,同时运行多个编译的上限,是否使能编译器缓冲区等等,这里按照默认就行了.
工具链选项
系统的一些配置,基本不需要修改,默认即可
需不需要让他生成内核(注意:这地方生成的是zImage,zImage和uImage区别,请看附件一)
按自己需求增加或裁剪Target packages,里面包含了一大堆第三方的开源工具和库,包括常用的busybox的选用、音频、网络等。一切都是按自己需求来配置。
在许多程序中,BusyBox具有基本init程序的实现,这对于大多数嵌入式系统来说已经足够了。启用BR2_INIT_BUSYBOX将确保BusyBox将构建和安装其init程序。这是Buildroot中的默认解决方案。BusyBox init程序将/etc/inittab在启动时读取文件以了解如何操作。
Filesystem images —> 默认
Bootloaders —> u-boot
Host utilities —> 默认
Legacy config options 默认
6、保存退出,生成.config 文件
7、编译
make
使用make命令之后会执行下面几个步骤:
①下载源文件(所要求的)
②配置,编译和安装cross-compiling toolchain(如果使用内部工具链),或者输出一个toolchain(如果一个外部工具链使用)
③构建/安装杯选择的目标包
④构建内核镜像(如果有选择)
⑤构建启动代码镜像(如果有选择)
⑥创建根文件系统(如果有选择)
8、输出文件介绍
输出文件全部在output/目录下:
images/ — 存放编译后产生的所有镜像文件( 内核镜像 , 加载引导镜像 和 根文件系统镜像)
build/ — 存放所有的组件除了构建交叉编译工具链的组件 , 在这个目录里面每一个功能对应一个子目录存放他们各自的组件.
staging/ — 包含一个类似于根文件系统等级层次的层级 . 这个目录包含了 安装的交叉编译工具链 和 所有被选择用于目标板的所有用户空间包.
target/ — 包含了根文件系统,但不能用于你的开发板的
host/ — 包含了我们需要的交叉编译工具集
9、修改环境变量
vi ~/.bashrc (sudo)
export PATH=$PATH:/home/wu/tool_buildroot/buildroot-2020.02.7/output/host/usr/bin
source .bashrc
10、测试
终端直接 打 arm-
然后按两下Tab键,能自动补齐
或者是
arm-linux-gcc -v
出现,说明成功
完结:
注意,buildroot编译效率很低,一次编译完成后,如果你想修改某些东西,则必须重新全部编译!!也即先make clean 再 make。
附件一:区别
内核EIF文件;嵌入式系统部署时烧录的一般不是这个vmlinuz/vmlinux,而是要用 objcopy 工具去制作成烧录镜像格式,经过制作加工成烧录镜像的文件就叫 Image (这个制作烧录镜像主要目的就是缩减大小,节省磁盘)。原则上Image就可以直接被烧录到Flash上进行启动执行(类似于u-boot.bin),但是实际上并不是这么简单。实际上linux的作者们觉得Image还是太大了所以对Image进行了压缩,并且在image压缩后的文件的前端附加了一部分解压缩代码,构成了一个压缩格式的镜像就叫 zImage。
uboot为了启动linux内核,还发明了一种内核格式叫 uImage 。 uImage 是由 zImage 加工得到的, uboot 中有一个工具,可以将 zImage 加工生成uImage。注意:uImage不关linux内核的事,linux内核只管生成zImage即可,然后uboot中的mkimage工具再去由zImage加工生成uImage来给uboot启动。这个加工过程其实就是在zImage前面加上64字节的uImage的头信息即可。
如果直接在kernel底下去make uImage会提示mkimage command not found。解决方案是去uboot/tools目录下执行cp mkimage /usr/local/bin/,复制mkimage工具到系统目录下。再去make uImage即可。
附:
修改uboot的基本思路:
因为官方目前基本都是SD卡或者eMMC。所以,如果存储设备有SD卡。可以先用SD卡,修改下内存和串口参数,让板子先运行起来。跑起来再去添加网络功能。网络功能添加后,再根据需求,是否在uboot中添加显示驱动。基本就这几个了,其余的功能uboot也不太需要。