学习解析嵌入式Linux开发(基于phytiumpi)(一)(工具链,bootloader,devicetree)
解析(一),工具链 bootloader
嵌入式linux(基于飞腾派)
首先看一下phytiumpi OS 的目录结构
ren@phytiumpi:/$ ls
bin boot data dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var
一. 工具链
1.1 GNU(自由软件操作系统)操作组件
1.binutils:汇编器、链接器
2.GCC(GNU Compiler Collection):GNU编译器集合
可编译语言都使用一个生成汇编的通用后端,然后反馈到GNU编译器
3.c库:基于POSIX标准的应用程序编程接口(API)
1.2 工具链类型
1.跨平台工具链(交叉工具链):用于编译目标系统的工具链
2.原生工具链(本机工具链):用于编译主机系统的工具链
几乎所有linux开发都使用交叉工具链完成
1.2 cpu架构
命令:查看构建工具链的元组
$ gcc -dumpmachine
1.3 C库
application(应用程序)->C library(c库)->linux kernel(linux内核)
二.工具链剖析
工具链一般位于usr/bin/目录下
了解配置信息
$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
具体配置信息
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/12/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 12.2.0-14' --with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-12 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Debian 12.2.0-14)
2.1 sysroot
sysroot:指定交叉工具链的根目录
***@phytiumpi:/usr/aarch64-linux-gnu$ ls
include lib
include:所有库的头文件目录
lib:包含c库和动态链接器/加载器的库文件
2.2 c库的组件
1.libc:C语言标准库
2.libm:C语言数学库
3.libpthread:线程库
4.librt:实时拓展库
…
2.3 库代码链接方式
1.静态链接:将库代码链接到可执行文件中
2.动态链接:将库代码链接到可执行文件中,但是不将库代码复制到可执行文件
静态链接:可执行文件较大,但是运行速度较快
动态链接:可执行文件较小,但是运行速度较慢
2.4 交叉编译的构建系统
1.纯makefile:工具链通常由make变量CROSS_COMPILE控制
2.autotools:一组在许多开源项目中用作构建系统的工具(configure,makefile)
3.cmake构建系统
cmake关键术语
1.target:可执行文件、库文件、测试、安装包
2.properties:包括构建目标所需的源文件,编译器选项,链接库等
3.package:cmake构建系统可以生成各种类型的安装包,如deb、rpm、zip、tarball等
三.bootloader(引导加载程序)
负责启动系统和加载操作系统内核
3.1 引导顺序
3.1.1 ROM代码
复位或上电后立刻运行的代码必须存储在ROM中
ROM代码阶段结束后,SPL(辅助程序加载器)和ROM code会进入RAM中
3.1.2 SPL
SPL将TPL(第三级程序加载器)加载到DRAM中
3.1.3 TPL
TPL加载kernel image(可选加载FDT和initramfs)到DRAM中
内核运行后,bootloader会从内存中消失,内核接管系统
3.2 设备树
设备树是一种描述硬件设备的文件格式,用于描述硬件设备的属性和连接关系
设备树文件通常以.dts或.dtsi为后缀
设备树文件通常存储在/devicetree/目录下
实际操作(以飞腾派为例):
查看完整设备树结构,将/proc/device-tree/反编译为dts文件
$ sudo dtc -I fs /proc/device-tree -o current.dts
dtc:设备树编译器
以下为部分内容:
/dts-v1/;
/ {
#address-cells = <0x02>;
model = "Phytium Pi Board";
#size-cells = <0x02>;
interrupt-parent = <0x01>;
compatible = "phytium,pe2204";
interrupt-controller@30800000 {
#address-cells = <0x02>;
interrupts = <0x01 0x09 0x08>;
#size-cells = <0x02>;
compatible = "arm,gic-v3";
ranges;
#interrupt-cells = <0x03>;
reg = <0x00 0x30800000 0x00 0x20000 0x00 0x30880000 0x00 0x80000 0x00 0x30840000 0x00 0x10000 0x00 0x30850000 0x00 0x10000 0x00 0x30860000 0x00 0x10000>;
phandle = <0x01>;
interrupt-controller;
gic-its@30820000 {
msi-controller;
compatible = "arm,gic-v3-its";
reg = <0x00 0x30820000 0x00 0x20000>;
phandle = <0x10>;
};
};
memory@0 {
device_type = "memory";
reg = <0x00 0x80000000 0x00 0x7b000000>;
};
memory@01 {
device_type = "memory";
reg = <0x20 0x00 0x01 0x80000000>;
numa-node-id = <0x00>;
};
#address-cells/#size-cells:定义子节点 reg 属性的地址和长度格式
reg:寄存器地址和大小,格式为 <地址高位 地址低位 大小高位 大小低位>
phandle:节点引用标识,用于其他节点引用(如 interrupt-parent = <0x01>)
device_type:设备类型,如 memory 表示内存
numa-node-id:节点所在的 NUMA 节点编号(如果支持)
compatible:设备兼容性标识,用于匹配驱动程序
interrupts:中断号和属性,格式为 <中断号 中断属性>
…
编译设备树的命令
$ dtc current.dts -o current.dtb
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)